竇萌萌
(鶴壁職業技術學院 河南 鶴壁 458030)
這幾年伴隨時代的快速發展與社會經濟的提升,我國有關控制系統的應用也越來越廣、規模逐步擴大,這些系統所包含的功能模塊也日益增多。由此可知,控制系統中各組成模塊能夠進行有效通信能夠直接影響到該系統工作的協調性與安全穩定性。而控制系統各類通信方法中,串行通信是最安全可靠、最常應用的一種方式,其具備靈活性、操作簡單、具有更快的代碼執行速度等優點。
當前在項目實際設計中,獲得串口通信的過程如圖所示(圖1:當前技術實現串口通信的普通過程),通常是以下幾步:

圖1 當前技術實現串口通信的普通過程
(1)由上圖可知,首先我們需要根據有關協議初始化對應的設置,然后將串行口進一步打開(即:向Windows傳達此串口需要該程序進行應用的指令),然后將此串口進行封鎖,禁止其他程序來應用。
(2)對該串口設置相應的配置。
(3)借助該串口,在上面將有關數據信息進行往返傳輸,與此同時在實際傳輸的時候對各項設置進行校驗。
(4)當該串口使用完畢后,確定對其不再有需求就將其關閉、進行串口釋放,讓其能夠為其他程序提供應用服務。
Microsoft Visual C++是一種很實用的開發平臺,為各大用戶人群提供了各種方法來有效控制其串口通信。這種開發平臺不需要用戶熟悉其實際硬件原理,具有較強的可移植性以及適應性。
Win32系統進一步擴展了文件概念,從而使得文件、磁盤、設備以及相關管道都能夠當作文件。因此我們可以借助MFC(Microsoft Foundation Classes)中的CFile類來操作有關串口。同時Win32系統里的I/O函數輸入輸出能夠實現重疊式,從而進一步增強了時效性。正常情況下利用Microsoft Foundation Classes來實現串口通信的主要編程步驟為以下幾步:
(1)在MainFrm.cpp中將相應的全局變量進行有效定義
HANDLEhCom;//該句柄用于將相關串口進行打開準備
(2)將串口正式打開
Windows通信從CreateFile()函數開始正式打開相應的串口,然后在CreateFile()處對此串口的對應屬性與設備進行操作,同時反饋回某種句柄,其能夠在之后的通信過程中被應用。
(3)將串口的各項參數設置進行初始化
在打開對應串口句柄函數之后,我們一般要初始化其各項參數設置,如:停止位數、流控協議、波特率等等。相對常見的函數設置為以下幾種:
GetCommState(hCom,&dcb)://該函數能夠設置此串口原本的參數;
Create://該函數能夠將控件對象進行創建并有效初始化;
SetInBufferSize://該函數能夠設置串口接收緩存區的最高范圍;
SetOutBufferSize://該函數能夠設置串口傳輸緩存區的最高范圍;
SetInputLen://該函數能夠對此串口接收區的信息長度進行設置;
SetPortOpen://該函數能夠對串口進行打開以及關閉操作,若將其設置為TRUE即為打開指令,若將其設置為FALSE即為關閉指令。
(4)對串口的API函數進行讀寫操作
打開對應的串口之后,我們可以對此串口的API函數(Application Programming Interface)進行讀寫等操作。
(5)串口的API函數進行關閉
由于通信串口不屬于共享資源,因此當串口被打開使用完畢后一定要記得將其進行關閉,若CreateFile()函數返回數據不是0,則意味著調用成功。
MSComm控件,其英文全稱為:Microsoft Communication Control。該控件是在Component Object Model的基礎上開發出的一種事件驅動通信接口,這種控件主要用于串口通信編程,編程人員不用花費精力去掌握復雜的API函數,操作簡便靈活,具有很好的穩定性與高效性。
(1)MSComm控件所具備的功能與運行原理
MSComm控件能夠有效運行串行數據信息的接收以及發送功能,其即包含WindowsAPI系統中所有串行通信的函數功能,還能夠有效提供更全面的對象屬性,從而滿足各種用戶人群的編程需要。MSComm控件能夠有效屏蔽實際通信環節中的底層操作,有關用戶只要做好簡單設置、對相關事件屬性進行監視,就能夠有效的進行串口編程,從而與有關對象實現串行通信、信息交換,在這個過程中還能夠科學監視可能存在的某些錯誤與事件。
(2)MSComm控件實現通信的2種常見方式
①MSComm控件借助事件驅動方式實現串口通信
事件驅動能夠有效處理串行端口的有關交互作用,通常在事件驅動進行過程中根據其程序需要獲得通知(如:處于Request ToSend或者CarrierDetect線上時程序存在某個字符發生變化),這種情況下可以借助MSComm控件中的OnComm事件有效處理其對應的通信事件。OnComm還能夠科學檢測其通信錯誤,在實際編程中利用OnComm事件有關函數能夠實現所需的功能,這種方式具有較高可靠性與事實性,在日常工作中使用廣泛。
②MSComm控件借助查詢方式實現串口通信
這種方式具體是指:定時或者不定時的在實際用戶程序中對MSComm控件中的有關CommEvent屬性有沒有出現變化,從而做出相應的措施。該方式本質還是屬于事件驅動,只不過在某種環境下查詢方式更簡單快捷。如:當處理器相對空閑或有關應用程序相對偏小的情況下,更建議使用查詢方式。該方式具有較強的可控性與穩定性,但需要注意的是其存在某種程度的時間間隔,當有關數據信息變化相對較快的時候,若對每個串口進行查詢有可能會導致信息流失。同時該方式有時還會占用較多的系統資源,因此適用于應用程序短小且能夠自保持的情況。
③借助Visual C++運行庫函數從而達到串口通信目的
VC++其英文全稱為:Microsoft Visual C++,借助其進行通信編程其實是寫入以及讀出Universal Asynchronous Receiver/Transmitter內部寄存器中有關內容的操作,在實際進行串行通信前,我們需要參考相關設備的各項參數,對雙方的串口通信方式進行約定,如:設置停止位、奇偶位以及波特率。對數據信息的傳輸格式與Universal Asynchronous Receiver/Transmitter有關操作方式進行確定。借助Microsoft Visual C++有關通信函數outp()以及inp()實現通信目的。
其次,我們也可以借助第三方的通信類來進行串口通信的編寫,這種方式具有很簡潔的接口,最后編寫出來的程序相對比較靈活,將其與Microsoft Visual C++進行結合會得到更高的運行效率。
Microsoft Visual C++是一種很實用的開發平臺,為各大用戶人群提供了各種方法來有效控制其串口通信。這種開發平臺不需要用戶熟悉其實際硬件原理,具有較強的可移植性以及適應性。
本文基于VC++環境平臺,介紹了利用當前主流技術實現串口通信的詳細過程,同時向讀者簡單闡述了基于VC++的串口通信3種常見實現方法,如:借助MFC(微軟基礎類庫)來進行編程是程序員使用最廣泛的實現方式,可以對不同種類的外部設備實現串口通信,但對硬件要求較高;借助Visual C++運行庫函數則正好跟MFC方法相反,前者實現串口通信原理相對容易,對硬件要求不高,但此消彼長,程序的靈活性和實用性會受到影響;而第3種實現方法,借助 VB的MSComm有關控件來進行編程實現串口通信也比較容易實現,不需要程序員過于關注硬件內部的實現原理,但與MFC實現方法相比,靈活性等方面也差強人意。
總之,在實際工作中要具體問題具體分析,結合實際需求,綜合考慮程序的時間復雜度和空間復雜度等因素,有所取舍,適當選擇,最終實現Win32系統的串口通信。