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