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、以太網,不難看出,物理層/物理介面變化不大,而協議/資料鏈路層卻越來越復雜,
這也說明了,傳輸資料的可靠性,不能過于依賴物理層,而應該依賴協議上的一些機制(校驗、重傳等),
要是實作串口通訊,只許連接這三根線就好了:
如果地線不連(共地),兩個設備識別出來的電壓就會產生很大的誤差,出現資料亂飄的情況,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131793.html
標籤:其他
上一篇:電動汽車在受控電池能量
