1. 程式人生 > >STM32之串列埠原理

STM32之串列埠原理

串列埠通訊定義

  串列埠是計算機上一種非常通用裝置通訊的協議。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議;很多GPIB相容的裝置也帶有RS-232口。同時,串列埠通訊協議也可以用於獲取遠端採集裝置的資料。

串列埠通訊原理

  串列埠通訊的概念非常簡單,串列埠按位(bit)傳送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一根線傳送資料的同時用另一根線接收資料。它很簡單並且能夠實現遠距離通訊。比如IEEE488定義並行通行狀態時,規定裝置線總長不得超過20米,並且任意兩個裝置間的長度不得超過2米;而對於串列埠而言,長度可達1200米。典型地,串列埠用於ASCII碼字元的傳輸。通訊使用3根線完成:(1)地線,(2)傳送,(3)接收。由於串列埠通訊是非同步的,埠能夠在一根線上傳送資料同時在另一根線上接收資料。其他線用於握手,但是不是必須的。串列埠通訊最重要的引數是波特率、資料位、停止位和奇偶校驗。對於兩個進行通訊的埠,這些引數必須匹配:   

  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個邏輯高位。高位和低位不真正的檢查資料,簡單置位邏輯高或者邏輯低校驗。這樣使得接收裝置能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通訊或者是否傳輸和接收資料是否不同步。

基本接線方法

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

  1.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

  2.RS232C串列埠通訊接線方法(三線制)
  首先,串列埠傳輸資料只要有接收資料針腳和傳送針腳就能實現:同一個串列埠的接收腳和傳送腳直接用線相連,兩個串列埠相連或一個串列埠和多個串列埠相連

  · 同一個串列埠的接收腳和傳送腳直接用線相連 對9針串列埠和25針串列埠,均是2與3直接相連; 
  · 兩個不同串列埠(不論是同一臺計算機的兩個串列埠或分別是不同計算機的串列埠) 

  上面表格是對微機標準序列口而言的,還有許多非標準裝置,如接收GPS資料或電子羅盤資料,只要記住一個原則:接收資料針腳(或線)與傳送資料針腳(或線)相連,彼此交叉,訊號地對應相接,就能百戰百勝。

  3.串列埠除錯中要注意的幾點:

  串列埠除錯時,準備一個好用的除錯工具,如串列埠除錯助手、串列埠精靈等,有事半功倍之效果; 強烈建議不要帶電插撥串列埠,插撥時至少有一端是斷電的,否則串列埠易損壞。 

  單工、半雙工和全雙工的定義

  如果在通訊過程的任意時刻,資訊只能由一方A傳到另一方B,則稱為單工。
  如果在任意時刻,資訊既可由A傳到B,又能由B傳A,但只能由一個方向上的傳輸存在,稱為半雙工傳輸。
  如果在任意時刻,線路上存在A到B和B到A的雙向訊號傳輸,則稱為全雙工。

  電話線就是二線全雙工通道。 由於採用了回波抵消技術,雙向的傳輸訊號不致混淆不清。雙工通道有時也將收、發信道分開,採用分離的線路或頻帶傳輸相反方向的訊號,如回線傳輸。

  奇偶校驗

  序列資料在傳輸過程中,由於干擾可能引起資訊的出錯,例如,傳輸字元‘E’,其各位為:
  0100,0101=45H
  D7 D0
  由於干擾,可能使位變為1,這種情況,我們稱為出現了“誤碼”。我們把如何發現傳輸中的錯誤,叫“檢錯”。發現錯誤後,如何消除錯誤,叫“糾錯”。
  最簡單的檢錯方法是“奇偶校驗”,即在傳送字元的各位之外,再傳送1位奇/偶校驗位。可採用奇校驗或偶校驗。
  奇校驗:所有傳送的數位(含字元的各數位和校驗位)中,“1”的個數為奇數,如:
  1 0110,0101
  0 0110,0001
  偶校驗:所有傳送的數位(含字元的各數位和校驗位)中,“1”的個數為偶數,如:
  1 0100,0101
  0 0100,0001

  奇偶校驗能夠檢測出資訊傳輸過程中的部分誤碼(1位誤碼能檢出,2位及2位以上誤碼不能檢出),同時,它不能糾錯。在發現錯誤後,只能要求重發。但由於其實現簡單,仍得到了廣泛使用。

  有些檢錯方法,具有自動糾錯能力。如迴圈冗餘碼(CRC)檢錯等。

串列埠通訊流控制

  我們在序列通訊處理中,常常看到RTS/CTS和XON/XOFF這兩個選項,這就是兩個流控制的選項,目前流控制主要應用於調變解調器的資料通訊中,但對普通RS232程式設計,瞭解一點這方面的知識是有好處的。那麼,流控制在序列通訊中有何作用,在編制序列通訊程式怎樣應用呢?這裡我們就來談談這個問題。 

  1.流控制在序列通訊中的作用

  這裡講到的“流”,當然指的是資料流。資料在兩個串列埠之間傳輸時,常常會出現丟失資料的現象,或者兩臺計算機的處理速度不同,如桌上型電腦與微控制器之間的通訊,接收端資料緩衝區已滿,則此時繼續傳送來的資料就會丟失。現在我們在網路上通過MODEM進行資料傳輸,這個問題就尤為突出。流控制能解決這個問題,當接收端資料處理不過來時,就發出“不再接收”的訊號,傳送端就停止傳送,直到收到“可以繼續傳送”的訊號再發送資料。因此流控制可以控制資料傳輸的程序,防止資料的丟失。 PC機中常用的兩種流控制是硬體流控制(包括RTS/CTS、DTR/CTS等)和軟體流控制XON/XOFF(繼續/停止),下面分別說明。 


  2.硬體流控制

  硬體流控制常用的有RTS/CTS流控制和DTR/DSR(資料終端就緒/資料設定就緒)流控制。

  硬體流控制必須將相應的電纜線連上,用RTS/CTS(請求傳送/清除傳送)流控制時,應將通訊兩端的RTS、CTS線對應相連,資料終端裝置(如計算機)使用RTS來起始調變解調器或其它資料通訊裝置的資料流,而資料通訊裝置(如調變解調器)則用CTS來起動和暫停來自計算機的資料流。這種硬體握手方式的過程為:我們在程式設計時根據接收端緩衝區大小設定一個高位標誌(可為緩衝區大小的75%)和一個低位標誌(可為緩衝區大小的25%),當緩衝區內資料量達到高位時,我們在接收端將CTS線置低電平(送邏輯0),當傳送端的程式檢測到CTS為低後,就停止傳送資料,直到接收端緩衝區的資料量低於低位而將CTS置高電平。RTS則用來標明接收裝置有沒有準備好接收資料。

  常用的流控制還有還有DTR/DSR(資料終端就緒/資料設定就緒)。我們在此不再詳述。由於流控制的多樣性,我個人認為,當軟體裡用了流控制時,應做詳細的說明,如何接線,如何應用。
 

  3.軟體流控制

  由於電纜線的限制,我們在普通的控制通訊中一般不用硬體流控制,而用軟體流控制。一般通過XON/XOFF來實現軟體流控制。常用方法是:當接收端的輸入緩衝區內資料量超過設定的高位時,就向資料傳送端發出XOFF字元(十進位制的19或Control-S,裝置程式設計說明書應該有詳細闡述),傳送端收到XOFF字元後就立即停止傳送資料;當接收端的輸入緩衝區內資料量低於設定的低位時,就向資料傳送端發出XON字元(十進位制的17或Control-Q),傳送端收到XON字元後就立即開始傳送資料。一般可以從裝置配套源程式中找到傳送的是什麼字元。

  應該注意,若傳輸的是二進位制資料,標誌字元也有可能在資料流中出現而引起誤操作,這是軟體流控制的缺陷,而硬體流控制不會有這個問題。