串口 SetCommMask WaitCommEvent 设置 等待串口通信事件

转载自:http://www.360doc.com/content/12/0829/16/6973384_233025718.shtml


SetCommMask  设置要监控的事件,WaitCommEvent 等待串口通信事件的发生.

 
SetCommMask  
        用途:设置串口通信事件
  原型:BOOL SetCommMask(HANDLE hFile, //标识通信端口的句柄
  DWORD dwEvtMask //能够使能的通信事件
  );
  参数说明:-hFile:串口句柄
  -dwEvtMask:准备监视的串口事件掩码
  串口上可能发生的事件如下表所示:
  
事件描述
EV_BREAKA break was detected on input.
EV_CTSThe CTS (clear-to-send) signal changed state.
EV_DSRThe DSR(data-set-ready) signal changed state.
EV_ERRA line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
EV_RINGA ring indicator was detected.
EV_RLSDThe RLSD (receive-line-signal-detect) signal changed state.
EV_RXCHARA character was received and placed in the input buffer.
EV_RXFLAGThe 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_TXEMPTYThe last character in the output buffer was sent.
参数含义:
  EV_BREAK:收到BREAK信号。
  EV_CTS:CTS(clear to send)线路发生变化。
  EV_DSR:DST(Data Set Ready)线路发生变化。
  EV_ERR:线路状态错误,包括了CE_FRAME / CE_OVERRUN / CE_RXPARITY 3种错误。
  EV_RING:检测到振铃信号。
  EV_RLSD:CD(Carrier Detect)线路信号发生变化。
  EV_RXCHAR:输入缓冲区中已收到数据,即接收到一个字节并放入输入缓冲区。
  EV_RXFLAG:使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。
  EV_TXEMPTY:输出缓冲区中的数据已被完全送出。
操作举例: SetCommMask(hComm,EV_RXCHAR|EV_TXEMPTY);
上面函数执行完毕后将监视串口中有无数据和发送缓冲区中的数据是否全部发送完毕。

WaitCommEvent()
用途:用来判断用SetCommMask()函数设置的串口通信事件是否已发生。
原型:BOOL WaitCommEvent(HANDLE hFile,
LPDWORD lpEvtMask,
LPOVERLAPPED lpOverlapped
);
参数说明:
-hFile:串口句柄
-lpEvtMask:函数执行完后如果检测到串口通信事件的话就将其写入该参数中。
-lpOverlapped:异步结构,用来保存异步操作结果。
操作举例:OVERLAPPED os;
DWORD dwMask,dwTrans,dwError=0,err;

memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WaitCommEvent(hComm,&dwMask,&os)){
//如果异步操作不能立即完成的话,函数返回FALSE,并且调用GetLastError()函
//数分析错误原因后返回ERROR_IO_PENDING,指示异步操作正在后台进行.这种情
//况下,在函数返回之前系统设置OVERLAPPED结构中的事件为无信号状态,该函数
//等待用SetCommMask()函数设置的串口事件发生,共有9种事件可被监视:
//EV_BREAK,EV_CTS,EV_DSR,EV_ERR,EV_RING,EV_RLSD,EV_RXCHAR,
//EV_RXFLAG,EV_TXEMPTY;当其中一个事件发生或错误发生时,函数将
//OVERLAPPED结构中的事件置为有信号状态,并将事件掩码填充到dwMask参数中

if(GetLastError()==ERROR_IO_PENDING){
/**************************************************************/
/*在此等待异步操作结果,直到异步操作结束时才返回.实际上此时 */
/*WaitCommEvent()函数一直在等待串口监控的事件之一发生,当事件发*/
/*生时该函数将OVERLAPPED结构中的事件句柄置为有信号状态,此时 */
/*GetOverlappedResult()函数发现此事件有信号后马上返回,然后下面*/
/*的程序马上分析WaitCommEvent()函数等到的事件是被监视的串口事 */
/*件中的哪一个,然后执行相应的动作并发出相应消息. */
/**************************************************************/

GetOverlappedResult(hComm,&os,&dwTrans,true);
switch(dwMask){
case EV_RXCHAR:
PostMessage(Parent,WM_COMM_RXCHAR,0,0);
break;
case EV_TXEMPTY:
PostMessage(Parent,WM_COMM_TXEMPTY,0,0);
break;
case EV_ERR:
switch(dwError){
case CE_FRAME:
err=0;
break;
case CE_OVERRUN:
err=1;
break;
case CE_RXPARITY:
err=2;
break;
default:break;
}
PostMessage(Parent,WM_COMM_ERR,(WPARAM)0,(LPARAM)err);
break;
case EV_BREAK:
PostMessage(Parent,WM_COMM_BREAK,0,0);
break;
case ...://其他用SetCommMask()函数设置的被监视的串口通信事件。
... ...
break;
default:break;
}
}

 

-以上简要介绍了大部分的串口通信api函数,笔者所写的串口通信软件用的是事件通知方式,该方式是
windows2000下效率较高的一种方式。而且只熟悉这些api函数也还是不够的,该机制下还要牵涉到多
线程和消息机制,其中读写串口的动作是由主线程来完成的,比如说操作者按下发送数据的按钮之后
,相应函数马上将某特定区域里面的数据发送出去,所以说用api函数写串口发送数据的功能是相对较
简单的。收数据的时候就要麻烦一点,在打开串口后首先主线程要设置要监视的串口通信事件,然后
将监视线程打开,用来监视主线程设置的这些串口通信事件是否已发生,当其中的某个事件发生后,
监视线程马上将该消息发送给主线程,其中监视线程在发送消息之前要确保主线程在收到消息后肯定
的知道串口究竟发生了什么样的事件,然后根据不同的事件类型进行处理。下面给出大致的主线程和
监视线程的大致工作流程:

主线程打开(其实就是主窗体打开之后)
|
|
V
打开串口(设置波特率、校验方式、数据位数、停止位数)
|
|
V
设置监视线程需要监视的串口通信事件
|
|
V
打开监视线程
|
|
V
等待各种事件的发生(比如发送数据单击事件,更改通信参数事件,监视线程发来的消息等)
--------------------------------------------------------------------------------
监视线程被打开
|
|
V
串口事件发生否(WaitCommEvent())(无论发生否均进入下面的代码)
|
|
V
异步操作是否正在后台进行?(if(GetLastError()==ERROR_IO_PENDING))
|
|
V
在此等待异步操作结果(GetOverlappedResult(hComm,&os,&dwTrans,true))
|
|
V
处理通信事件,根据事件类型的不同给主窗体发送不同的消息

总结起来说SetCommMask()和WaitCommEvent()是要成对使用的。在串口打开的时候SetCommMask,然后在读数据的线程中WaitCommEvent。不过要注意的是,一般不会在WaitCommEvent之后做关于该串口数据的处理(尤其是在数据比较多,处理缓慢的时候——容易丢失数据吧~~),一般会把数据简单的保存下来,再发送消息给一个专门的处理函数进行处理。


  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
书名:《Visual Basic.NET自动化系统监控--RS-232串行通信》(清华大学出版社.范逸之.廖锦棋)。PDF格式扫描版,全书共分为9章,共475页。 介绍 Visual Basic .NET为广大Visual Basic用户打开了通往程序设计殿堂的大门。本书具体内容包括:串行通信的相关硬件概念、Visual Basic .NET的常用组件、Win32 API的运用、串行通信的传输方式、串行通信的类别、串行数据的处理方式、仪器设备上的串行通信、分布式的串行通信。本书不仅介绍了串行通信的概念,还详细解析了在窗口环境中设计通信程序的过程,并给出一些技巧与注意事项。 本书可供自动控制和通信领域的开发人员和其他相关技术人员使用或参考。 目录 第1章 基本概念 1 1.1 通信 1 1.1.1 数据传送 1 1.1.2 通信的种类 2 1.2 串行通信 3 1.2.1 RS-232串行通信 3 1.2.2 RS-485串行通信 5 1.2.3 USB接口 7 1.2.4 IEEE 1394 9 1.3 串行通信端口 9 1.3.1 信号定义 10 1.3.2 ASCII码对照表 11 1.3.3 针脚意义及方向 12 1.3.4 通信参数 16 1.4 模式及流量 19 1.4.1 工作模式 19 1.4.2 硬件握手 20 1.4.3 软件握手 22 1.5 接线和错误预防 24 1.5.1 接线方法 24 1.5.2 错误预防 25 1.5.3 CRC程序解析 27 常识问答 28 本章习题 28 第2章 Visual Basic .NET及 常用组件简介 29 2.1 Windows程序概念简述 29 2.1.1 对象的概念 29 2.1.2 界面 31 2.1.3 使用Visual Basic .NET 开发系统 33 2.1.4 Visual Basic .NET的 环境模式 36 2.1.5 项目开发的步骤 37 2.1.6 Visual Basic .NET与 操作系统的关系 38 2.2 常用组件介绍 39 2.2.1 Label组件 39 2.2.2 Button组件 40 2.2.3 Timer组件 42 2.2.4 PictureBox组件 43 2.2.5 RadioButton组件 43 2.2.6 GroupBox组件 44 2.2.7 ListBox组件 45 2.2.8 TextBox组件 45 2.3 程序简述 46 2.3.1 解决方案的组成 46 2.3.2 数据与运算符 48 2.3.3 命名空间 51 2.3.4 语法 52 2.3.5 基础的信息对话框 55 2.3.6 字符串类型及其处理函数 59 2.4 事件处理 66 2.4.1 事件的种类 66 2.4.2 事件中的程序代码 69 常识问答 71 本章习题 71 第3章 串行通信程序及API 72 3.1 引用Windows API 72 3.1.1 程序与硬件 73 3.1.2 Declare声明语句 73 3.1.3 DllImport声明方式 76 3.1.4 常数声明 77 3.1.5 枚举声明 77 3.1.6 结构声明 79 3.2 串行通信的Windows API简述 80 3.2.1 串行通信相关函数 80 3.2.2 CreateFile/CloseHandle (打开/关闭通信端口) 81 3.2.3 GetCommState (取得通信端口参数) 82 3.2.4 SetCommState (设置通信端口参数) 84 3.2.5 WriteFile (输出数据至通信端口) 85 3.2.6 ReadFile (自通信端口读取数据) 85 3.2.7 ClearCommError (清除通信端口错误状况) 85 3.2.8 PurgeComm(清除通信端口) 87 3.2.9 EscapeCommFunction (要求特定控制工作) 87 3.2.10 SetCommMask(信息屏蔽) 88 3.2.11 WaitCommEvent (检测事件是否已发生) 89 3.2.12 GetCommModemStatus (电位状态检测) 89 3.2.13 使用流程 90 3.2.14 检查资源设置 90 3.3 通信测试 92 3.3.1 通信步骤 92 3.3.2 回路测试 92 3.3.3 串行端口的数字 输出控制 113 3.3.4 串行端口的数字 输入检测 120 3.4 自动与事件 126 3.4.1 自动读取传入的字符串 126 3.4.2 通信事件 132 3.4.3 创建多线程 140 3.4.4 定时器与DoEvents() 151 常识问答 154 本章习题 154 第4章 串行通信中的字符与字节 155 4.1 字符与字节 155 4.1.1 字符和字节的差别 155 4.1.2 Visual Basic .NET中的 字符串类型 156 4.1.3 中英文字符串长度计算 158 4.1.4 字符编码内容 163 4.2 字节数据的送收 168 4.2.1 字节类型、声明与送收 168 4.2.2 动态数组 176 常识问答 182 本章习题 182 第5章 串行通信类的创建及使用 183 5.1 类的基础 183 5.1.1 类的组成 183 5.1.2 类成员 185 5.1.3 类创建的步骤 188 5.2 通信类的创建 190 5.2.1 类分析 190 5.2.2 枚举值、结构、常数、 Win32 API 的声明 191 5.2.3 属性创建 197 5.2.4 方法的考虑 206 5.2.5 事件的创建 209 5.2.6 整合类 213 5.3 使用串行通信类 232 5.3.1 类测试——数据收发 232 5.3.2 类测试——数字输出 237 5.3.3 类测试——数字输入 242 5.3.4 类事件测试——自动 读取数据 246 5.4 类库 250 5.4.1 类库项目的创建 250 5.4.2 类库的程序开发 252 5.4.3 类库的生成 254 5.4.4 类库的使用 254 常识问答 259 本章习题 260 第6章 串行数据的处理 261 6.1 命令字符串 261 6.1.1 沟通方式 261 6.1.2 CheckSum的使用 264 6.1.3 CheckSum的讨论 271 6.2 PS232实验仪器简介 275 6.2.1 PS232功能简介 275 6.2.2 PS232上的接口定义 276 6.2.3 串行仪控的实习 277 6.2.4 通信参数的设置 278 6.3 客户端的创建 278 6.3.1 TextBox组件与数据显示 279 6.3.2 状态灯号与数据显示 285 6.3.3 Visual Basic .NET中 的绘图 292 6.3.4 以曲线图表示数据 298 6.3.5 使用事件进行数据接收 305 6.3.6 PaintBox与数据 显示——字节数据 310 6.4 数据的存储及打印 319 6.4.1 数据存取 319 6.4.2 PS232数据及文件存取 322 6.4.3 打印及预览 331 6.4.4 打印及预览程序开发 332 常识问答 343 本章习题 344 第7章 其他串行通信组件 及串行端口 345 7.1 Windows的终端机 345 7.1.1 选择与使用终端机 345 7.1.2 与设备的连接测试 347 7.2 PComm Pro软件 348 7.2.1 PComm Pro的终端机 349 7.2.2 PComm Pro的串行 端口性能测试 351 7.2.3 PComm Pro的数据监视器 352 7.3 增加串行通信端口 355 7.3.1 MOXA C168多端口卡 355 7.3.2 USB转RS-232转接器 358 第8章 仪器设备上的串行通信 360 8.1 噪声计 360 8.1.1 仪器连接 360 8.1.2 噪声计简介 361 8.1.3 命令格式 362 8.1.4 沟通项目的设计 363 8.1.5 噪声读值的采集 370 8.2 电功率计 375 8.2.1 电功率计简介 375 8.2.2 接口及命令格式讨论 376 8.2.3 测试项目的创建 379 8.3 测量用放大器 390 8.3.1 BK-2525振动计简介 390 8.3.2 RS-232接口及命令 格式说明 391 8.3.3 项目的创建 395 8.4 电源供应器 400 8.4.1 电源供应器简介 400 8.4.2 接口及命令格式 402 8.4.3 控制项目的创建 404 8.5 温度记录器 409 8.5.1 温度记录器简介 409 8.5.2 接口及命令格式 411 8.5.3 沟通项目的创建 414 8.6 转速计 424 8.6.1 转速计介绍 424 8.6.2 接口及命令格式 425 8.6.3 项目程序的创建 426 8.7 条形码识别器 431 8.7.1 识别器设备介绍 432 8.7.2 界面及格式说明 433 8.7.3 项目程序的创建 434 8.8 测量电表 438 8.8.1 电表设备简介 438 8.8.2 接口及命令格式 439 8.8.3 项目程序的创建 443 8.9 波形发生器 449 8.9.1 设备介绍 449 8.9.2 接口及命令格式 450 8.9.3 项目程序的创建 453 常识问答 459 本章习题 460 第9章 分布式监控及网络化简介 461 9.1 分布式监控 461 9.1.1 何谓分布式监控 461 9.1.2 多模块的网络系统 462 9.1.3 RS-232与RS-485的转换 464 9.2 命令与格式 465 9.2.1 格式讨论 465 9.2.2 送收程序 468 9.2.3 取得模块的配置 468 9.3 网络化的串行通信 473 9.3.1 网络化的连接 473 9.3.2 工业上的网络连接 474 常识问答 475 本章习题 476 附录 ASCII码 477 参考文献 478
MFC(Microsoft Foundation Class)是一种用于编写Windows应用程序的库,它提供了许多可以简化开发过程的类和函数。串口通信是一种用于在计算机和外部设备之间进行数据传输的通信方式,通过串口通信API可以实现在MFC应用程序中与串口设备进行通信。 要在MFC应用程序中使用串口通信API,首先需要包含头文件"afxwin.h"和"afxdisp.h",然后创建一个CWinApp派生类的应用程序对象,并在InitInstance函数中调用AfxEnableControlContainer函数以启用ActiveX控件支持。接下来,创建一个对话框或窗口来实现用户界面,并在该对话框或窗口的消息映射中处理串口通信的逻辑。 使用串口通信API的实例涉及到打开、关闭串口设置串口参数、读取和写入串口数据等操作。首先需要使用CreateFile函数打开串口,并通过DCB结构体设置串口的参数,包括波特率、数据位、停止位和校验位等。然后可以使用ReadFile和WriteFile函数来进行数据的读写操作。 在处理串口通信时,需要注意数据的接收和发送是异步进行的,需要通过事件或定时器来进行数据的处理和监控。可以使用WaitCommEvent函数等待串口事件的发生,并通过SetCommMask函数设置串口事件的掩码。此外,在使用串口通信API时还需要注意处理可能出现的错误和异常情况,例如串口设备被拔出、通信超时等。 总之,通过MFC的串口通信API可以实现在Windows应用程序中与串口设备进行稳定而高效的通信,为实现串口通信功能提供了便利的工具和接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值