李 瑩, 賈 彬
(1.太原理工大學 信息工程學院,山西 太原 030024;2.山西省萬立科技有限公司 山西 太原 030032)
串行通信接口(如RS232、RS485等)作為計算機與單片機交互數據的主要接口,廣泛用于各類儀器儀表、工業(yè)監(jiān)測及自動控制領域中。通信協議是需要通信的雙方所達成的一種約定,它對包括數據格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題作出統一規(guī)定,在雙方的通信中必須共同遵守[1]。在實際應用系統中,如果缺少一個嚴格、合理、規(guī)范的串口通信協議,將無法保證數據傳輸的正確性及通信的可靠性。因此,文中提出一種基于狀態(tài)機串口通信協議的設計方法:通過合理地設置數據包格式來保證了數據傳輸的正確性;引入了狀態(tài)機方法,簡化了協議的實現難度,提高了通信的可靠性,同時使通信過程具有較高的容錯能力。
串口通信中最小的的信息單元是數據幀。一個數據幀通常包括起始位、數據位、結束位,另外還可以包含用于檢測傳輸錯誤的“奇偶校驗位”,每個數據幀中傳輸的數據位可以有5、6、7、8 或 9 個[2]。
實際通信過程中,數據的發(fā)送是一幀一幀地進行,當被傳輸的數據超過一幀時(例如浮點型數據),如果沒有對數據幀進行必要的打包,發(fā)送出去的數據將會很難被數據接收方解釋與分析,進而造成數據傳輸混亂與錯誤。因此,在一般應用中有必要將數據幀組裝成數據包再發(fā)送。為了保證數據傳輸的正確性,將數據包定義為如圖1所示。
圖1 串口通信數據包格式Fig.1 Data packet format of serial communication
1)起始標志 表示開始接收一個新的數據包,本協議中規(guī)定為0x55。
2)數據長度 命令和附加數據共占的字節(jié)數。設置此字段,可方便接收方識別數據包的長度并能夠準確地接收數據包。
3)命令 用來說明數據包的用途。
4)附加數據 當命令不同時,含義不同。例如,當命令表示數據包的用途為質量時,附加數據用來保存質量數據。
5)校驗 是對命令字段與附加數據字段的所有字節(jié)數據的異或校驗。
6)結束標志 表示該數據包結束,本協議中規(guī)定為0x56。
另外,在多機通信中,數據包中還應增加源地址與設備地址等字段。這里主要介紹上位機與下位機之間的通信,因此無需設置源地址與設備地址等字段。
狀態(tài)機由事物所處的狀態(tài)及引發(fā)狀態(tài)變化的外部事件兩部分組成。在軟件編程中,事物所處的狀態(tài)可以描述為某個程序片斷或函數,而引發(fā)狀態(tài)變化的處部條件可以理解為條件判斷語句,當條件為真時,事物的狀態(tài)發(fā)生變化。事物發(fā)生變化前的狀態(tài)稱為現態(tài),變化后的狀態(tài)稱為次態(tài),程序中可以通過不同的數字對不同的狀態(tài)進行編號?,F態(tài)到次態(tài)的變化可以通過狀態(tài)變量值的改變來描述。
本協議中需要傳輸的基本信息單元是數據包,數據包一般包含多個數據幀。實際傳輸過程中,數據的傳輸通常是一幀一幀地進行,數據包是被拆分成若干幀數據后再進行傳輸,數據接受方也是分幀接受一個數據包。數據接受方在解釋與分析數據包時可能存在兩個問題:
1)識別并接收完整的數據包
對于數據接收方,一個數據包是分若干批到來,在識別包頭與包尾時,也就是幀同步問題,具體編程時存在難度,特別對于已接收部分與未接收部分以及數據接收的進度及狀態(tài)的處理。
2)數據傳輸時的容錯能力
數據傳輸過程中已經出現錯誤時,系統應該具有擺脫錯誤狀態(tài),恢復到正常狀態(tài)的能力。例如,當一個數據包只傳輸完一部分時,因為未知故障,下一個數據包就開始傳輸,系統應該能識別出傳輸錯誤,拋棄前一個出錯的數據包,并且能正確接收下一個數據包。實際編程時處理這種問題難度較大,結果很可能會出現將第一個數據包的前一部分與第二個數據包的前一部分拼裝成一個新的數據包的情況,這就損失了兩個數據包,最嚴重的結果可能是系統無法從錯誤中恢復,這就嚴重降低了系統的安全性與可靠性。
為解決上面提出的兩個問題,本協議引入了狀態(tài)機。在狀態(tài)機中,狀態(tài)的變化依賴于外部觸發(fā)條件,當條件滿足時,狀態(tài)將發(fā)生變化。本協議中將數據包接收的各個階段定義為不同的狀態(tài),將接收一幀新的數據或數據處理的結果作為外部觸發(fā)條件,從而達到狀態(tài)改變的目的,最終完成一個數據包的接收與校驗。
串口通信協議中,發(fā)送數據包時一般不需引入狀態(tài)機,這主要是為提高發(fā)送速率和簡化編程模型而考慮的。本協議中主要針對數據接收過程建立狀態(tài)機。數據接收狀態(tài)圖如圖2所示。
圖2 串口通信數據接收狀態(tài)圖Fig.2 Sate diagram of data receiving for serial communication
串口通信的數據接收過程如下:當未開始接收數據包或發(fā)現數據傳輸出錯時,系統進入空閑狀態(tài);當數接收到數據包0x55(起始標志)時,變?yōu)槭盏狡鹗紭酥緺顟B(tài),如果收到的數據不為0x55,系統繼續(xù)保持空閑狀態(tài);進入收到起始標志狀態(tài)后,新接收到的任何數據將被當作數據包中命令與附加數據的總字節(jié)數(記為LEN),系統進入收到數據長度狀態(tài);繼續(xù)接收新的數據,直至接到新收到的數據總字節(jié)數達到LEN+2,進入檢驗結束標志狀態(tài);這時可以檢驗結束標志是否為0x56,如果是,說明傳輸正確,否則傳輸出錯,出錯后應查找接收緩沖區(qū)中本數據包的起始標志后有無其它起始標志,如果沒有發(fā)現起始標志,系統應進入空閑狀態(tài),否則應直接進入接收到起始標志狀態(tài),這樣可提高系統容錯能力,方便系統從錯誤中恢復。檢驗結束標志正確后,進入數據校驗狀態(tài);校驗結果如果正確,數據包接收完成,否則說明傳輸出錯,系統進入空閑狀態(tài)。
下位機采用ATMEL公司的AVR系列單片機ATmega168作為其核心控制單元;上位機軟件采用Delphi 7.0編寫,Delphi 7.0是Borland公司開發(fā)的基于Windows平臺的面向對象的快速應用程序開發(fā)工具。本協議上位機程序采用Delphi開發(fā),主要考慮到Delphi易于實現多線程編程。另外,Delphi開發(fā)程序的簡單、高效,也是上位機軟件選擇其作為開發(fā)工具的重要原因。
串口通信協議包括發(fā)送與接收兩部分。在本系統中,下位機負責發(fā)送數據,上位機負責接收數據,而另一種情況:下位機接收、上位機發(fā)送,其處理方法與前面一種相似。因此,這里僅介紹下位機發(fā)送數據、上位機負責接收數據的實現。
下位機串口通信發(fā)送程序由于不考慮狀態(tài)機,實現較為簡單,其示例代碼如下:
上位機軟件中,當接收到數據時,串口控件會觸發(fā)一個事件,在事件處理代碼中應及時將收到的數據存入接收沖區(qū),同時不應該把串口通信協議接收部分的代碼放置在此事件中,否則后面到來的數據可能因為前面先到的數據沒有及時處理完畢而被沖掉,導致數據丟失。因此,在上位機軟件運行時,應該啟動一個Windows線程,用于不斷檢測接收緩沖區(qū)是否為空,不為空時則對緩沖中的數據進行處理,創(chuàng)建一個名為TBufferThread的線程類:
線程類創(chuàng)建好后,應具體編寫TBufferThread線程類成員函數Execute的處理過程,其算法流程圖如圖3所示。
圖3 串口通信數據接收算法流程圖Fig.3 Flow chart of data receiving for serial communication
依據流程圖,編寫代碼如下:
數據包的接收進度依據于狀態(tài)指示變量sp。當數據接收順利時,sp的變化將會引導完成一個數據包的接收過程,這樣處理可以簡化編程的模型,使協議易于實現;數據包接收過程中,一旦發(fā)現數據傳輸出錯,立即將sp置為0(空閑狀態(tài)),也就是狀態(tài)復位,使系統進入準備接收下一個數據包的狀態(tài),這樣可提高通信過程的可靠性及容錯能力。
為檢驗測試串通信協議的合理性及可靠性,將其應用到某稱重儀表的上位機通信中,其上位機程序主界面如圖4所示。程序主界面的點陣字體顯示的是由下位機傳送的質量數據,而正中間顯示的是由下位機上傳的A/D數據形成的曲線,最下方顯示的是對接收的數據處理的狀態(tài)指示。經過大量測試表明,本串口通信協議設計合理,可靠性較高。
圖4 程序主界面Fig.4 Main interface of the program
文中主要介紹串口通信協議的設計與實現,其中包括數據包格式的定義、通信狀態(tài)機的設計以及協議的實現,并將此協議應用到某稱重儀表的上位機通信中。串口通信中引入狀態(tài)機方法,便于解決幀同步問題,使協議易于實現,同時增加了系統的穩(wěn)定性與可靠性。因此,可廣泛用于各類儀器儀表、工業(yè)控制領域中,具有一定的實用價值。
[1]謝春生,宋坦路,石成.串口通信協議的制定方法[J].黑龍江科技信息,2009(33):83.
XIE Chun-sheng,SONG Tan-lu,SHI Cheng.The methods of formulating serial port communication protocol[J].Heilongjiang Science and Technology Information,2009(33):83.
[2]江海波,王卓然,耿德根.深入淺出AVR單片機—從ATmega 48/88/168開始[M].1版.北京:中國電力出版社,2008.
[3]張敏,張純偉.基于RS-232標準的一種實用串行通信協議的設計與實現[J].電腦知識與技術,2009,5(6):1369-1371.
ZHANG Min,ZHANG Chun-wei.The design and implementation of the utility serial port communication protocol based on RS-232 standard[J].Computer Knowledge and Technology,2009,5(6):1369-1371.
[4]林雪梅,彭佳紅,姚志成.單片機多機通信協議的設計[J].微計算機信息,2006,22(2-2):24-26,125.
LIN Xue-mei,PENG Jia-hong,YAO Zhi-cheng.The design of many of single-chip microcomputer communication protocl[J].Control and Automation,2006,22(2-2):24-26,125.
[5]王麗,雷秀,余建國.基于PC機與單片機AT89C52的串行通信協議設計[J].機電工程技術,2006,35(2):19-21.
WANG Li,LEI Xiu,YU Jian-guo.The design of serial port communication protocol based on personal computer and AT89C52[J].Mechanical and Electrical Engineering Technology,2006,35(2):19-21.
[6]五承君.自定義串口數據通信協義的分析與設計[J].計算機工程,2004,30(24):192-194.
WU Cheng-jun.The analysis and design of user-defined serial communication protocol[J].Computer Engineering,2004,30(24):192-194.