繁体   English   中英

GetQueuedCompletionStatus停止读取串行端口

[英]GetQueuedCompletionStatus stops reading a serial port

我有一台通过串行端口生成消息的设备。 重新引导设备时,IO完成端口将停止读取字节。

该代码称为GetQueuedCompletionStatus():

BOOL bRet = GetQueuedCompletionStatus(
        m_hCompletionPort, 
        &dwBytesTransferred, 
        &dwCompletionKey, 
        &pOverlapped, 
        INFINITE);

PortMon看起来像:

...
IRP_MJ_WRITE    Serial1    SUCCESS     LENGTH: 7    REBOOT.
IRP_MJ_READ     Serial1    CANCELLED   LENGTH: 1    

记录显示以下结果:

bRet=true, dwBytesTransferred=7, pOverlapped=0x0202B028, GetLastError()=997
(sleep forever)

有什么方法可以检测到此故障并重新建立通信?

我可以监视热跳并关闭/重新打开串行端口,但是Windows API允许串行通信像这样静默掉线似乎并不正确。

如果在打开的串行端口的句柄上执行WaitForSingleObject以开始读取数据,则在重新启动设备时是否会发出该句柄的信号? 也许这是一种告诉您何时需要再次打开端口的方法?

IO完成端口当然可以毫无问题地处理这种情况。 您无需关闭然后重新打开设备。

在这种情况下,最可能出现的问题是您在线上有一个错误(由设备重置引起),尚未使用ClearCommError()清除。

您需要针对您的设备适当地使用SetCommState()和SetCommTimeouts()。 在传递给SetCommState()的DCB中,需要设置fAbortOnError。 如果确实使错误出队,则需要先调用ClearCommError(),然后再使另一条读入队列。

回复:詹姆(抱歉,我似乎无法在您的回答中添加评论)

我确实尝试设置了各种标志,包括DCB的fAbortOnError,但GetQueuedCompletionStatus()仍将无限期等待。 我还尝试定期使呼叫超时,并检查串行端口是否有错误。 串行端口始终看起来不错,但断开连接仍将永久破坏IO完成端口。 重新启动设备可能会创建一个短暂的错误状态...我说是可能的,因为我从未能够检测到它!

一位开发人员也对此问题有所了解,他们也失败了。 因此,我们只重写了代码以使用重叠的串行端口读取,现在工作正常。

在某些地方,我们可能遗漏了一些东西……最后,我们花费了更多的时间来解决这个谜团,而不是重写代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM