0

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

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声明变量的范围?

4

1 回答 1

1

您拥有的代码是正确的,并且得到了文档的完全支持,其中清楚地说明了:

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

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

(在我的特殊情况下,我一直在关注,EV_TXEMPTY以便我可以保证电线上某些传输之间的最小间隔)

于 2014-10-10T12:43:46.120 回答