李昊昱,繆煒濤,郭玉潔,高怡寒,王凱悅
(航空工業(yè)西安航空計(jì)算技術(shù)研究所,陜西 西安 710068)
串口通信因?yàn)榈统杀尽⑿阅芸煽恳约凹夹g(shù)簡(jiǎn)單而廣泛應(yīng)用于計(jì)算機(jī)、自動(dòng)化控制與機(jī)載設(shè)備間的數(shù)據(jù)傳輸?shù)认嚓P(guān)領(lǐng)域[1]。串口通信數(shù)據(jù)一般按位順序傳送,其交互的對(duì)象通常是單個(gè)計(jì)算機(jī)對(duì)應(yīng)單個(gè)外設(shè),收發(fā)數(shù)據(jù)是一問(wèn)一答式,不會(huì)產(chǎn)生數(shù)據(jù)沖撞[2]。但一些領(lǐng)域中串口通信會(huì)遇到一對(duì)多的數(shù)據(jù)交互。在某型號(hào)國(guó)產(chǎn)飛機(jī)改裝項(xiàng)目中計(jì)算機(jī)通過(guò)串口傳輸協(xié)議向外部控制設(shè)備發(fā)出操控命令,并且采用雙余度綜合控制技術(shù)。當(dāng)多個(gè)外部設(shè)備與兩臺(tái)計(jì)算機(jī)進(jìn)行數(shù)據(jù)傳輸時(shí),外設(shè)會(huì)同時(shí)收到兩臺(tái)計(jì)算機(jī)的下發(fā)指令,此時(shí)會(huì)導(dǎo)致數(shù)據(jù)收發(fā)沖突。因此文章提出避免多串口并行通信產(chǎn)生的數(shù)據(jù)沖突技術(shù)以及采用雙余度配置下的數(shù)據(jù)同步技術(shù),保證系統(tǒng)的高可靠性和高穩(wěn)定性。
雙方在進(jìn)行通信時(shí),要求都采用同一種規(guī)則,這種規(guī)則不僅包括電器特性,也包括通信內(nèi)容的格式和類型[3]。串行通信標(biāo)準(zhǔn)接口包括RS-232、RS-422以及RS-485。RS-232是點(diǎn)對(duì)點(diǎn)的傳統(tǒng)通信方式,由于自身電平特性的限制,不可以一對(duì)多通信[4]。RS-422是一種四線制全雙工模式的數(shù)據(jù)傳輸協(xié)議,可以同時(shí)接收和發(fā)送數(shù)據(jù)。RS-485應(yīng)用廣泛,一般采用兩線制的半雙工模式,允許數(shù)據(jù)在兩個(gè)方向上傳輸,但在同一時(shí)刻上,數(shù)據(jù)不能同時(shí)收發(fā)[5]。
目前有的機(jī)載計(jì)算機(jī)采用雙余度技術(shù)操作外部設(shè)備,其串口通信電路原理如圖1所示。

圖1 串口通信電路原理圖
圖1采用RS-485串口通信標(biāo)準(zhǔn),其顯示單一外設(shè)串口并聯(lián)出兩路通信線路,連接在兩臺(tái)計(jì)算機(jī)。左右計(jì)算機(jī)都可以收到外部設(shè)備的應(yīng)答數(shù)據(jù),假定左計(jì)算機(jī)先向外部設(shè)備發(fā)送控制指令,右計(jì)算機(jī)不但可以收到左計(jì)算機(jī)的下發(fā)指令,也可以收到外部設(shè)備的應(yīng)答數(shù)據(jù)。如果左右計(jì)算機(jī)發(fā)送指令的時(shí)刻相近,那么由于RS-485的半雙工模式特性,外部設(shè)備回復(fù)的數(shù)據(jù)極有可能與其中一個(gè)計(jì)算機(jī)的下發(fā)指令相撞,造成外部設(shè)備回復(fù)的數(shù)據(jù)源錯(cuò)誤或計(jì)算機(jī)下發(fā)指令無(wú)效,從而造成左右計(jì)算機(jī)的數(shù)據(jù)解析錯(cuò)誤,系統(tǒng)工作狀態(tài)相異,無(wú)法實(shí)現(xiàn)數(shù)據(jù)同步。
文章提出利用時(shí)間分片方法將左右計(jì)算機(jī)的下發(fā)控制命令錯(cuò)開,從而避免數(shù)據(jù)相撞。而各設(shè)備系統(tǒng)在長(zhǎng)時(shí)間的運(yùn)行下都會(huì)與標(biāo)準(zhǔn)時(shí)間產(chǎn)生誤差,因此多機(jī)聯(lián)合作業(yè)對(duì)各設(shè)備時(shí)間統(tǒng)一基準(zhǔn)提出更高的要求[6,7]。為實(shí)現(xiàn)時(shí)間分片先進(jìn)行時(shí)間校準(zhǔn),從而保證兩臺(tái)計(jì)算機(jī)與外設(shè)之間數(shù)據(jù)交互正常穩(wěn)定。
高精度授時(shí)在航天航空領(lǐng)域有著重要應(yīng)用,可利用我國(guó)自主研發(fā)的北斗衛(wèi)星導(dǎo)航系統(tǒng)來(lái)實(shí)現(xiàn)多個(gè)計(jì)算機(jī)的時(shí)間校準(zhǔn)服務(wù)[8]。北斗的3個(gè)核心功能分別是收發(fā)短消息、快速定位以及精密授時(shí),其中精密授時(shí)即北斗為終端提供20 ns和100 ns的時(shí)間同步精度[9]。北斗協(xié)議里可以用包括定位解算取得的位置、時(shí)間以及速度等信息的RMC語(yǔ)句授時(shí)[6]。
軟件上,兩臺(tái)計(jì)算機(jī)各自每秒獲取北斗自動(dòng)上傳的RMC語(yǔ)句,并將時(shí)間信息存放在全局變量中,用戶操作外部按鈕下發(fā)時(shí)間校準(zhǔn)的命令,計(jì)算機(jī)通過(guò)Windows應(yīng)用程序接口的Set System Time函數(shù)將全局變量的時(shí)間內(nèi)容設(shè)置在當(dāng)前系統(tǒng),包括年、月、日和時(shí)、分、秒,完成時(shí)間校準(zhǔn)。
時(shí)間分片是在時(shí)間統(tǒng)一的基礎(chǔ)上將長(zhǎng)任務(wù)分成若干個(gè)錯(cuò)開執(zhí)行的短任務(wù)技術(shù),并依賴于對(duì)短任務(wù)的合理分配,保證系統(tǒng)的及時(shí)響應(yīng),從而優(yōu)化系統(tǒng)性能[10]。時(shí)間分片在本文主要是將左右計(jì)算機(jī)下發(fā)指令錯(cuò)開,避免數(shù)據(jù)沖撞,具體流程如圖2所示。

圖2 時(shí)間分片下發(fā)命令流程圖
首先需要計(jì)算左右計(jì)算機(jī)之間下發(fā)命令的最小時(shí)間間隔。若外設(shè)的波特率是xb/s,即每秒可傳輸x位數(shù)據(jù),外設(shè)與計(jì)算機(jī)之間的最長(zhǎng)下發(fā)數(shù)據(jù)幀和最長(zhǎng)回復(fù)數(shù)據(jù)幀是m和n個(gè)字節(jié),即8×m位和8×n位。由于硬件環(huán)境影響,一對(duì)多串口通信容易發(fā)生數(shù)據(jù)沖撞,需等待當(dāng)前操作計(jì)算機(jī)下發(fā)指令的時(shí)間加上外部設(shè)備回復(fù)數(shù)據(jù)的時(shí)間后,另一臺(tái)計(jì)算機(jī)才可以發(fā)送其他指令,避免沖突。因此兩臺(tái)計(jì)算機(jī)之間下發(fā)命令的最小時(shí)間間隔應(yīng)為:

為保證收發(fā)數(shù)據(jù)的正確性,利用時(shí)長(zhǎng)至少大于兩倍最小時(shí)間間隔的定時(shí)器計(jì)數(shù),將某單位時(shí)間分段,左計(jì)算機(jī)在第一個(gè)時(shí)間段計(jì)數(shù)0時(shí)下發(fā)指令,右計(jì)算機(jī)在下一個(gè)時(shí)間段計(jì)數(shù)1時(shí)下發(fā)指令。
以時(shí)間校準(zhǔn)和時(shí)間分片為基礎(chǔ)的串口沖突回避設(shè)計(jì)不僅可以面對(duì)單一外設(shè),也可以用于多路串口的多個(gè)設(shè)備。如圖2所示,在定時(shí)器里完成當(dāng)前操作計(jì)算機(jī)向N個(gè)設(shè)備在計(jì)數(shù)0時(shí)下發(fā)指令,另一臺(tái)計(jì)算機(jī)則在計(jì)數(shù)1時(shí)對(duì)N個(gè)設(shè)備下發(fā)指令,錯(cuò)開發(fā)送指令可以留下足夠的時(shí)間得到外部設(shè)備回復(fù)的數(shù)據(jù),回避了數(shù)據(jù)沖突。
采用雙余度控制的串口外接電路設(shè)計(jì),計(jì)算機(jī)可以收到對(duì)側(cè)計(jì)算機(jī)的下發(fā)指令和外設(shè)的應(yīng)答數(shù)據(jù),并且二者在緩沖區(qū)通常出現(xiàn)粘在一起的情況,因此實(shí)現(xiàn)數(shù)據(jù)同步要求計(jì)算機(jī)拆分對(duì)側(cè)計(jì)算機(jī)的下發(fā)指令和外設(shè)應(yīng)答數(shù)據(jù)。一般通信內(nèi)容中都會(huì)有標(biāo)識(shí)來(lái)區(qū)分各個(gè)數(shù)據(jù)幀,也代表外設(shè)的工作模式,計(jì)算機(jī)可根據(jù)對(duì)側(cè)計(jì)算機(jī)下發(fā)指令的標(biāo)識(shí)判斷外設(shè)此時(shí)的工作模式,從而調(diào)整左右計(jì)算機(jī)實(shí)時(shí)同步。
若兩臺(tái)計(jì)算機(jī)已經(jīng)過(guò)時(shí)間校準(zhǔn)和時(shí)間分片,則設(shè)置一個(gè)判斷主從計(jì)算機(jī)的標(biāo)識(shí)變量Flag,默認(rèn)為1,當(dāng)計(jì)算機(jī)在只收到外設(shè)回復(fù)的數(shù)據(jù)時(shí),該計(jì)算機(jī)為主機(jī),所有下發(fā)命令會(huì)在定時(shí)器中完成,并且進(jìn)入相應(yīng)工作模式完成數(shù)據(jù)解析。若收到對(duì)側(cè)計(jì)算機(jī)的下發(fā)指令,標(biāo)識(shí)Flag設(shè)置為0,該計(jì)算機(jī)為從機(jī)。從機(jī)根據(jù)主機(jī)的下發(fā)指令標(biāo)識(shí)判斷外設(shè)工作模式,再拆分出外設(shè)此時(shí)返回的數(shù)據(jù),然后在當(dāng)前工作模式解析數(shù)據(jù)。同時(shí)從機(jī)應(yīng)禁止定時(shí)器內(nèi)下發(fā)其他指令避免干擾,在當(dāng)前工作狀態(tài)完成之后,從機(jī)標(biāo)識(shí)Flag重新置1。
在某型號(hào)國(guó)產(chǎn)飛機(jī)改裝項(xiàng)目中,兩臺(tái)計(jì)算機(jī)操控多個(gè)外部設(shè)備。串口通信協(xié)議為RS-485和RS-422,波特率為9 600 bit/s。根據(jù)通信協(xié)議的內(nèi)容,最長(zhǎng)下發(fā)數(shù)據(jù)幀和最長(zhǎng)回復(fù)數(shù)據(jù)幀均為26個(gè)字節(jié),將波特率代入式(1)得最小時(shí)間間隔為43 ms。在調(diào)試過(guò)程中,計(jì)算機(jī)與某一外設(shè)的連接電路中引出兩根線,再連接到另一設(shè)備上,該設(shè)備用串口調(diào)試助手觀測(cè)計(jì)算機(jī)下發(fā)命令和外設(shè)回復(fù)數(shù)據(jù)。在已進(jìn)行時(shí)間校準(zhǔn)的條件下試驗(yàn)了未采用時(shí)間分片和采用不同時(shí)間分片單位的情況,觀察1 h內(nèi)數(shù)據(jù)包是否會(huì)出錯(cuò)。
數(shù)據(jù)沖突情況主要有以下3點(diǎn)。一是外設(shè)回復(fù)數(shù)據(jù)錯(cuò)誤。正常情況下,該外設(shè)回復(fù)數(shù)據(jù)幀頭應(yīng)該為0xDBCC,標(biāo)識(shí)符為0xAFAF,長(zhǎng)度為26字節(jié)。當(dāng)遇到串口數(shù)據(jù)相撞時(shí),錯(cuò)誤數(shù)據(jù)會(huì)丟失幀頭,標(biāo)識(shí)符無(wú)效或數(shù)據(jù)內(nèi)容不符合外設(shè)實(shí)際情況。二是串口調(diào)試助手收不到外設(shè)回復(fù)數(shù)據(jù)。三是串口調(diào)試助手不再顯示對(duì)側(cè)計(jì)算機(jī)下發(fā)指令,即無(wú)法下傳指令。
當(dāng)未采用時(shí)間分片技術(shù)時(shí),出現(xiàn)數(shù)據(jù)沖突的次數(shù)多達(dá)8次,系統(tǒng)不穩(wěn)定,當(dāng)采用時(shí)間分片單位為50 ms和100 ms時(shí),數(shù)據(jù)沖突次數(shù)為5次和2次,實(shí)時(shí)同步逐漸穩(wěn)定。而當(dāng)時(shí)間分片為125 ms時(shí),數(shù)據(jù)沖突次數(shù)為0。實(shí)驗(yàn)表明,時(shí)間分片單位應(yīng)設(shè)定為接近3倍的最小時(shí)間間隔。
最終時(shí)間分片單位定為125 ms,利用125 ms的定時(shí)器將500 ms分成四個(gè)時(shí)間段并計(jì)數(shù)0,1,2,3。單一計(jì)算機(jī)下發(fā)指令的時(shí)間間隔是500 ms,兩臺(tái)計(jì)算機(jī)下發(fā)指令的時(shí)間間隔是125 ms。一臺(tái)計(jì)算機(jī)在定時(shí)器計(jì)數(shù)0時(shí)下發(fā)指令,另一臺(tái)計(jì)算機(jī)在定時(shí)器計(jì)數(shù)1時(shí)下發(fā)指令,并對(duì)多個(gè)外設(shè)都進(jìn)行了驗(yàn)證,避免了多串口數(shù)據(jù)沖突,再利用對(duì)側(cè)計(jì)算機(jī)下發(fā)指令的標(biāo)識(shí)實(shí)時(shí)同步兩臺(tái)計(jì)算機(jī)狀態(tài)。
在機(jī)載設(shè)備,自動(dòng)化或其他工業(yè)領(lǐng)域中,由于系統(tǒng)集成的復(fù)雜度越來(lái)越高,多路串口通信方式會(huì)經(jīng)常遇到。本文利用時(shí)間校準(zhǔn)和時(shí)間分片克服了串口數(shù)據(jù)沖突問(wèn)題,實(shí)現(xiàn)了數(shù)據(jù)實(shí)時(shí)同步,并可適用于多種串口協(xié)議,使得系統(tǒng)任務(wù)統(tǒng)一、可靠且實(shí)用。