我有一个应用程序,其中通过虚拟COM端口与附加的USB设备进行串行I / O.当检测到意外删除设备时,停止串行I / O的最佳方法是什么。我应该简单地关闭端口吗?或者,是否应该存在一个全局变量,该变量被保持以指示设备的存在,在尝试发送/接收数据之前应该在每个串行I / O功能中进行检查?或者,它应该是两者的组合,还是其他什么?感谢。
答案 0 :(得分:1)
我假设您正在运行Windows。 这取决于您如何设计通信流程。
我有一个BasePort对象,我在其中派生了一个COMPort对象(以及许多其他通信对象)。 COMPort对象创建一个TXThread和RXThread类。这些线程正在等待“OVERLAP”以表示读取或写入操作已完成WaitForMultipleObjects()
。
如果无事可做,TXThreads进入休眠状态并被TXWrite函数唤醒(主进程和线程之间的数据通过trhead安全FIFO缓冲区)。
在这种情况下,他们还需要等待端口关闭的事件信号,因此他们实际上可以取消任何待处理的操作并退出(踏板退出并被删除)。
要检测USB端口是否已连接/断开,我会收听Windows消息DEVICE_CHANGE
。如果端口断开连接,我设置事件并等待线程退出,然后Port类删除并关闭端口。
我发现这种方法非常可靠和安全。它是我在8年前设计的交流平台的核心,并且还在继续踢。