取消重叠串行I/O的WaitCommEvent



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

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的范围

您所拥有的代码是正确的,并且得到了文档的完全支持,文档中明确表示:

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

我在"真实"串行端口和USB虚拟串行端口仿真中都使用过这一事实,而且它工作可靠。

(在我的特定情况下,我正在监视EV_TXEMPTY,以便确保线路上某些传输之间的最小间隔

相关内容

  • 没有找到相关文章

最新更新