检测COM端口是否已关闭

时间:2012-02-13 10:04:45

标签: c winapi serial-port

我正在阅读蓝牙COM端口,从微控制器获取数据。 初始化端口后,我使用它来读取端口:

while(1)
if(WaitCommEvent(com_hnd, &dwEventMask, NULL))

这样可以正常工作,但如果我关闭COM端口,程序将在此循环中永远等待,而不会检测到COM端口消失的事实(我有一个其他的if if(),我检查错误)。

如何查看是否仍然打开?

1 个答案:

答案 0 :(得分:2)

正如评论中已经建议的那样,您可能需要一些外部方法来停止等待,就像事件+ WaitForMultipleObjects()一样。您还可以等待从CreateFile获得的实际COM端口句柄。

你真的需要使用WaitCommEvent吗?据我所知,如果您使用握手信号和其他此类奇怪的东西,您应该只需要该功能。如果您只对数据感兴趣,可以使用ReadFile。根据我的经验,这个功能更可靠。

我使用过类似的COM端口设备,并且发现它们已断开连接的最强大的方法似乎是检查ReadFile的结果:

BOOL result;

result = ReadFile(...);

if(result == FALSE)
{
  DWORD last_error = GetLastError();
  if(last_error == ERROR_OPERATION_ABORTED)  // disconnected ?
  {
    close();                                 // close the port
  }
}

我当然不确定这是否适用于您的具体情况,但我在一些生产代码中使用此方法,最终导致多个糟糕的USB转串口适配器。