闡述VB串口編程技術要領

時間:2022-02-11 03:42:00

導語:闡述VB串口編程技術要領一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

闡述VB串口編程技術要領

摘要:串口通信因為其簡單,靈活易用,在許多領域有著廣闊的應用前景。本文在深入了解串口通訊技術的基礎上,結合自身的工程實踐經驗,闡述vb串口編程的技術要點。并結合一個通訊實例,分析通訊的具體實現,給相關領域的研究人員提供值得參考的信息。

關鍵詞:串口;RS232;API;Pcomm;Mscomm;通信程序

現在通訊方式越來越多,速度越來越快,但串行通訊由于自身價格低、協議透明、硬件投資少、軟件編程簡單等諸多優點在遠程數據采集、監視、通信及控制領域里一直占據著極其重要的地位。它不僅沒有因為時代的進步而被淘汰,反而在規格上越來越完善、應用越來越廣,長久不衰。

一、串口通信的通信機理

PC串行通信是指直接對串行端口的UART(PC機的通用異步收發器,也叫異步通信適配器,是PC機用于異步通信的接口)進行編程實現的通信。PC機每個UART中的INS8250中有10個可編程的單字節寄存器,可用于控制、監視操作串行端口,COM1的寄存器地址3F8H-3FEH,COM2的寄存器地址為2F8H-2FEH。10個寄存器由7個地址訪問,其中5個寄存器的訪問條件是先設置3FBH線路控制寄存器的最高位為“1”,該位也稱為DLAB狀態位。

一般說來,PC機都有一個或多個串行端口,它們依次為Com1、Com2。這些串口提供了外部設備與PC進行數據傳輸和通信的通道,在CPU和外設之間充當了解釋器的角色。當字符數據從CPU發送給外設時,這些字符數據將被轉換成串行比特流數據;而當接受數據時,從外界進來的比特流數據被轉換成字符數據傳遞給CPU進行處理。在操作系統方面,Windows用通信驅動程序(COMM.DRV)調用API函數發送和接受數據。當用通信控件或聲明調用API函數時,它們由COMM.DRV解釋并傳遞給設備驅動程序。

作為一個VB程序員,要編寫串口通信程序,只需知道通信控件提供給Windows通信API函數的接口即可,換言之,只需設定和監視通信控件的屬性和時間即可。

二、串行通訊接口RS-232

前一章節討論了串口通訊的通信機理,但為了實現具體的數據采集、監視、通信功能,必須了解具體的串口形式。目前使用最廣泛的串行接口有兩種:RS-232和RS-485。本文著重討論RS-232,RS-485不作介紹。

RS-232C標準的全稱是EIA-RS-232C標準,其中EIA代表美國電子工業協會,RS代表推薦標準,232是標識號,C代表RS232的最新一次修改(1969年),在這之前,有RS232A、RS232B協議。它規定連接電纜和機械、電氣特性、信號功能及傳送過程。EIA-RS-232C定義了按位串行傳輸的數據終端設備(DTE)和數據通訊設備(DCE)之間的接口信息。RS-232C是從DTE或計算機串行接口角度來定義引腳信號的。

目前RS-232是PC機與通信工業中應用最廣泛的一種串行接口。RS232被定義為一種在低速率串行通訊中增加通訊距離的單端標準。RS232采取不平衡傳輸方式,即所謂的單端通訊。

DB9(9針串口)的接線方式如下:1腳,數據載波檢測DCD;2腳,接收數據RXD;3腳,發送數據TXD;4腳,數據終端準備DTR;5腳,信號地GND;6腳,數據設備就緒DSR;7腳,請求發送RTS;8腳,清除發送CTS;9腳,振鈴指示DELL。

DB25(25陣串口),常用的針腳也有9個,且和DB9可以一一對應,具體接線方式為:8腳,數據載波檢測DCD;3腳,接收數據RXD;2腳,發送數據TXD;20腳,數據終端準備DTR;7腳,信號地GND;6腳,數據設備就緒DSR;4腳,請求發送RTS;5腳,清除發送CTS;22腳,振鈴指示DELL。

一般來說,對于要求不太高的場合,使用接收數據RXD,發送數據TXD,信號地GND三個腳即可實現數據傳輸。如果要求有硬件流控制,則必須使用DTR、DSR、RTS和CTS這四個腳。

值得注意的是RS-232C是用正負電壓來表示邏輯狀態,與TTL以高電平表示邏輯狀態的規定不同。因此,為了能夠與計算機接口或終端的TTL器件連接,必須在RS-232C與TTL電路之間進行電平和邏輯關系的變換。目前較為廣泛地使用集成電路轉換器件,如MC1489、SN75150芯片可完成TTL電平到EIA電平的轉換,而MC1489、SN75154可實現EIA電平到TTL電平的轉換。

三、三種讀取串口數據的方式

目前通用的串口通訊的軟件實現方式有3種,本文都進行詳細的介紹,它們各有自身的優缺點,讀者在編程時可根據具體的情況選擇合適的方式。

3.1利用Mscomm控件

VB提供的這個通信控件“隱藏”了大部分串口通信的底層運行過程,程序員只需編寫少量的代碼就可以完成軟件的開發過程。在通信數據量不大,通信要求不是很高的情況下建議采取此方式。

利用Mscomm控件實現通信最需要掌握的就是它的幾個主要屬性,下面選取其中重要的進行介紹,其余的可以參考相關資料。

(1)Settings屬性:以字符串的形式設置并返回波特率、奇偶校驗位、數據位、停止位。這個屬性很重要,針對不同的終端設備需要根據設備的具體情況進行調整(比如日本的設備不同于美國的設備,通常會采用奇校驗)。

(2)InputMode屬性:設置接收數據的類型,0為文本格式,1為二進制格式。

(3)Input屬性:讀取并刪除接收緩沖區中的數據流。

(4)Output屬性:向發送緩沖區傳送一數據流。

(5)Rthreshold屬性:該屬性為一閥值,它確定當接收緩沖區內的字節個數達到或超過該值后就產生代碼為ComEvReceive的OnComm事件。

(6)Handshaking屬性:設置和返回握手協議,即計算機內部CPU與串口之間的通訊協議,保證在緩沖區過載時數據不會丟失。這個屬性在保證數據傳輸的正確性方面有很大的作用,共有四個選項,分別表示:①無流控制;②軟件流控制;③硬件流控制;④軟硬件流控制。采用硬件流控時,要求串口之間和電纜支持硬件握手,在自己制作串口通信線時,有關硬件握手的線RTS、CTS、DSR、DTR要連接正確。

在正確設置這些屬性的基礎上,剩下的就是打開串口,通過串口發送及接受數據了。本文后續章節利用一個實例詳細講解了這些屬性的設置及具體代碼。

3.2直接調用Win32API通信函數

直接調用WindowsAPI函數,可以清楚地理解串口通信的機制,根據需要靈活地配置串口的各種參數和屬性,而且直接調用低層API函數,通信效率比較高,但付出的代價就是程序較復雜,編程周期長,適合于大型通信程序及通訊質量要求較高的場合。

在32位的Windows系統中,串口通信是作為文件處理的,串口操作一般為打開、關閉、讀取、寫入等操作,相應的WindowsAPI函數如下:

(1)CreateFile()函數:實現串口的初始化并打開串口,返回串口句柄資源以供后續進程調用。

(2)CloseFile()函數:關閉串口,串口是非共享資源,應用程序以獨占方式使用,通信結束應立即關閉。

(3)ReadFile()函數:從串口輸入緩沖區讀取數據流。

(4)WriteFile()函數:向串口輸出緩沖區發送數據。

(5)GetCommState()函數:獲取串口的當前配置。

(6)SetCommState()函數:重新分配串口資源的各個參數。

由于WindowsAPI函數大部分是用C或C++編寫,所以在VisualBasic6.0中調用WindowsAPI函數之前必須先在模塊級代碼上用Declare語句對所調用的函數和用到的數據結構進行聲明,具體的函數聲明及數據結構請參考朱友芹編《新編WindowsAPI參考大全》。

3.3調用第三方函數庫(如Pcomm函數庫)

DLL(DynamicLinkLibrary)動態鏈接庫是一種可以被VB語言調用的程序模塊。DLL中包含的可執行代碼不能單獨執行,而應由Windows應用程序調用執行。一般數據采集卡的供應商都會提供該采集卡的DLL庫函數,使用這些DLL庫函數,可以做到程序代碼共享,減少程序的編寫工作量。用戶不需要知道這些代碼的實現細節,只需要了解調用函數的參數和函數處理后的返回值。

Pcomm函數庫是由臺灣Moxa公司為開發串口通信程序提供的一套函數庫。通過對WindowsAPI函數的進一步封裝,提供50多個串口操作函數。覆蓋了Windows操作系統下幾乎所有異步通信的問題,可以簡潔的開發多線程通訊程序。采用該庫,通信的可靠性與使用MSComm32控件比較有了明顯提高,而相對直接使用Win32API函數編程則降低了程序開發難度,縮短了程序開發周期。

這種方式上述直接調用WindowsAPI函數有相似之處,但也有明顯的差異。API函數常采取的方法是在串口監視線程中設置串口通信事件掩碼及重疊機制,允許程序在后臺等待串口通信事件。通過WaitCommEvent檢測特定的串行通信事件。而在Pcomm中,可以采用中斷處理的方式,為各種事件指定相應的中斷處理函數,如接收到一定數目的字符,接收到結束字符,接收到中止信號以及發送緩沖區為空等;同時還可以采用線程控制的方式,直接采用庫中的sio_read()和sio_write()函數讀寫串口。

Pcomm..DLL中的函數按功能分為6項:端口設置、數據發送與接收、串口狀態檢測、事件服務、文件傳輸、雜項。Pcomm..DLL中主要的函數介紹如下。

sio_open:打開端口;sio_close:關閉端口。

sio_ioctl:設置端口參數,如波特率等。

sio_read:從端口接收數據;sio_write向端口發送數據。

sio_iqueue:得到接收緩沖區中的數據長度。

sio_oqueue:得到發送緩沖區中的數據長度。

Pcomm在串口通信中的功能十分強大,但基于篇幅的考慮,在此不便贅述,讀者可參考相關書籍或Pcomm自帶的幫助文檔。

四、串口通訊的錯誤及處理

由于外界干擾或電壓波動等原因,串口通訊可能會出現錯誤,如接受緩沖區溢出,奇偶校驗錯誤等。為了處理這些錯誤,在Mscomm控件中就提供了一個OnComm事件,它可以捕獲通信時發生的串口事件和錯誤信息,自動轉入事件處理程序。在OnComm事件中,CommEvent屬性是OnComm事件的指示,下面簡單介紹幾個重要的CommEvent屬性值。

ComEventBreak:表示收到一個中斷信號;

ComEventFrame:表示硬件檢測到一個數據幀錯誤;

ComEvenRxover:表示接收緩沖區溢出;

ComEventTxFull:表示輸出緩沖區已滿;

ComEvReceive:表示接手到了Rthreshold個字符;

ComEvEOF:表示接受到了EOF字符(ASCII字符26)。

編程時用SelectCase語句,根據不同的CommEvent屬性值,去執行不同的處理程序。

除了以上所述的通訊錯誤外,在串口通信時,如果數據傳輸突然中斷,對串口的讀寫操作可能會進入無限期的等待狀態,為避免這種情況發生,必須設置串口讀寫操作的等待時間,等待超時后,串口的讀寫操作將被主動放棄,這樣即使數據傳輸突然中斷程序也不會被掛起或阻塞??梢愿鶕唧w要求規定串口讀寫操作的最長時間值,即串口讀寫必須在這段時間內完成,否則提示串口操作失敗。

五、串口通訊實例

本實例是一個采集設備電流及功率的通訊程序,采集儀為橫河WT230數字功率計,因為要采集的數據量不大,且工程結構簡單,故采用Mscomm控件的形式進行串口讀寫操作。

具體實現步驟如下:

(1)在窗體Form上添加兩個重要的控件:Timer1和Mscomm1;

(2)在程序的Form_Load事件過程中添加如下代碼:

mPort=1‘使用COM1端口

MSComm1.Setting=“9600,o,8,1”‘設置通信口參數,注意是奇校驗,具體的校驗方式要視具體的儀器而定

MSComm1.InputMode=comInputModeBinary‘設置接收模式為二進制形式,注意一般對于數據采集這類設備通信,都應該設置為二進制形式

MSComm1.PortOpen=True‘參數設置好后打開端口

MSComm1.HandShaking=2-comRTS‘設置為硬件流控制,可以有效避免數據丟失的情況發生

(3)程序開始后在一定情況設置Timer1.Enabled屬性值為True激活Timer1_Time事件,可以在固定的時間間隔下執行Timer1_Timer過程中的代碼程序,完成數據采集。在Timer1_Timer過程中添加如下代碼:

MSComm1.Output="COMMUNICATE:WAIT1"+Chr(13)+Chr(10)

MSComm1.Output="MEASURE:NORMAL:VALUE?"+Chr(13)+Chr(10)

上述語句是將讀取指令發送到串口輸出緩沖區(注意每個命令字符串后都要加上回車和換行符Chr(13)+Chr(10)),再由系統將其自動發送給通過RS232通信線與計算機端口連接的WT230數字功率計,功率計在接收到命令字符串后,經過自身的單片機處理,就自動地把它測到的電壓、電流、功率數據以固定的格式和字符形式通過RS232通信線傳回至計算機,計算機程序從輸入緩沖區讀取這些字符數據并利用VB字符處理函數(如Val,InStr)進行處理就得到了所要的數據,下面是具體的程序代碼。

Dimbytinput()asbyte‘注意要將bytinput定義為不定長數組

DimstrtemAsString

DimiasInteger

bytinput=MSComm1.Input‘將輸入緩沖區數據讀入給字節型數組bytinput

Fori=0ToUBound(bytinput)

strtem=strtem+Chr(bytinput(i))‘字節數組中的ASCII碼值轉換成相應Next的字符得到的strtem字符就形象的展示了電流、電壓和功率值。對于WT230而言,它的數據結構是這樣的,每個數據之間由逗號字符“,”隔開,每個數據以用科學計數法表示,且每個數據以字符“E”分為前半部分和后半部分,前半部分為具體的數據(整數形式),后半部分為此數據的指數,指數的底為10。

例如得到strtem的值為“23423E-2,00241E-3,05645E-2”這就表示電壓值為234.23V,電流值為0.241A,功率為56.45W。

六、結論

串口通訊的硬件投資少,軟件編程簡單,在低速少量數據傳輸方面的應用極其廣泛的應用。本文詳細介紹了串口通訊的基本內容及其具體實現方式,讀者可以根據具體情況進行選擇。以上代碼是實現串口通信的核心部分,經過筆者在多個數據采集系統開發中的應用,具有較強的實用價值。

參考文獻:

1李朝青.PC機及單片機數據通信技術[M].北京:國防工業出版社,2002

2李長林.VisualBasic串口通信技術與典型實例[M].北京:清華大學出版社,2006

3[美]Microsoft公司著、北京希望電腦公司譯.MicrosoftVisualBasic6.0控件參考手冊[M],1999

4朱友芹.新編WindowsAPI參考大全[M].電子工業出版社,2000

5MOXACrop.PcommLibraryProgrammingGuide,1998

6范逸之.VisualBasic與RS232串行通信控制.北京:中國青年出版社,2000