天天看點

詳解RS232/UART/協定/序列槽通信

RS232基本概念:

序列槽通信時串行通信裡面的異步方式 UART是序列槽通信裡面的一種協定,通俗的講:

序列槽(基本上) = RS232 = UART = USART = U(S/A)RT

注:

①RS232是協定名稱,而序列槽還應該包括了其它協定,如:RS485、RS422等;

②U是通用,A是異步,S是同步,是以,UART跟USRT差別在于有無同步時鐘,是以有的序列槽會有三根線(地線除外),多了一根時鐘線;

距離稍微遠一點,同步通信就不太合适了,通着通着就亂了;

③RS232發送是靠TXD和GND之間的電壓來傳資料(接收跟發送雷同),是共模電壓,抗幹擾能力差,導緻傳輸距離非常有限;

④被廣泛使用的原因:因為RS232的簡單、低成本,是以不管是單片機、ARM、DSP都配了這種接口;

⑤真正裝置間通信肯定是RS232電平的序列槽資料,抗幹擾能力強,TTL電平是電路闆上使用的電平,是以真正傳輸時,肯定會進行RS232和TTL之間的轉換。

RS232的協定

因為是異步的通信,那麼如何保證資料發送的可靠呢,那麼就需要幾個扛大旗的人,如起始位,停止位;

典型的其中一種消息協定主要分以下幾個部分:起始位、資料位、校驗位、停止位,注意:這裡用的是位(bit)。

單純地按照協定規定的去做,會出現一些問題。

1、奇偶校驗的校驗能力太差。

2、傳錯一個資料,沒法重傳。

3、在總線上挂了幾個從機,主機如何區分是哪台從機發出的資料(有的裝置不能把校驗位當位址位用)。

4、如果沒有成功發送停止位,那麼接收端會不會一直等待。

5、總線上傳錯了一組資料,沒法定位是哪個地方(哪個位)出問題。

鑒于以上諸多問題,我們想到了一種解決辦法,就是封裝成幀。一幀資料包含多個byte,而一個byte的資料包含多個bit(起始位、資料位等)。

自定義協定

根據實際需求自定義協定。下面舉個例子(非通用協定/準則),并以“域”來表示協定裡面各個功能子產品。

1、幀起始。

幀起始,一般以0x55或者0xaa作為起始的标志,為什麼要用這種數字?

十六進制的5,轉為二進制是0101;十六進制的A,轉為二進制是1010。這樣,0x55,就是01010101了。

0和1交替出現,一來友善接收方實作自适應波特率,二來避免幹擾。

a、通過檢測0和1之間的時間間隔,即可知道該幀資料的波特率。

b、如果設為0xff,那麼,在總線上出現一個幹擾,接收端很有可能誤以為要接收資料。

2、指令域。

指令域,可以随意一點,如:設上行為0x1d,下行為0x3a,重傳為0xb7,應答為0x89。

3、位址域(可選)。

位址域,也可以随意一點,如果所有裝置的位址均不相同,那就隻具備點對點的功能。

當然,你也可以視實際情況,把某幾台裝置的位址設為一樣,這樣就有點對多點的功能。

4、長度域(可選)。

如果是發送固定長度的幀,是可以不使用長度域;如果是不固定長度的幀,則可以加上。

4、資料域。

資料域,一般由資料個數和資料組成。

比如,你要傳3個數,分别是0x00到0x02。那麼資料域就是0x03 0x00 0x01 0x02。

5、校驗域。

校驗域,可以使用校驗和或者CRC校驗。如,使用CRC16算法話,校驗域為2個byte。

一般除了幀起始和幀結束以外,都送進CRC校驗。

好了,這樣的話,我要發一個上行的資料,到位址為0x0a的裝置,一共3個資料(固定長度),分别是0xa0,0xb0,0xc0。

那麼一幀資料就是:0x55 0x1d 0x0a 0x03 0xa0 0xb0 0xc0 0x53 0xfb

隻要把上面這一幀資料,一個byte一個byte地發送出去,即可。

使用CRC-16對該幀(除去幀起始)進行計算,可以得到0x53FB。如下圖所示。

6、應答和重傳。

如果接收端,收到一幀資料,經過CRC校驗,資料正确,這時得傳一幀簡易的應答幀,以告訴主機,這個幀接收成功。

應答幀, 如:0x55 0x89 0xa6 0xc1。

如果接收端,收到一幀資料,經過CRC校驗,發現資料有錯,這時得傳一幀簡易的重傳幀,以請求重傳。

重傳幀,如:0x55 0xb7 0x76 0x40。

這樣,序列槽的功能就強大了很多

總結:

不管是RS232、或者其他協定,一般是都以byte為機關,傳輸資料的。如果你想把12位的ADC資料,通過序列槽發到PC機,那麼,你得分成兩個byte,高位補零。

從RS232到USB、以太網,不難看出,實體層/實體接口變化不大,而協定/資料鍊路層卻越來越複雜。

這也說明了,傳輸資料的可靠性,不能過于依賴實體層,而應該依賴協定上的一些機制(校驗、重傳等)。

要是實作序列槽通訊,隻許連接配接這三根線就好了:

如果地線不連(共地),兩個裝置識别出來的電壓就會産生很大的誤差,出現資料亂飄的情況。

詳解RS232/UART/協定/序列槽通信

繼續閱讀