网页:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363479(v=vs.85).aspx

函数作用:
一个特定的通信设备等待事件发生。
该函数监视的事件的集合 is contained in the event mask associated with the device handle.

BOOL WINAPI WaitCommEvent(_In_  HANDLE       hFile,_Out_ LPDWORD      lpEvtMask,_In_  LPOVERLAPPED lpOverlapped
);

参数:

hFile [in]

通信设备的句柄,使用 CreateFile 函数 返回的这个句柄.

lpEvtMask [out]

是一个指针变量
该变量表示发送的事件的类型。
如果有错误发生,这个值是0
否则是下面的值中的一个

Value Meaning
EV_BREAK 0x0040 输入线上检测到break
EV_CTS 0x0008 The CTS (clear-to-send) 信号管脚改变状态
EV_DSR 0x0010 The DSR (data-set-ready) 信号管脚改变状态
EV_ERR 0x0080 线路状态错误. 线路状态错误 包括 CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
EV_RING 0x0100 振铃指示被检测到
EV_RLSD 0x0020 The RLSD (receive-line-signal-detect) signal changed state.
EV_RXCHAR 0x0001 接收到一个字节 并且放置到输入缓冲区
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 发送缓冲区中的最后一个字符被发送出去了

lpOverlapped [in]

指向OVERLAPPED 结构体的指针
如果hFile 是用FILE_FLAG_OVERLAPPED标志打开的,这个结构体是必须的。
如果hFile 是FILE_FLAG_OVERLAPPED标志打开的,lpOverlapped参数 不能是NULL
它必须指向一个有效的OVERLAPPED结构体。
如果hFile 是是FILE_FLAG_OVERLAPPED标志打开的,但是lpOverlapped 是NULL。
函数不能够正确的汇报操作是否完成,事件是否发生。

如果hFile 是FILE_FLAG_OVERLAPPED标志打开的,lpOverlapped 不是NULL。
WaitCommEvent 的表现是一个叠加操作。
在这种情况下,OVERLAPPED结构体,必须要包含一个有CreateEvent函数创建的Event Object,该Event Object 需要是手动复位的。

如果hFile 不是由FILE_FLAG_OVERLAPPED打开的,WaitCommEvent 直到指定的其中的一个事件发生,或者是一个错误发生的时候,才会返回。

Return value

函数执行成功,返回非0
函数执行失败,返回0
To get extended error information, call GetLastError.

Remarks

The WaitCommEvent 函数 监控 一个特定通信资源的event事件集合。
使用SetCommMask设置通信资源的当前event mask
使用GetCommMask查询通信资源的当前event mask

如果叠加操作不能立即完成,函数返回FALSE
GetLastError 函数返回ERROR_IO_PENDING,表示操作在系统后台执行中。

这个时候,在WaitCommEvent函数返回之前,系统设置OVERLAPPED结构体中的hEvent成员变量为没有信号状态。
当指定的events中的一个或者一个错误发生的时候,设置OVERLAPPED结构体中的hEvent成员变量的状态为有信号状态

调用进程可以使用wait函数中的一个,来检测event object的状态,然后使用GetOverlappedResult函数,来确定
WaitCommEvent操作的结果。
GetOverlappedResult报告操作是失败还是成功。
lpEvtMask 参数指向的变量,表示发生的event

如果一个叠加的WaitCommEvent操作正在运行,进程使用SetCommMask函数去改变设备句柄的event mask 。
WaitCommEvent会立即返回。
lpEvtMask 指向的变量的值为0

例子:

For an example, see Monitoring Communications Events.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363424(v=vs.85).aspx

Monitoring Communications Events

// SerialTB.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <windows.h>
#include <tchar.h>
#include <assert.h>
#include <stdio.h>void _tmain(int argc, _TCHAR* argv[])
{HANDLE hCom;OVERLAPPED o;BOOL fSuccess;DWORD dwEvtMask;BOOL bResult   = FALSE;DWORD dwBytesRead       = 0;hCom = CreateFile( TEXT("\\\\.\\COM6"),GENERIC_READ | GENERIC_WRITE,0,    // exclusive access NULL, // default security attributes OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL );if (hCom == INVALID_HANDLE_VALUE) {// Handle the error. printf("CreateFile failed with error %d.\n", GetLastError());return;}// Set the event mask. fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR|EV_RXCHAR);if (!fSuccess) {// Handle the error. printf("SetCommMask failed with error %d.\n", GetLastError());return;}// Create an event object for use by WaitCommEvent. o.hEvent = CreateEvent(NULL,   // default security attributes TRUE,   // manual-reset event FALSE,  // not signaled NULL    // no name);// Initialize the rest of the OVERLAPPED structure to zero.o.Internal = 0;o.InternalHigh = 0;o.Offset = 0;o.OffsetHigh = 0;assert(o.hEvent);if (WaitCommEvent(hCom, &dwEvtMask, &o)) {if (dwEvtMask & EV_DSR) {// To do.}if (dwEvtMask & EV_CTS) {// To do. }}else{DWORD dwRet = GetLastError();if( ERROR_IO_PENDING == dwRet){printf("I/O is pending... dwEvtMask = 0x%x\n",dwEvtMask);// To do.bResult = GetOverlappedResult(hCom,&o,&dwBytesRead,TRUE) ; // 阻塞  Blockif(bResult){printf("GetOverlappedResult Success dwEvtMask = 0x%x\r\n",dwEvtMask);}else{printf("GetOverlappedResult Fail dwEvtMask = 0x%x\r\n",dwEvtMask);}}else{ printf("Wait failed with error %d.\n", GetLastError());}}return ;
}

以上程序,使用vs2010 建立一个 win32 控制台程序。
用COM6连接 TC35 板子,然后给TC35 上电,
运行上面的程序,然后关掉TC35的电源,这个时候,在串口上会有一个电平的变动。
会接收到一个字符。

运行效果如下:

0x01表示 EV_RXCHAR

注意:SetCommMask 和 SetCommState 不一样

BOOL WINAPI SetCommMask(_In_ HANDLE hFile,_In_ DWORD  dwEvtMask
);BOOL WINAPI SetCommState(_In_ HANDLE hFile,_In_ LPDCB  lpDCB
);

win32 WaitCommEvent相关推荐

  1. 串口基础类库(WIN32)异步通信 _COM_H 源代码

    /* 串口基础类库(WIN32) ver 0.1编译器 : BC++ 5; C++ BUILDER 4, 5, 6, X; VC++ 5, 6; VC.NET; GCC;class _base_com ...

  2. Win32 串口编程(三)

    3.2 警告 使用EV_RXCHAR标志可以在每个字节到达端口时通知线程.与ReadFile配合使用,可以让程序在数据到达接收缓冲区后立即被读取:这与提交读取操作请求,然后等待数据到达是不同的.这对于 ...

  3. Win32 串口编程(一)

    翻译自:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/dnfiles/html/msdn_serial.htm 老外写的文章, ...

  4. Win32串口操作的技巧

    1.开启一个 Serial Port 利用一般开启档案的 CreatFile() 即可开启 serial port device [cpp] view plaincopy print? HANDLE  ...

  5. Win32 串口编程笔记1

    .打开和关闭串口 在Win32中,串口是作为文件处理的,使用CreateFile()函数可以打开串口,进行读写访问操作.CreateFile()返回串口句柄,可以在以后的端口操作中使用.关闭端口使用C ...

  6. COMMCONFIG进行配置的WIN32 API

    掌握串行通信API函数的用法是掌握串行通信编程技术的关键. 在Win32中,系统将串行口与文件统一了起来, 对它们的打开.读写.关闭等操作都使用相同的API函数,但是它们之间又有差别,这些差别主要体现 ...

  7. 深入浅出VC++串口编程之基于Win32 API

    1.API描述 在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与文件操作的API一致. 打开串口 Win32 中用于打开串口的API 函数为CreateFile,其原型为: H ...

  8. 深入浅出VC++串口编程--基于Win32 API

    1.API描述 在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与文件操作的API一致. 打开串口 Win32 中用于打开串口的API 函数为CreateFile,其原型为: H ...

  9. WIN32:API串口通讯实例教程

    WIN32 API串口通讯实例教程   第一节   实现串口通讯的函数及串口编程简介   API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作.常用函数及 ...

最新文章

  1. 经理人必须抛弃的十个习惯思维
  2. Shell脚本个例二
  3. Nodejs连接mysql的增、删、改、查操作
  4. 香辣弹簧:不同的自动接线方式
  5. gdp笔记本 linux,linux中如何使用微软鼠标的第4、5键
  6. windows怎么打开python_windows怎么打开Python
  7. react项目中的参数解构_一天入门React学习心得
  8. 基于Java+SpringBoot+vue+element实现家具购物销售网站详细设计和实现
  9. 查看usb控制器固件日期_三星发布两款USB Type-C电源控制器芯片 支持100W的充电功率...
  10. Linux系统NFS故障现象
  11. 克罗谈投资策略03_你所期望的赌博方式
  12. 【机房收费系统】---组合查询
  13. c++常用备忘(持续更新)
  14. git恢复已删除的本地分支
  15. 做鼻子测试软件,美鼻小测试,测测你的鼻子有几分?
  16. Android心率测试
  17. Unity--内置转换矩阵
  18. ViveInputUtility-手柄触摸3D物体(6)
  19. Spark运行环境之SparkEnv和通信工具RpcEnv
  20. linux开放端口命令

热门文章

  1. Laravel 以ElasticSearch的方式使用scout
  2. 亚马逊IC-ID/ISED认证需要提供什么资料
  3. 爱陆通研习社,水利RTU、环保数采仪、遥测终端机定义,4G5G课堂
  4. 汽车漫谈1:汽车的研发到制造过程
  5. js 实现简单区块链
  6. 短信服务器部署位置,搭建短信服务器
  7. RPA风潮席卷全行业,本土厂商如何把握未来?
  8. 集合--List集合练习--集合的嵌套、Random类获取随机数
  9. Hyperledger Fabric之Explorer区块链浏览器
  10. HTML 随机点名 --个人写法