取消WaitCommEvent以获得重叠的串行I / O.

时间:2014-09-22 11:46:41

标签: windows serial-port modem handshake overlapped-io

我通过串口以重叠方式处理非标准调制解调器。除了读取和写入电信线路,我还必须使用WaitCommEvent()功能检查控制线,如 CTS DSR

DWORD EvtMask;
/// (some scopes/levels ommitted)

const BOOL syncChange = WaitComEvent(hFile, &EvtMask, &overlapped);
if (!syncChange) {
    assert(GetLastError() == ERROR_IO_PENDING);
    /// *background activity* probably writing into EvtMask
    /// until overlapped.hEvent gets signalled
}

在(几乎所有)情况下,函数调用指示*background activity*,我必须等待overlapped.hEvent发生。由于我还在等待来自其他来源的事件(例如由用户输入,程序终止引起的IPC),我使用WaitForMuiltipleObjects()函数。但是,如果阻止等待因控制线更改之外的其他原因而结束,我该如何停止EvtMask上的后台活动?我基于的代码目前使用的是SetCommMask(hFile, 0),但我找不到可靠的参考资料。

我还观察到控制线的更改未得到正确支持的情况(驱动程序?,VM?),所以我必须进行切片等待并进行中间检查。

必须采取哪些措施才能安全地离开宣布变量EvtMask的范围?

1 个答案:

答案 0 :(得分:1)

您拥有的代码是正确的,并得到the documentation的完全支持,其中明确指出:

  

如果进程在重叠的SetCommMask操作正在进行时尝试使用WaitCommEvent函数更改设备句柄的事件掩码,则WaitCommEvent会立即返回。

我在“真正的”串行端口和USB虚拟串口仿真上都使用了这个事实,并且它可以正常工作。

(在我的特定情况下,我正在关注EV_TXEMPTY以便我可以保证线路上某些传输之间的最小间隔