我有一个应用程序,其中通过虚拟COM端口与连接的USB设备进行串行I / O。当检测到设备意外拆除时,停止串行I / O的最佳方法是什么。我应该简单地关闭端口吗?或者,是否应该有一个全局变量维护该变量以指示设备的存在,在尝试发送/接收数据之前应在每个串行I / O功能中检查该变量?还是应该将两者结合起来?谢谢。

最佳答案

我假设您正在运行Windows。
这取决于您如何设计通信流程。

我有一个BasePort对象,在其中派生了COMPort对象(和许多其他通信对象)。 COMPort对象创建一个TXThread和RXThread类。这些线程正在等待“ OVERLAP”,以信号表示读或写操作已用WaitForMultipleObjects()完成。

如果无事可做,TXThreads将进入睡眠状态,并通过TXWrite函数唤醒(主进程和线程之间的数据通过trhead安全FIFO缓冲区)。

在这种情况下,他们还需要等待端口已关闭的事件信号,因此他们实际上可以取消任何挂起的操作并退出(踏板退出并被删除)。

要检测USB端口是否已连接/断开连接,我收听Windows消息DEVICE_CHANGE。如果端口断开连接,则在端口类删除并关闭端口之前,我将设置事件并等待线程退出。

我发现这种方法非常可靠和安全。这是我在8年前设计的并且仍然有效的通信平台的核心。

08-16 13:20