我正在读取蓝牙COM端口,从微控制器获取数据。 初始化端口后,我用这来读取端口:检测COM端口是否已关闭
while(1)
if(WaitCommEvent(com_hnd, &dwEventMask, NULL))
这工作得很好,但如果我关闭COM端口,程序将在这个循环永远等待,而不检测的事实,COM端口不见了(我有其他的if(),我在那里检查错误)。
如何检查并确认它是否仍然打开?
我正在读取蓝牙COM端口,从微控制器获取数据。 初始化端口后,我用这来读取端口:检测COM端口是否已关闭
while(1)
if(WaitCommEvent(com_hnd, &dwEventMask, NULL))
这工作得很好,但如果我关闭COM端口,程序将在这个循环永远等待,而不检测的事实,COM端口不见了(我有其他的if(),我在那里检查错误)。
如何检查并确认它是否仍然打开?
正如评论中所提到的,您可能需要一些外部方法来停止等待,如事件+ 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到串行适配器。
IIRC,请确保使用[SetCommTimeOuts]设置超时(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437(v = vs.85).aspx) – JimR 2012-02-13 10:19:34
没有,在5秒.. – Radu 2012-02-13 10:24:17
那么,这是马虎。模拟COM端口的驱动程序通常很脆弱。你可以通过使用第三个参数来部分地解决它,允许你使用WaitForMultipleObjects(),这样你也可以用事件来中断等待。但随后重新开放该港口可能非常危险。最好先查找驱动程序更新。 – 2012-02-13 11:20:19