2012-02-13 189 views
1

我正在读取蓝牙COM端口,从微控制器获取数据。 初始化端口后,我用这来读取端口:检测COM端口是否已关闭

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

这工作得很好,但如果我关闭COM端口,程序将在这个循环永远等待,而不检测的事实,COM端口不见了(我有其他的if(),我在那里检查错误)。

如何检查并确认它是否仍然打开?

+1

IIRC,请确保使用[SetCommTimeOuts]设置超时(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437(v = vs.85).aspx) – JimR 2012-02-13 10:19:34

+0

没有,在5秒.. – Radu 2012-02-13 10:24:17

+1

那么,这是马虎。模拟COM端口的驱动程序通常很脆弱。你可以通过使用第三个参数来部分地解决它,允许你使用WaitForMultipleObjects(),这样你也可以用事件来中断等待。但随后重新开放该港口可能非常危险。最好先查找驱动程序更新。 – 2012-02-13 11:20:19

回答

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到串行适配器。

+0

实际上,我在WaitCommEvent()中使用ReadFile(),并且在ReadFile()上也有错误检查,并且没有检测到错误:/ – Radu 2012-02-13 19:32:54

+0

我试过ReadFile )没有WaitCommEvent(),仍然没有变化:/它永远等待... – Radu 2012-02-13 19:56:56

+0

好吧,实际上它工作,ReadFile()本身将返回一段时间后,如果没有读取。谢谢! – Radu 2012-02-14 00:49:24