⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d056.bmp.txt

📁 Visual C++通信编程实例
💻 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 + -