VB.Net 串口通信用法


 

    對於初次使用VB.Net 的 SerialPort  編寫串口通信的朋友,這些是很必要的知識,也是編寫串口通信程序前的知識准備。

 

1、使用 SerialPort 設置串口屬性

    進行串口通訊時,需要設置一些相關參數,可以通過設置SerialPort 類的屬性來進行。串口屬性主要包括

 .PortName 串口名稱,COM1, COM2等。

.BaudRate 波特率,也就是串口通訊的速度,進行串口通訊的雙方其波特率需要相同,如果用PC連接其他非PC系統,一般地,波特率由非PC系統決定。

.Parity 奇偶校驗。可以選取枚舉Parity中的值

.DataBits 數據位

.StopBits 停止位,可以選取枚舉StopBits中的值

.Handshake 握手方式,也就是數據流控制方式,可以選取枚舉Handshake中的值

 

對其中幾個關鍵術語解釋:

a,波特率:這是一個衡量通信速度的參數。它表示每秒鍾傳送的bit的個數。例如300波特表示每秒鍾發送300個bit。當我們提到時鍾周期時,我們就是指波特率例如如果協議需要4800波特率,那么時鍾是4800Hz。這意味着串口通信在數據線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠遠大於這些值,但是波特率和距離成反比。高波特率常常用於放置的很近的儀器間的通信,典型的例子就是GPIB設備的通信。

b,數據位:這是衡量通信中實際數據位的參數。當計算機發送一個信息包,實際的數據不會是8位的,標准的值是5、7和8位。如何設置取決於你想傳送的信息。比如,標准的ASCII碼是0~127(7位)。擴展的ASCII碼是0~255(8位)。如果數據使用簡單的文本(標准 ASCII碼),那么每個數據包使用7位數據。每個包是指一個字節,包括開始/停止位,數據位和奇偶校驗位。由於實際數據位取決於通信協議的選取,術語“包”指任何通信的情況。

c,停止位:用於表示單個包的最后一位。典型的值為1,1.5和2位。由於數據是在傳輸線上定時的,並且每一個設備有其自己的時鍾,很可能在通信中兩台設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鍾同步的機會。適用於停止位的位數越多,不同時鍾同步的容忍程度越大,但是數據傳輸率同時也越慢。

d,奇偶校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對於偶和奇校驗的情況,串口會設置校驗位(數據位后面的一位),用一個值確保傳輸的數據有偶個或者奇個邏輯高位。例如,如果數據是011,那么對於偶校驗,校驗位為0,保證邏輯高的位數是偶數個。如果是奇校驗,校驗位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查數據,簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收數據是否不同步。

e,握手方式(數據流控制方式):

硬件流控制
    硬件流控制常用的有RTS/CTS流控制和DTR/DSR(數據終端就緒/數據設置就緒)流控制。 硬件流控制必須將相應的電纜線連上,用RTS/CTS(請求發送/清除發送)流控制時,應將通訊兩端的RTS、CTS線對應相連,數據終端設備(如計算機)使用RTS來起始調制解調器或其它數據通訊設備的數據流,而數據通訊設備(如調制解調器)則用CTS來起動和暫停來自計算機的數據流。這種硬件握手方式的過程為:我們在編程時根據接收端緩沖區大小設置一個高位標志(可為緩沖區大小的75%)和一個低位標志(可為緩沖區大小的25%),當緩沖區內數據量達到高位時,我們在接收端將CTS線置低電平(送邏輯0),當發送端的程序檢測到CTS為低后,就停止發送數據,直到接收端緩沖區的數據量低於低位而將CTS置高電平。RTS則用來標明接收設備有沒有准備好接收數據。 常用的流控制還有還有DTR/DSR(數據終端就緒/數據設置就緒)。我們在此不再詳述。由於流控制的多樣性,我個人認為,當軟件里用了流控制時,應做詳細的說明,如何接線,如何應用。


軟件流控制
    由於電纜線的限制,我們在普通的控制通訊中一般不用硬件流控制,而用軟件流控制。一般通過XON/XOFF來實現軟件流控制。常用方法是:當接收端的輸入緩沖區內數據量超過設定的高位時,就向數據發送端發出XOFF字符(十進制的19或Control-S,設備編程說明書應該有詳細闡述),發送端收到XOFF字符后就立即停止發送數據;當接收端的輸入緩沖區內數據量低於設定的低位時,就向數據發送端發出XON字符(十進制的17或Control-Q),發送端收到XON字符后就立即開始發送數據。一般可以從設備配套源程序中找到發送的是什么字符。 應該注意,若傳輸的是二進制數據,標志字符也有可能在數據流中出現而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會有這個問題。

  

2、打開與關閉串口

    在創建一個SerialPort 對象,設置串口屬性后,可以通過 Open()方法打開串口。數據讀寫完成后,可以通過Close()方法關閉串口。

根據經驗,對於有些系統,在打開串口后,還需要將RtsEnable設置為True,這樣才能讀寫數據,否則不能正常讀寫數據。

 

3、讀寫行數據

    雙方通訊時,一般都需要定義通訊協議,即使最簡單的通過串口發送文本聊天的程序。

    通常是在當一方按下回車時,將其所數據的文本連同換行符發給另一方。在這個通訊事例中,協議楨是通過換行符界定的,每一楨數據都被換行符隔開,這樣就很容易識別出通訊雙發發送的信息。

    在以上的例子中,可以用WriteLine()來發送數據,用ReadLine()來讀取數據。WriteLine發送完數據后,會將換行符作為數據也發送給對方。ReadLine()讀取數據時,直至遇到一個換行符,然后返回一個字符串代表一行信息。換行符可以通過SerialPort 的屬性NewLine來設置。一般地,Windows將CrLn作為換行符,而在Linux下,換行符則只用一個Ln表示。

    ReadLine()方法是阻塞的,直至遇到一個換行符后返回。在讀取數據時,如果一直沒有遇到換行符,那么在等待ReadTimeout時間后,拋出一個TimeoutException。默認情況下,ReadTimeout為InfiniteTimeout。這樣,ReadLine一直處於阻塞狀態,直至有新一行數據到達。

    WriteLine()方法也是阻塞的,如果另一方不能及時接收數據,就會引起TimeoutException異常。

由於ReadLine()和WriteLine()方法都是阻塞式的,在程序使用SerialPort 進行串口通訊時,一般應該把讀寫操作交由其他線程處理,避免因為阻塞而導致程序不響應。

 

4、讀寫字節或字符數據

    對於字節或字符數據,用Read()方法來讀數據,該方法需要一個字節或字符數組作為參數來保存讀取的數據,結果返回實際讀取的字節或字符數。寫數據使用Write()方法,該方法可以將字節數組、字符數據或字符串發送給另一方。

    如果通訊雙方交換的數據位字節流數據,要構建一個使用的串口通訊程序,那么雙方應該定義數據楨格式。通常數據楨由楨頭和楨尾來界定。 

    發送數據比較簡單,只需要將構造好的數據用Write()方法發送出去即可。

    接收數據則比較復雜,通訊是以字節流的形式到達的,通過調用一次Read()方法並不能確保所讀取的數據就是完整一楨。因此需要將每次讀取的數據整合在一起,對整合后的數據進行分析,按照定義的楨格式,通過楨頭和楨尾,將楨信息從字節流中抽取出來,這樣才能獲取有意義的信息。

    除了利用Read()方法來讀數據,還可以使用ReadExisting()方法來讀取數據。該方法讀取當前所能讀到的數據,以字符串的形式返回。

 

 5、事件

    SerialPort 提供了DataReceived事件。當有數據進入時,該事件被觸發。該事件的觸發由操作系統決定,當有數據到達時,該事件在輔助線程中被觸發。輔助線程的優先級比較低,因此並不能確保每個字節的數據到達時,該事件都被觸發。

    在使用該事件接收數據時,最好對定義通訊協議格式,添加楨頭和楨尾。在DataReceived事件中接收數據時,把數據放在數組中或字符串中緩沖起來,當接收的包含楨頭和楨尾的完整數據時,在進行處理,另外,為了有效地接收數據,可以在每次讀取數據后,加入System.Threading.Thread.Sleep方法進行演示。

 

6、其他

    a)、用跳線使串口的第2、3針連接,可以在本地計算機上實現串口通信,所以,通過串口的第2、3針的連接可以對程序進行檢測。

    b)、串口通信基本接線方法 

          目前較為常用的串口有9針串口(DB9)和25針串口(DB25),通信距離較近時(<12m),可以用電纜線直接連接標准RS232端口(RS422,RS485較遠),若距離較遠,需附加調制解調器(MODEM)。
最為簡單且常用的是三線制接法,即地、接收數據和發送數據三腳相連,本文只涉及到最為基本的接法,且直接用RS232相連。

    c)、DB9和DB25的常用信號腳說明

9針串口(DB9   25針串口(DB25
針號 功能說明 縮寫   針號 功能說明 縮寫
1 數據載波檢測 DCD   8 數據載波檢測 DCD
2 接收數據 RXD   3 接收數據 RXD
3 發送數據 TXD   2 發送數據 TXD
4 數據終端准備 DTR   20 數據終端准備 DTR
5 信號地 GND   7 信號地 GND
6 數據設備准備好 DSR   6 數據准備好 DSR
7 請求發送 RTS   4 請求發送 RTS
8 清除發送 CTS   5 清除發送 CTS
9 振鈴指示 DELL   22 振鈴指示 DELL

 

 

    d)、串口通信接線方法(三線制)
        串口傳輸數據只要有接收數據針腳和發送針腳就能實現:同一個串口的接收腳和發送腳直接用線相連,兩個串口相連或一個串口和多個串口相連,對9針串口和25針串口,均是2與3直接相連;
        上面表格是對微機標准串行口而言的,還有許多非標准設備,如接收GPS數據或電子羅盤數據,只要記住一個原則:接收數據針腳(或線)與發送數據針腳(或線)相連,彼此交叉,信號地對應相接,就可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM