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