?? 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 + -