劉平 賈林林
(中國空空導彈研究院,河南洛陽 471009)
三種串口通訊方法的實現與比較
劉平 賈林林
(中國空空導彈研究院,河南洛陽 471009)
一般測控設備在工作過程中,需要上位機與下位機之間不斷通訊,完成系統內部指令的下發和數據信息上傳功能,通常的做法是通過串口進行通訊。本文介紹3種常用的串口通訊方法,對每種方法的具體操作步驟進行詳細的分析,并對各自的優缺點進行比較。實踐表明,使用多線程串口通訊技術在整個測試過程中既能夠滿足產品測試任務的需要,又能夠及時響應串口事件,完美地解決了系統的邏輯并發和物理并發問題,滿足系統研制的需求。
串口通訊;單線程;多線程
在一般的測控設備工作過程中,當對產品進行測試時,需要設備的上位機和下位機之間保持通信,完成系統內部的下發指令和上傳數據信息功能。為了滿足產品測試任務的并行性,并能夠及時響應串口事件,通常的做法是采用多線程監聽串口事件的設計方式。本文通過設計實例比較3種串口通訊方法的優劣,為類似的設備研發提供一些有用的參考。
MSComm是屬于Microsoft公司Visual C++提供的Active X控件,用于在簡化Windows下進行串口通信編程。其提供了一系列的標準通信命令的接口,使得通過串口收發數據變得極為簡便[1]。MSComm控件提供了2種處理通信問題的方法。
1.1 串口活動法
由事件驅動通信,在處理串口活動方面具有很強大的功能。當有事件發生時,利用OnComm事件捕獲和處理各種通信事件,以獲取該事件的發生時間,同樣該過程也可以通過捕獲和處理通信中錯誤的完成。
1.2 程序檢測法
常用于小型的自含程序,每當用戶的應用程序執行完某一對串行通信接口的操作后,通過查詢CommEvent的屬性以便對該程序執行結果或者某事件是否發生進行確認。圖1給出了Visual C++的MSComm控件具體操作步驟。
首先,通過添加控件的方式加入MSComm控件,并定義該控件類的對象。其次,初始化該控件的屬性,通過設置相應的屬性,可以省去打開串口與關閉串口等操作,并且可以設置相應的串口號、波特率、奇偶校驗位、數據停止位等參數。再者,捕捉串口事件既可以通過查詢的方法從端口獲取數據,也可以采用通過事件驅動的方法。當有諸如接收數據之類的事件發生時通知程序,并由程序響應捕獲的消息完成對前面發生的通信事件的處理,也就是通過串口事件消息處理函數OnComm()中完成操作,這種事件驅動方法應用最為廣泛。最后,串口的讀寫分別通過GetInput()函數讀取接收緩沖區的字符,SetOutput()函數向發送緩沖區寫入數據流的方式實現,極為簡單,這兩個函數的原型分別是使用VARIANT數據結構的VARIANTGetput()及void SetOutput(const Variant& newValue)。

圖1 MSComm控件實現串口通訊流程圖
Visual Studio中將串口虛擬成文件,所有的操作都模擬成對文件的讀寫,這樣程序有一個統一的編程界面,簡化了編程接口,同時文件的處理屏蔽掉了硬件的端口和地址等特征。使用虛擬的緩沖區代替了實際的硬件緩沖區,使得程序開發只需要單一地關注邏輯上的輸入與輸出關系。圖2給出了采用單線程方式完成串口通訊的步驟[2]。
2.1 打開串口并獲取串口資源句柄
在使用單線程方式進行串口通信的整個過程中,始終存在一種動作,即程序在通過CreatFile()函數指定串口設備及相關的操作屬性后返回一個用于后續通信操作的句柄。同時,可在進行函數參數設置時設計異步I/O通訊方式,保證半雙工通訊。
2.2 串口設置
單線程打開某一串口后,該端口屬性將被設置成默認值,才是可以調用GetCommState(&dcb)函數讀取當前串口設備控制塊DCB(Device Control Block),然后根據具體的需求,修改完DCB后再使用SetCommState(&dcb)函數將其寫入。

圖2 單線程串口通訊方式流程圖
在進行同步讀寫時,應注意操作超時,并對其進行特殊控制,以防在通信過程中由于未知原因導致不可預測事件發生。這類事件包括端口正在接收數據突然被中斷或者發送數據突然停止等,這類情況有可能會造成I/O線程掛起或者線程被無限阻塞。因此,必須在程序中通過超時設置來判斷通信是否異常并決定是否作相應處理,可以采用COMMTIMEOUTS結構完成設置后調用SetCommTimeouts(hComm,&timeouts)將結果寫入。此外,在設置緩沖時,緩沖區容量應與通信速率相匹配地進行設置,較大的容量滿足更高的速率需求,但是應在設備驅動程序所能處理的容量范圍限制以下。
2.3 串口讀寫
單線程串口通信方式主要通過運用包括ReadFile() 與WriteFile()等在內的API函數完成串口讀寫。當采用異步通信方式時,這兩個函數的最后一個參數為一非空指針并指向OVERLAPPED結構,當讀寫函數的返回值為FALSE時,程序調用GetLastError()函數;當返回值為ERROR_IO_PENDONG時,則表明I/O操作被掛起,表明該操作將轉入后臺并等待執行。在操作中可以使用WaitForS-ingleObject()函數等待結束信號,同時可以設置最長的等待時間。
在某成像導引產品測控系統正常測試過程中,要求在圖像采集測試的同時保持串口通訊。比如隨時接收串口數據,處理相應數據并發出控制命令;或者設備不斷地采集產品數據,并同時或者在設定的某一故障發生時向某個相關的監控窗口及時發送通知消息,這些都需要在測控程序中創建用于監控線程的端口。
Win32能夠區分2種不同類型的線程,分別稱之為用戶界面線程UI(User Interface Thread)和工作者線程(Worker Thread)[3]。2種線程的區別在于,用戶界面線程可在其他線程執行之外響應用戶或者系統所產生的事件和信息,其包含信息泵或者信息循環;而工作者線程則沒有消息機制與用戶界面,是在后臺執行包括監視串口事件在內的各種計算和維護任務的。
程序開始某一個線程是通過調用AfxBeginThread()函數自動創建一個CWinThread對象的方式進行的。圖3給出了多線程實現串口通訊流程圖[4]。
以下任意某一事件均可以終止線程:①線程函數返回;②線程函數的正常退出;③在異常情況下,使用線程的句柄調用TerminateThread()函數退出;④線程所屬的進程被終止。
在本測控系統設計中,如果串口通訊線程出現錯誤,將調用TerminateThread()來強行結束線程。如果通訊正常,函數將正常返回。
在以后系統擴展中,可能會有多個串口同時工作,可以分別對各個端口建立監控線程來實現對所有端口的同時監控,也可以將此設計方式應用于分布式網絡的構建中,在此不再詳細介紹。
Visual C++提供的MSComm控件在完成基于對話框應用程序的串口通信任務方面,由于具有更為簡單的編程原理和方法,所以不需要了解具體的細節就可以容易實現。這樣帶來的負面作用是因為只能在對話框中使用,MSComm控件編程缺乏靈活性,限制了串口通信的傳輸速率。
單線程串口通信因為可以建立自定義的通信類,所以具有最高的靈活性,但是其編程復雜,對程序員的專業化程度要求很高,同時還只適用于監控系統,而且由于不能同時發送和接收數據,實時性不高,功能受到限制。
多線程串口通信方法具有較強的實時性,更為容易實現在多端口間獨立、準確的通信,這樣使得該方法得到了更廣泛的應用。同時,多線程能夠使程序員方便地榨取到更多的CPU硬件資源,提高整個系統的通訊效率。

圖3 多線程串口通訊流程圖
另外,當系統中存在各種邏輯并發和物理并發問題時,多線程技術在解決掉這一類問題時更具有優勢,這樣使得軟件的諸如吞吐量、計算速度和響應時間等各項技術指標均可以得到改善。多線程串口通信技術可以提高軟件的執行效率和運行穩定性,更合理地利用系統資源,并提高軟件代碼的可讀性。
某成像導引產品測控系統作為綜合性的復雜系統,數據需要通過多個串口在不同的子系統端口之間進行獨立傳輸,而且對測試實時性有很高的要求。經過驗證采用多線程編碼實現串口通訊功能能夠取得很好的效果。整個測控系統工作情況良好,在實際應用中要注意每次讀完數據要及時清空緩沖區,否則會導致緩沖區堵塞,造成新數據無法接收的情況。
[1]Mark E.Russinovisn.Windows2000內部揭秘[M].北京:機械工業出版社,2001.
[2]冀榮華,祁力鈞,傅澤田.基于Visual C++的精確定時技術與應用[J].農機化研究,2007(5):191-193.
[3]張旭東,付強,何松華,等.基于PCI接口的多通道高速數據采集系統[J].數據采集與處理,2000(2):240-244.
[4]王洪訊,趙天云,畢篤彥,等.高速偵察圖像數據的獲取和緩沖[J].微電子學和計算機,2004(10):82-85.
Implementation and Comparison of Three Serial Communication Methods
Liu PingJia Linlin
(China Airborne Missile Academy,Luoyang Henan 471009)
In the process of general measurement and control equipment,the communication between the host computer and the lower computer is needed to complete internal command down function and the data upload function, the usual practice is to communicate through the serial port.This paper introduced three kinds of commonly used serial communication method,the specific operation steps of each method were analyzed in detail,and their advantages and disadvantages were compared.Practice shows that the use of multi thread serial communication technology in the entire test process can not only meet the needs of product testing tasks,but also in response to serial port events, which solve the problem of logical concurrency and physical concurrency,and meet the requirements of system development.
serial communication;single thread;multithread
TP311.1
A
1003-5168(2017)04-0037-03
2017-03-06
劉平(1981-),男,工程師,研究方向:紅外導引總體技術。