葛勇 姚金華 王軍
摘要:串口設(shè)備是嵌入式系統(tǒng)經(jīng)常用到的設(shè)備之一,其本身具有很高的數(shù)據(jù)傳送精度,但是如果使用方法不當(dāng),也會造成數(shù)據(jù)接收的誤碼率顯著增大。本文以某控制系統(tǒng)為例說明正確的使用方法可以顯著提高串口接收的可靠性。
關(guān)鍵詞:串口;嵌入式;誤碼率
中圖分類號:TP368.11 文獻標(biāo)識碼:A 文章編號:1007-9416(2018)07-0115-02
1 概述
隨著計算機系統(tǒng)的應(yīng)用和微機網(wǎng)絡(luò)的發(fā)展,通信功能越來越顯得重要。通信既包括計算機與外部設(shè)備之間的信息交換,也包括計算機和計算機之間的信息交換。由于串行通信是在一根傳輸線上一位一位的傳送信息,所用的傳輸線少,并且可以借助現(xiàn)成的電話網(wǎng)進行信息傳送,因此,特別適合于遠距離傳輸。對于那些與計算機相距不遠的人-機交換設(shè)備和串行存儲的外部設(shè)備如終端、打印機、邏輯分析儀、磁盤等,采用串行方式交換數(shù)據(jù)也很普遍。在實時控制和管理方面,采用多臺微機處理機組成分級分布控制系統(tǒng)中,各CPU之間的通信一般都是串行方式,所以串行接口是微機應(yīng)用系統(tǒng)常用的接口[1-3]。
2 控制系統(tǒng)簡介
某控制系統(tǒng)共有三個組合組成:管理機柜組合、控制機柜組合和控制單元組合組成。管理機柜組合通過網(wǎng)絡(luò)與上級系統(tǒng)進行信息交換,通過上級系統(tǒng)的命令來形成相應(yīng)的內(nèi)部命令。管理機柜通過串口將內(nèi)部命令發(fā)送給控制機柜組合形成相應(yīng)的硬件命令。控制機柜軟件通過DI/O與控制單元完成命名交換并通過串口與被控制體進行數(shù)據(jù)交換以獲取被控制體的當(dāng)前狀態(tài)和向被控制體發(fā)送命令。在綜合判斷被控制體和控制單元返回的狀態(tài)后,控制機柜通過串口將狀態(tài)返回給管理機柜。
3 串口通信的問題
從系統(tǒng)工作流程可以看出,串口通訊在控制系統(tǒng)的工作過程中起到了非常重要的作用:它在系統(tǒng)中起到了承上啟下的作用,管理機柜接收上級系統(tǒng)的命令和被控制體所需的參數(shù),控制機柜串口接收并傳送給被控制體。這種工作方式要求整個傳送過程有非常低的誤碼率,不能連續(xù)出現(xiàn)兩次以上的誤碼率。在進行某次調(diào)試時發(fā)現(xiàn)控制機柜發(fā)送給被控制體的報文中出現(xiàn)了不同程度的重幀。在被控制體硬盤中查看control2.dat報文數(shù)據(jù),可以看到某流水號重復(fù)了3次,見圖1所示。
技術(shù)人員首先查看了硬件和軟件,未發(fā)現(xiàn)任何有疑問的地方。隨后搭建了一套測試系統(tǒng)來對控制機柜進行測試。測試的方法采用了與真實系統(tǒng)類似的方式:用PC104系統(tǒng)和串口板組合模擬管理機柜系統(tǒng),以同樣速率、頻率向控制機柜發(fā)送相同的報文。測試驗證系統(tǒng)為:模擬管理機柜→控制機柜→被控制體,通過串口通訊傳輸。
經(jīng)過長時間的測試驗證,技術(shù)人員發(fā)現(xiàn)控制機柜發(fā)送給被控制體的通訊報文非常正常,未出現(xiàn)真實設(shè)備中出現(xiàn)的重幀現(xiàn)象,此種現(xiàn)象表明控制機柜的軟硬件配置能夠適應(yīng)這種使用情況,未模擬出真實使用情況下的故障狀態(tài)。隨后技術(shù)人員在查看管理機柜軟件記錄下來的WINDVIEW的波形時(WINDRIVER公司的tornado操作系統(tǒng)提供一種叫WINDVIEW的功能,用圖形方式實時查看系統(tǒng)中各個任務(wù)的運行情況),發(fā)現(xiàn)管理機柜發(fā)送串口數(shù)據(jù)的任務(wù)(ComSendTask)會被一個系統(tǒng)級的網(wǎng)絡(luò)任務(wù)(jetCardSpy)打斷,此時就會出現(xiàn)控制機柜發(fā)送給被控制體的數(shù)據(jù)重幀現(xiàn)象,而在管理機柜串口發(fā)送任務(wù)沒有被打斷的情況下,控制機柜發(fā)送給被控制體的數(shù)據(jù)都是正常的[4]。管理機柜記錄下來的波形圖顯示有重幀,局部放大圖如圖2所示。
根據(jù)以上情況分析,技術(shù)人員發(fā)現(xiàn)由于控制機柜使用理想狀態(tài)下的串口數(shù)據(jù)接收方法導(dǎo)致了這種重幀現(xiàn)象的發(fā)生。串口接收數(shù)據(jù)采用UART的16個字節(jié)的緩存功能,也就是串口在接收到16個字節(jié)后發(fā)送一個中斷給CPU,通知運用程序開始接收數(shù)據(jù)。管理機柜在發(fā)送16個字節(jié)過程中不出現(xiàn)間斷的情況下,控制機柜能正確的接收到串口數(shù)據(jù)。如果管理機柜在發(fā)送的時候被其他的任務(wù)打斷,即某個字節(jié)發(fā)送完后(不滿16個)要等一段時間才能發(fā)送出后續(xù)的字節(jié),由于UART在接收到一定數(shù)量的數(shù)據(jù)后超時等待接收同樣也會觸發(fā)一次系統(tǒng)中斷,此時控制機柜也會去接收串口中的數(shù)據(jù),而且也會一次性接收16個字節(jié)。由于此時串口并沒有完整的16個字節(jié),所以未發(fā)送完的數(shù)據(jù)將會被填充為0,從而造成了控制機柜接收的數(shù)據(jù)后半段都是0,導(dǎo)致后續(xù)的校驗和判斷出錯。在判斷出錯后,控制機柜會將上次接收到的完整數(shù)據(jù)發(fā)送給被控制體,這樣就造成了被控制體接收到了相同的數(shù)據(jù)(重幀)。
4 提高串口通信可靠性的措施
針對上述分析出來的重幀原因,采取以下四種措施,可以提高串口通信的可靠性。(1)通過WINDVIEW波形圖可以看到,正常串口接收情況下,發(fā)送給CPU的中斷間隔時間在2ms~3ms。本措施是在軟件中增加一個全局變量Counter記錄每個串口中斷到來的時刻,如果下一次串口中斷到來時與上一次記錄下來的時刻相減結(jié)果大于5ms,則認為此中斷為無效中斷,將此次接收的數(shù)據(jù)清空,重新開始搜尋報文的報頭以接收下一幀。(2)每次從頭開始接收串口數(shù)據(jù)時,控制機柜軟件必須搜尋本次報文的報頭,之前接收的數(shù)據(jù)無效。這種措施能夠大大的消除由于線路上的干擾造成的串口接收端的亂碼。(3)在原有一個全局的接收緩存外,再增加一個全局的接收緩存。兩個緩存相互不干擾,第一個緩存用來接收串口的數(shù)據(jù),其他任務(wù)利用第二個緩存中的數(shù)據(jù)判斷設(shè)備當(dāng)前的狀態(tài)。(4)若管理機柜串口數(shù)據(jù)在發(fā)送第一幀時,發(fā)送任務(wù)被中斷,導(dǎo)致控制機柜的串口中斷由超時觸發(fā),則接收數(shù)據(jù)可能為全0。本措施是在控制軟件讀取串口數(shù)據(jù)前,增加一個對接收緩存器是否為空的檢測,若接收緩存器為空,則不要接收此幀數(shù)據(jù),重新開始接收下一幀數(shù)據(jù),確??刂茩C柜能正確讀取接收緩存器中的數(shù)據(jù)。
5 效果
采取以上四種措施后,運行程序,從被控制體硬盤中再次調(diào)取control2.dat報文數(shù)據(jù),查看數(shù)據(jù)結(jié)果,沒有重幀,在后續(xù)的工作中,軟件運行正常,均取得合格的結(jié)果。
6 結(jié)語
雖然串口設(shè)備是現(xiàn)在比較常用的通訊設(shè)備,技術(shù)也相當(dāng)成熟,但是如果沒有正確的使用方法也不能達到串口乃至程序所需的精確度和誤碼率。本文對控制系統(tǒng)中發(fā)生的串口通信“重幀”問題采取了四項改進措施,有效地消除了“重幀”現(xiàn)象,提高了數(shù)據(jù)的可靠性。
參考文獻
[1]潘方.RS232串口通信在PC機與單片機通信中的應(yīng)用[J].現(xiàn)代電子技術(shù),2012,(13):69-71.
[2]彭紅.VxWorks實時操作系統(tǒng)的串口通信設(shè)計[J].中國科技信息,2011,(5):90-91.
[3]陳智育,溫彥軍,陳琪.VxWorks程序開發(fā)實踐[M].人民郵電出版社,2004.
[4]李洪亮,等.VxWorks下實時多任務(wù)程序的實現(xiàn)[J].微計算機信息,2008,(20):90-91.