一種基于狀態(tài)機的串口通信協(xié)議的設(shè)計與實現(xiàn)
摘要:為解決串口通信中的數(shù)據(jù)傳輸容易出錯、可靠性差、安全性不高且容錯能力低等問題,設(shè)計并實現(xiàn)了一種基于狀態(tài)機的串口通信協(xié)議,并將此協(xié)議應(yīng)用到稱重儀表的上位機通信中。本文介紹了串口通信協(xié)議的數(shù)據(jù)包格式以及其通信狀態(tài)機,并給出了協(xié)議實現(xiàn)的部分示例代碼及算法流程圖。在數(shù)據(jù)包格式定義中通過設(shè)置起始標(biāo)志、數(shù)據(jù)長度、校驗、結(jié)束標(biāo)志等字段,保證數(shù)據(jù)傳輸?shù)恼_性;并在數(shù)據(jù)包接收過程中引入狀態(tài)機方法,簡化編程模型的同時,提高了通信過程的可靠性、安全性以及數(shù)據(jù)傳輸?shù)娜蒎e能力。
本文引用地址:http://www.ex-cimer.com/article/154913.htm關(guān)鍵詞:狀態(tài)機;串口;通信協(xié)議;ATmega168;線程
串行通信接口(如RS232、RS485等)作為計算機與單片機交互數(shù)據(jù)的主要接口,廣泛用于各類儀器儀表、工業(yè)監(jiān)測及自動控制領(lǐng)域中。通信協(xié)議是需要通信的雙方所達(dá)成的一種約定,它對包括數(shù)據(jù)格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題作出統(tǒng)一規(guī)定,在雙方的通信中必須共同遵守。在實際應(yīng)用系統(tǒng)中,如果缺少一個嚴(yán)格、合理、規(guī)范的串口通信協(xié)議,將無法保證數(shù)據(jù)傳輸?shù)恼_性及通信的可靠性。因此,文中提出一種基于狀態(tài)機串口通信協(xié)議的設(shè)計方法:通過合理地設(shè)置數(shù)據(jù)包格式來保證了數(shù)據(jù)傳輸?shù)恼_性:引入了狀態(tài)機方法,簡化了協(xié)議的實現(xiàn)難度,提高了通信的可靠性,同時使通信過程具有較高的容錯能力。
1 定義數(shù)據(jù)包格式
串口通信中最小的的信息單元是數(shù)據(jù)幀。一個數(shù)據(jù)幀通常包括起始位、數(shù)據(jù)位、結(jié)束位,另外還可以包含用于檢測傳輸錯誤的“奇偶校驗位”,每個數(shù)據(jù)幀中傳輸?shù)臄?shù)據(jù)位可以有5、6、7、8或9個。
實際通信過程中,數(shù)據(jù)的發(fā)送是一幀一幀地進行,當(dāng)被傳輸?shù)臄?shù)據(jù)超過一幀時(例如浮點型數(shù)據(jù)),如果沒有對數(shù)據(jù)幀進行必要的打包,發(fā)送出去的數(shù)據(jù)將會很難被數(shù)據(jù)接收方解釋與分析,進而造成數(shù)據(jù)傳輸混亂與錯誤。因此,在一般應(yīng)用中有必要將數(shù)據(jù)幀組裝成數(shù)據(jù)包再發(fā)送。為了保證數(shù)據(jù)傳輸?shù)恼_性,將數(shù)據(jù)包定義為如圖1所示。
1)起始標(biāo)志表示開始接收一個新的數(shù)據(jù)包,本協(xié)議中規(guī)定為0x55。
2)數(shù)據(jù)長度命令和附加數(shù)據(jù)共占的字節(jié)數(shù)。設(shè)置此字段,可方便接收方識別數(shù)據(jù)包的長度并能夠準(zhǔn)確地接收數(shù)據(jù)包。
3)命令用來說明數(shù)據(jù)包的用途。
4)附加數(shù)據(jù) 當(dāng)命令不同時,含義不同。例如,當(dāng)命令表示數(shù)據(jù)包的用途為質(zhì)量時,附加數(shù)據(jù)用來保存質(zhì)量數(shù)據(jù)。
5)校驗是對命令字段與附加數(shù)據(jù)字段的所有字節(jié)數(shù)據(jù)的異或校驗。
6)結(jié)束標(biāo)志表示該數(shù)據(jù)包結(jié)束,本協(xié)議中規(guī)定為0x56。
另外,在多機通信中,數(shù)據(jù)包中還應(yīng)增加源地址與設(shè)備地址等字段。這里主要介紹上位機與下位機之間的通信,因此無需設(shè)置源地址與設(shè)備地址等字段。
2 通信狀態(tài)機
2.1 狀態(tài)機簡介
狀態(tài)機由事物所處的狀態(tài)及引發(fā)狀態(tài)變化的外部事件兩部分組成。在軟件編程中,事物所處的狀態(tài)可以描述為某個程序片斷或函數(shù),而引發(fā)狀態(tài)變化的處部條件可以理解為條件判斷語句,當(dāng)條件為真時,事物的狀態(tài)發(fā)生變化。事物發(fā)生變化前的狀態(tài)稱為現(xiàn)態(tài),變化后的狀態(tài)稱為次態(tài),程序中可以通過不同的數(shù)字對不同的狀態(tài)進行編號?,F(xiàn)態(tài)到次態(tài)的變化可以通過狀態(tài)變量值的改變來描述。
本協(xié)議中需要傳輸?shù)幕拘畔卧菙?shù)據(jù)包,數(shù)據(jù)包一般包含多個數(shù)據(jù)幀。實際傳輸過程中,數(shù)據(jù)的傳輸通常是一幀一幀地進行,數(shù)據(jù)包是被拆分成若干幀數(shù)據(jù)后再進行傳輸,數(shù)據(jù)接受方也是分幀接受一個數(shù)據(jù)包。數(shù)據(jù)接受方在解釋與分析數(shù)據(jù)包時可能存在兩個問題:
1)識別并接收完整的數(shù)據(jù)包
對于數(shù)據(jù)接收方,一個數(shù)據(jù)包是分若干批到來,在識別包頭與包尾時,也就是幀同步問題,具體編程時存在難度,特別對于已接收部分與未接收部分以及數(shù)據(jù)接收的進度及狀態(tài)的處理。
2)數(shù)據(jù)傳輸時的容錯能力
數(shù)據(jù)傳輸過程中已經(jīng)出現(xiàn)錯誤時,系統(tǒng)應(yīng)該具有擺脫錯誤狀態(tài),恢復(fù)到正常狀態(tài)的能力。例如,當(dāng)一個數(shù)據(jù)包只傳輸完一部分時,因為未知故障,下一個數(shù)據(jù)包就開始傳輸,系統(tǒng)應(yīng)該能識別出傳輸錯誤,拋棄前一個出錯的數(shù)據(jù)包,并且能正確接收下一個數(shù)據(jù)包。實際編程時處理這種問題難度較大,結(jié)果很可能會出現(xiàn)將第一個數(shù)據(jù)包的前一部分與第二個數(shù)據(jù)包的前一部分拼裝成一個新的數(shù)據(jù)包的情況,這就損失了兩個數(shù)據(jù)包,最嚴(yán)重的結(jié)果可能是系統(tǒng)無法從錯誤中恢復(fù),這就嚴(yán)重降低了系統(tǒng)的安全性與可靠性。
為解決上面提出的兩個問題,本協(xié)議引入了狀態(tài)機。在狀態(tài)機中,狀態(tài)的變化依賴于外部觸發(fā)條件,當(dāng)條件滿足時,狀態(tài)將發(fā)生變化。本協(xié)議中將數(shù)據(jù)包接收的各個階段定義為不同的狀態(tài),將接收一幀新的數(shù)據(jù)或數(shù)據(jù)處理的結(jié)果作為外部觸發(fā)條件,從而達(dá)到狀態(tài)改變的目的,最終完成一個數(shù)據(jù)包的接收與校驗。
2.2 串口通信狀態(tài)圖
串口通信協(xié)議中,發(fā)送數(shù)據(jù)包時一般不需引入狀態(tài)機,這主要是為提高發(fā)送速率和簡化編程模型而考慮的。本協(xié)議中主要針對數(shù)據(jù)接收過程建立狀態(tài)機。數(shù)據(jù)接收狀態(tài)圖如圖2所示。
串口通信的數(shù)據(jù)接收過程如下:當(dāng)未開始接收數(shù)據(jù)包或發(fā)現(xiàn)數(shù)據(jù)傳輸出錯時,系統(tǒng)進入空閑狀態(tài);當(dāng)數(shù)接收到數(shù)據(jù)包0x55(起始標(biāo)志)時,變?yōu)槭盏狡鹗紭?biāo)志狀態(tài),如果收到的數(shù)據(jù)不為0x55,系統(tǒng)繼續(xù)保持空閑狀態(tài);進入收到起始標(biāo)志狀態(tài)后,新接收到的任何數(shù)據(jù)將被當(dāng)作數(shù)據(jù)包中命令與附加數(shù)據(jù)的總字節(jié)數(shù)(記為LEN),系統(tǒng)進入收到數(shù)據(jù)長度狀態(tài);繼續(xù)接收新的數(shù)據(jù),直至接到新收到的數(shù)據(jù)總字節(jié)數(shù)達(dá)到LEN +2,進入檢驗結(jié)束標(biāo)志狀態(tài);這時可以檢驗結(jié)束標(biāo)志是否為0x56,如果是,說明傳輸正確,否則傳輸出錯,出錯后應(yīng)查找接收緩沖區(qū)中本數(shù)據(jù)包的起始標(biāo)志后有無其它起始標(biāo)志,如果沒有發(fā)現(xiàn)起始標(biāo)志,系統(tǒng)應(yīng)進入空閑狀態(tài),否則應(yīng)直接進入接收到起始標(biāo)志狀態(tài),這樣可提高系統(tǒng)容錯能力,方便系統(tǒng)從錯誤中恢復(fù)。檢驗結(jié)柬標(biāo)志正確后,進入數(shù)據(jù)校驗狀態(tài);校驗結(jié)果如果正確,數(shù)據(jù)包接收完成,否則說明傳輸出錯,系統(tǒng)進入空閑狀態(tài)。
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評論