作用:为一个特指的通信设备等待一个事件发生,该函数所监控的事件是与该设备句柄相关联的一系列事件。
原型:
BOOL WINAPI WaitCommEvent(
__in HANDLEhFile,
__out LPDWORDlpEvtMask,
__in LPOVERLAPPEDlpOverlapped
);
hFile:指向通信设备的一个句柄,该句柄应该是由 CreateFile函数返回的。
lpEvtMask:一个指向DWORD的指针。如果发生错误,pEvtMask指向0,否则指向以下的某一事件
EV_DSR 0x0010 | The DSR (data-set-ready) signal changed state. DSR(数据装置就绪)信号改变状态。 |
EV_ERR 0x0080 | A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY. |
EV_RING 0x0100 | A ring indicator was detected. |
EV_RLSD 0x0020 | The RLSD (receive-line-signal-detect) signal changed state. |
EV_RXCHAR 0x0001 | A character was received and placed in the input buffer.(在输入缓冲区中接收并放置一个字符) |
EV_RXFLAG 0x0002 | The event character was received and placed in the input buffer. The event character is specified in the device'sDCBstructure, which is applied to a serial port by using theSetCommStatefunction. |
EV_TXEMPTY 0x0004 | The last character in the output buffer was sent.(输出缓冲区的数据全部发送出去) |
lpOverlapped:指向OVERLAPPED结构体的一个指针。如果hFile是用异步方式打开的(在CreateFile()函数中,第三个参数设置为FILE_FLAG_OVERLAPPED),lpOverlapped不能指向一个空OVERLAPPED结构体,而是与Readfile()和WriteFile()中的OVERLAPPED参数为同一个参数。如果hFile是用异步方式打开的,而lpOverlapped指向一个空的OVERLAPPED结构体,那么函数会错误地报告,等待的操作已经完成(而此时等待的操作可能还没有完成)。
如果hFile是用异步方式打开的,而lpOverlapped指向一个非空的OVERLAPPED结构体,那么函数WaitCommEvent被默认为异步操作,马上返回。这时,OVERLAPPED结构体必须包含一个由CreateEvent()函数返回的手动重置事件对象的句柄hEven。
如果hFile是用同步方式打开的,那么函数WaitCommEvent不会返回,直到要等待的事件发生。
返回值:
如果函数成功,返回非零值,否则返回0。要得到错误信息,可以调用GetLastError函数。
备注:
WaitCommEvent函数为指定的通信资源监听一系列的Event,这些Event可以由SetcommMask和GetcommMask函数来设置和查询。
如果异步操作不能马上完成,那么该函数会返回一个FALSE,同时GetLastError函数可以截获错误码ERROR_IO_PENDING(#define ERROR_IO_PENDING 997),表示操作转到后台运行。在WaitCommEvent函数返回之前,系统将OVERLAPPED结构中的hEven句柄设置为无信号状态;当WaitCommEvent函数所等待的任何一个Event发生后,系统将OVERLAPPED结构中的hEven句柄设置为有信号状态,同时将所发生事件赋给lpEvtMask。
父进程可以根据lpEvtMask来做出相应的事件处理,然后也可以调用GetOverlappedResult函数来判断WaitCommEvent的操作是否成功。
如果WaitCommEvent函数在后台运行的时候,进程企图想通过SetcommMask函数来改变当前设备的Event,那么WaitCommEvent函数马上返回,lpEvtMask指向0。