串口 WaitCommEvent

来源:互联网 发布:常州逍遥子seo 编辑:程序博客网 时间:2024/04/29 13:27

文章转载自:http://blog.sina.com.cn/s/blog_494305f30100iao6.html


串口开发中使用WaitCommEvent


WaitCommEvent

  作用:
  为一个特指的通信设备等待一个事件发生,该函数所监控的事件是与该设备句柄相关联的一系列事件。
  原型:
  BOOL WINAPI WaitCommEvent(
  __in          HANDLE hFile,
  __out         LPDWORD lpEvtMask,
  __in          LPOVERLAPPED lpOverlapped
  );
  参数:
  hFile:指向通信设备的一个句柄,该句柄应该是由 CreateFile函数返回的。
  lpEvtMask:一个指向DWORD的指针。如果发生错误,pEvtMask指向0,否则指向以下的某一事件
  Value Meaning
EV_BREAK
  0x0040 A break was detected on input.(在输入过程中发生中断)
EV_CTS
  0x0008 The CTS (clear-to-send) signal changed state.(CTS线上的信号改变状态)
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's DCB structure, which is applied to a serial port by using the SetCommState function.
EV_TXEMPTY
  0x0004 The last character in the output buffer was sent.(输出缓冲区的数据全部发送出去)


  lpOverlapped :指向OVERLAPPED结构体的一个指针。如果hFile是用异步方式打开的(在CreateFile()函数中,第三个参数设置为FILE_FLAG_OVERLAPPED),lpOverlapped 不能指向一个空OVERLAPPED结构体,而是与Readfile()和WreteFile()中的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。


原创粉丝点击