從軟件的角度來看,所有的通信都是一串字節(jié)(叫做數(shù)據(jù)幀)的連續(xù)傳輸。軟件需要采用適當?shù)臋C制來保證接收端能夠正確識別出一個完整的數(shù)據(jù)幀、能夠檢查接收到的數(shù)據(jù)幀是正確的、在傳輸發(fā)生錯誤時有合適的恢復(fù)機制。為此就需要定義一個合適的數(shù)據(jù)幀格式。
數(shù)據(jù)幀的提取
為了識別出一個完整的數(shù)據(jù)幀,基本上有兩個機制:一是在軟件上規(guī)定字節(jié)之間的間隔最大值,一旦兩個字節(jié)間的間隔超過某個閾值,就認為一個數(shù)據(jù)幀結(jié)束;另一種機制不對字節(jié)間的間隔作規(guī)定,而是用特殊的字節(jié)來定義數(shù)據(jù)報的開始和結(jié)束,當收到該特殊字節(jié)時,就認為一個數(shù)據(jù)幀的傳輸已完成。采用第一種機制的,比如Modbus-RTU。就是規(guī)定了同一個數(shù)據(jù)幀的字節(jié)間隔不能大于1.5個字節(jié)的傳輸時間,一旦大于該間隔,則認為前一個幀的傳輸已經(jīng)結(jié)束,或者出錯。同時為了保證不同數(shù)據(jù)幀之間有足夠的間隔,還規(guī)定了兩個數(shù)據(jù)幀之間最少插入3.5個字節(jié)的空閑位。下圖摘自Modbus協(xié)議,表示了一個正確的數(shù)據(jù)幀、錯誤的數(shù)據(jù)幀以及數(shù)據(jù)幀之間的間隔。同時在數(shù)據(jù)報中引入了CRC,用于檢出數(shù)據(jù)幀層面的傳輸錯誤。
第二種機制需要選用一個特殊字節(jié)作為幀頭幀尾(也可以給幀頭幀尾選用不同的字節(jié)),比如說,選用0xFF作為幀頭幀尾字節(jié),也即發(fā)送端在每個數(shù)據(jù)幀的頭尾都插入至少一個0xFF,接收端收到該字節(jié)就結(jié)束上一個幀的接收,同時從下一個非0xFF字節(jié)開始一個新的數(shù)據(jù)幀的接收。但該機制有一個問題,那就是所選的特殊字節(jié)(此處是0xFF)也可能是數(shù)據(jù)幀中的一個有效字節(jié),如果不作特殊處理,接收端就可能把這個數(shù)據(jù)幀中的字節(jié)誤認為是數(shù)據(jù)幀的結(jié)束標識,從而導(dǎo)致接收錯誤。因此,此處采取字節(jié)替換的特殊處理,以消除在數(shù)據(jù)幀的中間出現(xiàn)的特殊字節(jié),以下是一個例子。
在此處,選0xFE作為字節(jié)替換的標識字節(jié),將0xFF替換成0xFE 0x0F。由于0xFE是字節(jié)替換的標志,也成了一個特殊字符,同樣需要進行替換。在上圖中,將0xFE替換成0xFE 0x0E。
采用該機制時,發(fā)送端對數(shù)據(jù)幀中的所有0xFF,0xFE進行替換。在接收端則進行反向替換。如果在接收端的0xFE后面的字節(jié)收到非0x0F,0x0E的字符,說明發(fā)生了傳輸錯誤,丟棄已經(jīng)接收的內(nèi)容,重新搜索幀頭字符開始一個新數(shù)據(jù)幀的接收。
數(shù)據(jù)幀的校驗
考慮到串口通信有一定的誤碼率,無論是采用那種傳輸方式,必須有錯誤幀檢出機制。通常選用的是CRC。一般用2個字節(jié)或4個字節(jié)。
串口驅(qū)動的實現(xiàn)
在嵌入式系統(tǒng)中,串口驅(qū)動的實現(xiàn)一般有兩個途徑:一個是通過串口的收發(fā)中斷與串口控制器的Buffer直接交換數(shù)據(jù);另一種是通過DMA,利用DMA與串口Buffer交互自動收發(fā)數(shù)據(jù)。
與串口控制器直接交互的方式,實現(xiàn)簡單,既可以實時進行字節(jié)替換以節(jié)省內(nèi)存,也可以方便設(shè)置字節(jié)間的定時器。但頻繁打斷CPU,對有一定BUFFER大小的串口,還可以利用BUFFER進行性能優(yōu)化,而對一些只有一個字節(jié)或兩個字節(jié)BUFFER的串口,就需要一個字節(jié)起一次中斷,如果CPU負荷較重,很容易由于中斷處理不及時而導(dǎo)致字節(jié)丟失,特別是在高波特率的情況。
利用DMA與串口控制器交互的方式,由于不能實時進行字節(jié)替換,需要在放入DMA之前完成字節(jié)替換,導(dǎo)致占用較大內(nèi)存空間。另外對于字節(jié)間間隔敏感的傳輸策略,需要用另外的機制,比如PRS,去操作定時器。用DMA的另一個問題是在接收時無法實時確定幀尾(采用幀頭幀尾模式時),一般只能采用定時器與DMA配合,用字節(jié)流的方式處理接收。
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3667瀏覽量
130918 -
異步串口通信
+關(guān)注
關(guān)注
0文章
1瀏覽量
1354
原文標題:嵌入式系統(tǒng)上的異步串口通信的實現(xiàn)
文章出處:【微信號:mcugeek,微信公眾號:MCU開發(fā)加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論