關鍵詞:串口;RS232;API;Pcomm;Mscomm;通信程序
Abstract:Serial communication has broad application in many fields because of its simple communication circuitry and flexibility. Based on deep comprehension of the technology of the serial communications, this article expounds important technology detail integrated with practice experience. An example of communication program is presented and analyzed, which gives other researchers valuable reference information.
Key words:serial; RS232; API; Pcomm; Mscomm; communication program
現在通訊方式越來越多,速度越來越快,但串行通訊由于自身價格低、協議透明、硬件投資少、軟件編程簡單等諸多優點在遠程數據采集、監視、 通信及控制領域里一直占據著極其重要的地位。它不僅沒有因為時代的進步而被淘汰,反而在規格上越來越完善、應用越來越廣,長久不衰。
1串口通信的通信機理
PC串行通信是指直接對串行端口的UART(PC機的通用異步收發器,也叫異步通信適配器,是PC機 用于異步通信的接口)進行編程實現的通信。PC機每個UART中的INS8250中有10個可編程的單字節寄存器,可用于控制、監視操作串行端 口,COM1的寄存器地址3F8H-3FEH,COM2的寄存器地址為2F8H-2FEH。10個寄存器由7個地址訪問,其中5個寄存器的訪問條件是先設 置3FBH線路控制寄存器的最高位為“1”,該位也稱為DLAB狀態位。[1]
一般說來,PC機都有一個或多個串行端口,它們依次為 Com1、Com2……。這些串口提供了外部設備與PC進行數據傳輸和通信的通道,在CPU和外設之間充當了解釋器的角色。當字符數據從CPU發送給外設 時,這些字符數據將被轉換成串行比特流數據;而當接受數據時,從外界進來的比特流數據被轉換成字符數據傳遞給CPU進行處理。在操作系統方 面,Windows用通信驅動程序(COMM.DRV)調用API函數發送和接受數據。當用通信控件或聲明調用API函數時,它們由COMM.DRV解釋 并傳遞給設備驅動程序。
作為一個VB程序員,要編寫串口通信程序,只需知道通信控件提供給Windows通信API函數的接口即可,換言 之,只需設定和監視通信控件的屬性和時間即可。
2串行通訊接口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采取不平衡傳輸方式,即所謂的單 端通訊。[2]
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種,本文都 進行詳細的介紹,它們各有自身的優缺點,讀者在編程時可根據具體的情況選擇合適的方式。
3.1利用Mscomm控件
VB提供 的這個通信控件“隱藏”了大部分串口通信的底層運行過程,程序員只需編寫少量的代碼就可以完成軟件的開發過程。在通信數據量不大,通信要求不是很高的情況 下建議采取此方式。
利用Mscomm控件實現通信最需要掌握的就是它的幾個主要屬性,下面選取其中重要的進行介紹,其余的可以參考相關資 料。[3]
(1)Settings屬性:以字符串的形式設置并返回波特率、 奇偶校驗位、數據位、停止位。這個屬性很重要,針對不同的終端設備需要根據設備的具體情況進行調整(比如日本的設備不同于美國的設備,通常會采用奇校 驗)。
(2)InputMode屬性:設置接收數據的類型,0為文本格式,1為二進制格式。
(3)Input屬性:讀取并刪 除接收緩沖區中的數據流。
(4)Output屬性:向發送緩沖區傳送一數據流。
(5)Rthreshold屬性:該屬性為一 閥值,它確定當接收緩沖區內的字節個數達到或超過該值后就產生代碼為ComEvReceive的OnComm事件。
(6)Handshaking屬性:設置和返回握手協議,即計算機內部CPU與串口之間的通訊協議,保證在緩沖區過載時數據不會丟失。這個屬性在保證數據 傳輸的正確性方面有很大的作用,共有四個選項,分別表示:①無流控制;②軟件流控制;③硬件流控制;④軟硬件流控制。采用硬件流控時,要求串口之間和電纜 支持硬件握手,在自己制作串口通信線時,有關硬件握手的線RTS、CTS、DSR、DTR要連接正確。
在正確設置這些屬性的基礎上,剩下的 就是打開串口,通過串口發送及接受數據了。本文后續章節利用一個實例詳細講解了這些屬性的設置及具體代碼。
3.2直接調用Win32 API通信函數
直接調用Windows API函數,可以清楚地理解串口通信的機制,根據需要靈活地配置串口的各種參數和屬性,而且直接調用低層API函數,通信效率比較高,但付出的代價就是程 序較復雜,編程周期長,適合于大型通信程序及通訊質量要求較高的場合。
在32位的Windows系統中,串口通信是作為文件處理的,串口操 作一般為打開、關閉、讀取、寫入等操作,相應的Windows API函數如下:[4]
(1) CreateFile()函數:實現串口的初始化并打開串口,返回串口句柄資源以供后續進程調用。
(2) CloseFile()函數:關閉串口,串口是非共享資源,應用程序以獨占方式使用,通信結束應立即關閉。
(3) ReadFile()函數:從串口輸入緩沖區讀取數據流。
(4) WriteFile()函數:向串口輸出緩沖區發送數據。
(5) GetCommState()函數:獲取串口的當前配置。
(6) SetCommState()函數:重新分配串口資源的各個參數。
由于Windows API函數大部分是用C或C++編寫,所以在Visual Basic 6.0 中調用Windows API函數之前必須先在模塊級代碼上用Declare語句對所調用的函數和用到的數據結構進行聲明,具體的函數聲明及數據結構請參考朱友芹編《新編Windows API參考大全》。
3.3調用第 三方函數庫(如Pcomm函數庫)
DLL(Dynamic Link Library)動態鏈接庫是一種可以被VB語言調用的程序模塊。DLL中包含的可執行代碼不能單獨執行,而應由Windows應用程序調用執行。一般數 據采集卡的供應商都會提供該采集卡的DLL庫函數,使用這些DLL庫函數,可以做到程序代碼共享,減少程序的編寫工作量。用戶不需要知道這些代碼的實現細 節,只需要了解調用函數的參數和函數處理后的返回值。
Pcomm函數庫是由臺灣Moxa公司為開發串口通信程序提供的一套函數庫。通過對 Windows API函數的進一步封裝,提供50多個串口操作函數。覆蓋了Windows操作系統下幾乎所有異步通信的問題,可以簡潔的開發多線程通訊程序。采用該庫, 通信的可靠性與使用MSComm32控件比較有了明顯提高, 而相對直接使用Win32API函數編程則降低了程序開發難度, 縮短了程序開發周期。
這種方式上述直接調用Windows API函數有相似之處,但也有明顯的差異。API函數常采取的方法是在串口監視線程中設置串口通信事件掩碼及重疊機制,允許程序在后臺等待串口通信事件。 通過WaitCommEvent檢測特定的串行通信事件。而在Pcomm中,可以采用中斷處理的方式,為各種事件指定相應的中斷處理函數,如接收到一定數 目的字符,接收到結束字符,接收到中止信號以及發送緩沖區為空等;同時還可以采用線程控制的方式,直接采用庫中的sio_read()和 sio_write()函數讀寫串口。
Pcomm..DLL中的函數按功能分為6項:端口設置、數據發送與接收、串口狀態檢測、事件服務、 文件傳輸、雜項。Pcomm..DLL中主要的函數介紹如下。[5]
sio_open:打開端口;sio_close: 關閉端口。
sio_ioctl:設置端口參數,如波特率等。
sio_read:從端口接收數據;sio_write向端口發送數據。
sio_iqueue:得到接收緩沖區中的數據長度。
sio_oqueue:得到發送緩沖區中的數據長度。
Pcomm在串口 通信中的功能十分強大,但基于篇幅的考慮,在此不便贅述,讀者可參考相關書籍或Pcomm自帶的幫助文檔。
4串口通訊的錯誤 及處理
由于外界干擾或電壓波動等原因,串口通訊可能會出現錯誤,如接受緩沖區溢出,奇偶校驗錯誤等。為了處理這些錯誤,在 Mscomm控件中就提供了一個OnComm事件,它可以捕獲通信時發生的串口事件和錯誤信息,自動轉入事件處理程序。在OnComm事件 中,CommEvent屬性是OnComm事件的指示,下面簡單介紹幾個重要的CommEvent屬性值。
ComEventBreak:表 示收到一個中斷信號;
ComEventFrame:表示硬件檢測到一個數據幀錯誤;
ComEvenRxover:表示接收緩 沖區溢出;
ComEventTxFull:表示輸出緩沖區已滿;
ComEvReceive:表示接手到了 Rthreshold個字符;
ComEvEOF:表示接受到了EOF字符(ASCII字符26)。
編程時用 SelectCase語句,根據不同的CommEvent屬性值,去執行不同的處理程序。
除了以上所述的通訊錯誤外,在串口通信時,如果數 據傳輸突然中斷,對串口的讀寫操作可能會進入無限期的等待狀態, 為避免這種情況發生, 必須設置串口讀寫操作的等待時間, 等待超時后,串口的讀寫操作將被主動放棄,這樣即使數據傳輸突然中斷程序也不會被掛起或阻塞。可以根據具體要求規定串口讀寫操作的最長時間值,即串口讀寫 必須在這段時間內完成,否則提示串口操作失敗。
5串口通訊實例
本實例是一個采集設備電流及功率 的通訊程序,采集儀為橫河WT230數字功率計,因為要采集的數據量不大,且工程結構簡單,故采用Mscomm控件的形式進行串口讀寫操作。
具體實現步驟如下:
(1) 在窗體Form上添加兩個重要的控件:Timer1和Mscomm1;
(2) 在程序的Form_Load事件過程中添加如下代碼:
MSComm1.CommPort=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:WAIT 1" + Chr(13) + Chr(10)
MSComm1.Output = "MEASURE:NORMAL:VALUE?" + Chr(13) + Chr(10)
上述語句是將讀取指令發送到串口輸出緩沖區(注意每個命令字符串后都要加上回車和換行符Chr(13) + Chr(10)),再由系統將其自動發送給通過RS232通信線與計算機 端口連接的WT230數字功率計,功率計在接收到命令字符串后,經過自身的單片機處理,就自動地把它測到的電壓、電流、功率數據以固定的格式和字符形式通 過RS232通信線傳回至計算機,計算機程序從輸入緩沖區讀取這些字符數據并利用VB字符處理函數(如Val,InStr)進行處理就得到了所要的數據, 下面是具體的程序代碼。
Dim bytinput() as byte ‘注意要將bytinput定義為不定長數組
Dim strtem As String
Dim i as Integer
bytinput =MSComm1.Input ‘將輸入緩沖區數據讀入給字節型數組bytinput
For i = 0 To UBound(bytinput)
strtem = strtem + Chr(bytinput(i)) ‘字節數組中的ASCII碼值轉換成相應 Next 的字符
得到 的strtem字符就形象的展示了電流、電壓和功率值。對于WT230而言,它的數據結構是這樣的,每個數據之間由逗號字符“,”隔開,每個數據以用科學計數法表示,且每個數據以字符“E”分為前半部分和后半部 分,前半部分為具體的數據(整數形式),后半部分為此數據的指數,指數的底為10。
例如得到strtem的值為“23423E-2,00241E-3,05645E-2”這就表示電壓值為234.23 V,電流值為0.241 A,功率為56.45 W。
6結論
串口通訊的硬件投資少,軟件編程簡單,在低速少量數據傳輸方 面的應用極其廣泛的應用。本文詳細介紹了串口通訊的基本內容及其具體實現方式,讀者可以根據具體情況進行選擇。以上代碼是實現串口通信的核心部分,經過筆 者在多個數據采集系統開發中的應用,具有較強的實用價值。
參 考文獻
1 李朝青.PC機及單片機數據通信技術[M].北京:國防工業出 版社,2002
2 李長林.Visual Basic串口通信技術與典型實例[M].北京:清華大學出版社,2006
3 [美] Microsoft公司著、北京希望電腦公司譯.Microsoft Visual Basic 6.0 控件參考手冊[M],1999
4 朱友芹.新編Windows API參考大全[M].電 子工業出版社,2000
5 MOXA Crop.Pcomm Library Programming Guide,1998
6 范逸之.Visual Basic 與RS232串行通信控制.北京:中國青年出版社,2000
本站論文資源均為來自網絡轉載,免費提供給廣大作者參考,不進行任何贏利,如有版權問題,請聯系管理員刪除! 快速論文發表網(www.6scc.cn)本中心和國內數百家期刊雜志社有良好的合作關系,可以幫客戶代發論文投稿.
投稿郵箱:ksfbw@126.com
客服Q Q:
82702382
聯系電話:15295038833
本站論文資源均為來自網絡轉載,免費提供給廣大作者參考,不進行任何贏利,如有版權問題,請聯系管理員刪除!
上一篇:論文發表 CDMA網絡優化淺析
下一篇:加強民航通信網建設的幾點思考