📄 d056.bmp.txt
字号:
循环,在该循环内,混合了两种监视串口输入的方法。
首先是调用ClealCommError函数查询输入缓冲区中是
否有字符,如果有,就向视图发送WM_COMMNOTIFY
消息通知其接收字符;如果没有,则调用
WaitCommEvent函数监视EV_ RXCHAR通信事件,
该函数执行重叠操作。然后调用的GetOverlapped Result
函数无限等待通信事件,如果EV_RXCHAR事件发
生,那么就结束等待。
上述两种方法混合使用,兼顾了线程的效率和可
靠性。如果只用ClearCommErro.r函数,则辅助线程将 图2-17基于Windows API的虚拟终端
不断耗费CPU时间来查询,效率低下。如果只用WaitCommEvent来监视,那么由于该函数
对输入缓冲区中已有的字符不会产生EV_RXCHAR事件,因此通信效率较高时,会造成数
据的延误和丢失。
CloseConnection函数的主要任务是终止辅助线程并关闭m_hCom通信设备。为了终止
线程,该函数设置了一系列信号,以结束辅助线程中的等待和循环,然后调用
WaitForSingleObject函数等待线程结束。
2.4实例3:基于CSeriaIPort酌串口多线程通信框架
2.4.1 CSeriaIPort类的构造
CSenalPort类是由Remon Spekreijse提供的免费串口类,CSerialPort类支持连接(非
MODEM)的串口编程操作,编写的程序在Windows 98/NT/2000/XP操作系统下可很好地运
行,但在Windows Me操作系统下会出现死机的现象。CSerialPort类是基于多线程的,其工
作流程如下:首先设置好串口参数,然后开启串口监测工作线程,串口监测工作线程监测到
串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处
理函数来进行数据处理。以上过程只是对接收数据而言的,发送数据则可直接向串口发送。
CSerialPort类定义的消息如表2-8所示。
表2-8类消息说明
┏━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 消息名称 ┃ 消息号 ┃ 功能说明 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_BREAK-DETECTED ┃ WM_USER+1 ┃ 检测到输入中断 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_CTS_DETECTED ┃ WM_USER+2 ┃ 检测到CTS(清除发送)信号状态改变 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_DSR_ DETECTED ┃ WM_USER+3 ┃ 检测到DSR(数据设备准备就绪)信号状态改变 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ ┃ ┃ 友生线状态错误(包括CE FRAME,CE_OVERRUN,和 ┃
┃WM_COMM_ERR_ DETECTED . . ┃ WM_USER+4 ┃ ┃
┃ ┃ ┃CE RXPARITY) ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_RING_ DE'IECTED ┃ WM_USER+5 ┃ 检测到响铃批示信号 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_RLSD_ DETECTED ┃ WM_USER+6 ┃ 检测到RLSD(接收信号)状态改变 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_RXCHAR ' ┃ WM_USER+7 ┃ 接收到一个字符并已放入接收缓冲区 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_RXCHAR_ DETECTED ┃WM_USER+8 ┃ 检测到接收到字符(该字符已放入接收缓冲区)事件 ┃
┣━━━━━━━━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃WM_COMM_TXEMPTY_ DETECTED ┃ WM USER+g ┃ 检测到发送缓冲区最后一个字符已发送 ┃
┗━━━━━━━━━━━━━━━━━┻━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━┛
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -