劉 彪,張進(jìn)智,張 巧,王睿喬,李明樂(lè),喬邦江
(1.國(guó)營(yíng)長(zhǎng)虹機(jī)械廠 電子車(chē)間,廣西 桂林 541000;2.中國(guó)兵器裝備集團(tuán)制導(dǎo)航空彈藥研究開(kāi)發(fā)中心 導(dǎo)航室,湖南 長(zhǎng)沙 410100)
隨著科學(xué)技術(shù)的發(fā)展,串口通訊廣泛應(yīng)用在制導(dǎo)控制[1]、導(dǎo)航[2-3]、工業(yè)自動(dòng)化[4]等領(lǐng)域,當(dāng)前大多數(shù)儀器設(shè)備在進(jìn)行數(shù)據(jù)的傳輸時(shí),都采RS-232或RS-422串口通訊方式[5-7]。為了保證數(shù)據(jù)傳輸?shù)谋C苄院驼_性,很多儀器設(shè)備采用增加幀頭、幀ID、幀長(zhǎng)度、校驗(yàn)和、幀尾對(duì)數(shù)據(jù)進(jìn)行封裝;校驗(yàn)和包括單字節(jié)累加求和,CRC校驗(yàn)等。目前還沒(méi)有形成統(tǒng)一、規(guī)范的通訊接口數(shù)據(jù)協(xié)議[8],因此,對(duì)于接收數(shù)據(jù)的測(cè)試顯控系統(tǒng)設(shè)計(jì)而言,不同的設(shè)備必須對(duì)應(yīng)不同的軟件系統(tǒng),給程序設(shè)計(jì)帶來(lái)麻煩,花費(fèi)大量人力、物力研制的軟件系統(tǒng)只能應(yīng)用于特定的系統(tǒng),若用于其它系統(tǒng)的接收測(cè)試,必須進(jìn)行重新設(shè)計(jì),或者對(duì)代碼進(jìn)行大量的修改。這不僅增加了單位的人力、時(shí)間成本,還影響了單位的整體測(cè)試效率。
基于上述問(wèn)題,研究并開(kāi)發(fā)了一種通用的串口協(xié)議數(shù)據(jù)解析與顯控系統(tǒng)。該系統(tǒng)分為協(xié)議自動(dòng)生成軟件和數(shù)據(jù)解析及顯示軟件。該系統(tǒng)將串行接口中傳輸?shù)臄?shù)據(jù)流協(xié)議與接收軟件分離,可以根據(jù)使用需要,制定不同的通訊協(xié)議,再通過(guò)數(shù)據(jù)解析軟件將串行接口中的數(shù)據(jù)流與協(xié)議匹配,將數(shù)據(jù)解析、記錄并顯示。
現(xiàn)以慣性導(dǎo)航系統(tǒng)為例,介紹一種協(xié)議的基本格式,如圖1所示。
圖1 協(xié)議的基本格式
幀頭通常包含兩個(gè)字符[9],用來(lái)判斷一個(gè)數(shù)據(jù)包的開(kāi)始,該文給出的幀頭式是7E7E。幀長(zhǎng)度一般是指除去幀頭、幀長(zhǎng)度本身、校驗(yàn)和之外的其它數(shù)據(jù)字節(jié)數(shù)。幀ID通常是判斷輸出的是哪一類(lèi)數(shù)據(jù)包,由于相同接口,有可能輸出不同的數(shù)據(jù)。以慣性導(dǎo)航系統(tǒng)為例,同一接口有可能輸出Inertial Measurement Unit (IMU)的數(shù)據(jù),比如角速度信息、加速度信息、溫度信息等;也有可能輸出慣導(dǎo)解算的數(shù)據(jù),例如慣導(dǎo)時(shí)標(biāo)、經(jīng)度、緯度、高度、速度(北向、東向、地向)、姿態(tài)(俯仰、橫滾、偏航)等信息,幀ID用來(lái)區(qū)分同一接口輸出的不同數(shù)據(jù)包。校驗(yàn)和一般情況下包括單字節(jié)累加求和、CRC校驗(yàn)[10-11]等,單字節(jié)累加求和、CRC校驗(yàn)都是指除去幀頭、幀長(zhǎng)度本身、校驗(yàn)和之外的其它數(shù)據(jù)字節(jié)數(shù)的累加和或CRC,幀尾代表了一幀數(shù)據(jù)的結(jié)束[12-13],通常幀尾用0xcc表示。表1給出一幀完整的IMU數(shù)據(jù)協(xié)議。
表1 IMU協(xié)議
數(shù)據(jù)解包是從接收的數(shù)據(jù)流中拿出正確的數(shù)據(jù)幀,其中拿出一幀正確的數(shù)據(jù),關(guān)鍵的是幀頭、幀長(zhǎng)度、幀ID和校驗(yàn)和四個(gè)字段;準(zhǔn)確無(wú)誤地解析出具體的數(shù)值(如X軸加速度),則需知道具體數(shù)據(jù)項(xiàng)的字節(jié)數(shù)、數(shù)據(jù)類(lèi)型和當(dāng)量LSB[14]。
在此,給出一種通用的數(shù)據(jù)協(xié)議解析算法,如圖2所示,解析過(guò)程如下:
圖2 解析算法示意圖
定義三個(gè)緩存存儲(chǔ)數(shù)據(jù)流pRXStrm、RXBuf和RXBuff,將待解析字節(jié)流中指定起始位置及數(shù)量的字節(jié)拷貝至臨時(shí)字節(jié)數(shù)組中,即將緩存pRXStrm復(fù)制到緩存RXBuf里,定義兩個(gè)位置索引變量CBP(已被放入解析緩存的字節(jié)數(shù))和CBL(未被放入解析緩存的字節(jié)數(shù)),初始值都為0;對(duì)RXBuf里的數(shù)據(jù)流進(jìn)行遍歷,判斷幀頭,如果幀頭匹配,將幀頭存入RXBuff中,CBP+1,如若不匹配,停止,繼續(xù)尋找?guī)^,直到匹配到幀頭,當(dāng)判斷完整個(gè)RXBuf里的數(shù)據(jù),沒(méi)有匹配到幀頭,跳出遍歷,錯(cuò)誤幀計(jì)數(shù)+1;判斷幀ID,如果幀ID匹配,將幀ID存入RXBuff中,CBP+1,如若不匹配,停止,繼續(xù)尋幀ID,直到匹配到幀ID,當(dāng)判斷完整個(gè)RXBuf里的數(shù)據(jù),沒(méi)有匹配到ID,跳出遍歷,錯(cuò)誤幀計(jì)數(shù)+1;判斷幀長(zhǎng)度,如果幀長(zhǎng)度匹配,將幀長(zhǎng)度存入RXBuff中,CBP+1,CBL=幀長(zhǎng)度-CBP,循環(huán)將剩余字節(jié)存入RXBuff中,存入一個(gè)字節(jié),CBP+1,CBL-1,直到CBL減為1,0,判斷校驗(yàn)和、幀尾;全部匹配后一幀數(shù)據(jù)解析成功,幀長(zhǎng)度、校驗(yàn)和、幀尾有一項(xiàng)匹配不成功,跳出循環(huán),CBP置0,錯(cuò)誤幀計(jì)數(shù)+1;依次類(lèi)推,解析緩存里的所有數(shù)據(jù)。
這里設(shè)置兩個(gè)緩存,是為了防止數(shù)據(jù)量過(guò)大,還沒(méi)有解析緩存區(qū)就被覆蓋的問(wèn)題。
通常情況下,大多數(shù)單位都是根據(jù)特定的產(chǎn)品,制定相應(yīng)的通訊協(xié)議,不同的產(chǎn)品配備了不同的通訊測(cè)試軟件,協(xié)議更改后,必須重新修改程序解析代碼[15],同時(shí)部分解析系統(tǒng)的解析算法通用性不高,解析稍微有變,整個(gè)數(shù)據(jù)處理段要進(jìn)行大量修改與調(diào)試[16-17],浪費(fèi)了大量的時(shí)間與精力。
該系統(tǒng)與其它系統(tǒng)最大的不同在于即使一個(gè)不懂編程的人,也可以使用該系統(tǒng)采集與測(cè)試多種不同設(shè)備的數(shù)據(jù),為日常的數(shù)據(jù)采集與測(cè)試工作帶來(lái)了極大便利。
該系統(tǒng)分為協(xié)議自動(dòng)生成軟件和數(shù)據(jù)解析及顯示軟件。系統(tǒng)軟件采用C#語(yǔ)言,開(kāi)發(fā)工具為VS2010,系統(tǒng)的工作流程如圖3所示。
圖3 協(xié)議生成與解析流程
協(xié)議自動(dòng)生成軟件根據(jù)功能可以分為:協(xié)議的編輯功能(包括主協(xié)議的編輯和位協(xié)議的編輯)、協(xié)議的保存功能、快速輔助生成協(xié)議功能、協(xié)議的讀取功能、協(xié)議的修改功能。
該軟件的協(xié)議編輯、修改和讀取顯示功能是基于DataGridView控件實(shí)現(xiàn)的,該控件支持大量的自定義和細(xì)致格式設(shè)置,具有靈活的大小調(diào)整和選擇功能,同時(shí)還具備更好的性能及更豐富的事件模型。
為了方便操作人員編輯,該軟件具有快速輔助生成協(xié)議功能,根據(jù)不同的關(guān)鍵字和字段數(shù)生成所需的協(xié)議,然后進(jìn)行編輯,可以提高效率,輔助協(xié)議生成功能界面如圖4所示。
圖4 輔助協(xié)議勾選界面
以上關(guān)鍵字,可以根據(jù)待測(cè)設(shè)備協(xié)議自由配置,沒(méi)有的字段可以不用勾選。勾選相應(yīng)的關(guān)鍵字并填寫(xiě)字段數(shù),協(xié)議就會(huì)在主界面顯示出來(lái);
點(diǎn)擊主界面菜單,可選擇進(jìn)入?yún)f(xié)議編輯界面,用戶(hù)在此界面可以制定所需的數(shù)據(jù)協(xié)議。
其中,界面上部為主協(xié)議編輯區(qū),用戶(hù)根據(jù)自身需求和界面編輯提示制定主協(xié)議各數(shù)據(jù)字段的數(shù)據(jù)要求。
界面下部為位協(xié)議編輯區(qū),如果主協(xié)議中有數(shù)據(jù)字段需要位解析,則可以在主協(xié)議區(qū)勾選“是否位解”,并在本區(qū)進(jìn)行位協(xié)議制定。
當(dāng)協(xié)議編輯完成,確認(rèn)無(wú)誤后,可以點(diǎn)擊保存協(xié)議按鈕,協(xié)議將會(huì)保存為.xml文件,如圖5所示。XML稱(chēng)之為元語(yǔ)言,它能夠方便地表示結(jié)構(gòu)化數(shù)據(jù),自身具有的樹(shù)形結(jié)構(gòu)和節(jié)點(diǎn)之間的父子層級(jí)關(guān)系,可以很好地支持協(xié)議的增減替換,并對(duì)設(shè)備本身的協(xié)議按照字段分塊,規(guī)定最小解析單位,使得XML可以作為描述和傳輸數(shù)據(jù)的主要手段。
圖5 XML協(xié)議描述文件
解析協(xié)議的數(shù)據(jù)結(jié)構(gòu)用于映射當(dāng)前XML文件中的標(biāo)簽和標(biāo)簽中的屬性值,并且按照XML文件中的標(biāo)簽順序?qū)馕龉?jié)點(diǎn)進(jìn)行排列組合。
協(xié)議以.xml格式保存在本地硬盤(pán)后,當(dāng)點(diǎn)擊打開(kāi)協(xié)議文件選擇以保存好的協(xié)議文件,該協(xié)議就可以顯示在協(xié)議的編輯區(qū),同時(shí)可以對(duì)該協(xié)議進(jìn)行修改并保存,變化不大的協(xié)議可以稍微進(jìn)行修改,而不需要重新編輯,以減少工作量。
數(shù)據(jù)解析及顯示軟件主要實(shí)現(xiàn)了數(shù)據(jù)協(xié)議框架文件的載入、數(shù)據(jù)協(xié)議顯控界面動(dòng)態(tài)生成、數(shù)據(jù)匹配正則表達(dá)式的生成、串口數(shù)據(jù)流實(shí)時(shí)解析與屏顯、數(shù)據(jù)流記錄和數(shù)據(jù)幀記錄等功能。軟件需和協(xié)議自動(dòng)生成軟件配套使用,數(shù)據(jù)協(xié)議框架文件的有效性由協(xié)議自動(dòng)生成軟件保證。
軟件主界面如圖6所示。
圖6 數(shù)據(jù)解析及顯示軟件主界面
其中,界面左上部為串口參數(shù)配置區(qū),用于配置數(shù)據(jù)接收串口參數(shù)??膳渲貌ㄌ芈史秶?9 600~921 600;校驗(yàn)位:奇校驗(yàn)、偶校驗(yàn)、無(wú)校驗(yàn);數(shù)據(jù)位:6,7,8;停止位:1,1.5,2。
界面左中部為接口數(shù)據(jù)統(tǒng)計(jì)區(qū),可以顯示當(dāng)前數(shù)據(jù)接口接收到的數(shù)據(jù)幀數(shù)量、數(shù)據(jù)幀校驗(yàn)錯(cuò)誤計(jì)數(shù)、接收數(shù)據(jù)的字節(jié)數(shù)和發(fā)送數(shù)據(jù)的字節(jié)數(shù)。
界面左下部為時(shí)間顯示區(qū),顯示當(dāng)前系統(tǒng)的日期與時(shí)間,精確到秒。
界面中間為主協(xié)議數(shù)據(jù)顯示區(qū),最多可顯示10種不同的數(shù)據(jù)幀。根據(jù)用戶(hù)定義的協(xié)議內(nèi)容,可顯示數(shù)據(jù)協(xié)議中每一個(gè)字段的名稱(chēng)、值和度量單位。
界面右上部為位協(xié)議數(shù)據(jù)顯示區(qū),最多可顯示3種位協(xié)議字段。當(dāng)主協(xié)議中有需要位解析的字段時(shí),用鼠標(biāo)選中即可在本區(qū)顯示該字段的位協(xié)議數(shù)據(jù)解析信息。
使用時(shí),用戶(hù)首先點(diǎn)擊系統(tǒng)菜單,載入所需協(xié)議框架文件,彈出協(xié)議選擇界面,如圖7所示。
圖7 協(xié)議框架文件載入界面
協(xié)議框架選擇確認(rèn)后,在圖7所示界面點(diǎn)擊“確定”按鈕,即可將協(xié)議框架設(shè)定的內(nèi)容在主界面的主協(xié)議數(shù)據(jù)顯示區(qū)動(dòng)態(tài)生成。與此同時(shí),軟件也會(huì)將選中協(xié)議框架的內(nèi)容轉(zhuǎn)換為數(shù)據(jù)解析時(shí)所需的匹配正則表達(dá)式。
將接收的數(shù)據(jù)字節(jié)填充到待匹配字符緩存區(qū),遍歷主協(xié)議成員項(xiàng)列表的集合,獲取當(dāng)前主協(xié)議成員項(xiàng)列表,解析正則表達(dá)式規(guī)則,獲取匹配結(jié)果和匹配長(zhǎng)度,判定返回值,如果返回值>0 (獲取成功),獲取當(dāng)前校驗(yàn)和狀態(tài)信息及校驗(yàn)和成員項(xiàng)是否存在,若存在,計(jì)算所匹配字節(jié)流的校驗(yàn)和,判定函數(shù)返回值>0(成功),分組依次判定校驗(yàn)和計(jì)算返回值長(zhǎng)度(返回長(zhǎng)度依次定義為1,2,4,8)。如果長(zhǎng)度為1,判斷校驗(yàn)和計(jì)算是否正確;如果長(zhǎng)度為2,將校驗(yàn)和字節(jié)數(shù)組轉(zhuǎn)化為短整型校驗(yàn)和并判斷;如果長(zhǎng)度為4,將校驗(yàn)和字節(jié)數(shù)組轉(zhuǎn)化為整型校驗(yàn)和并判斷;如果長(zhǎng)度為8,將校驗(yàn)和字節(jié)數(shù)組轉(zhuǎn)化為長(zhǎng)整型校驗(yàn)和并判斷,校驗(yàn)和正確,根據(jù)主協(xié)議成員項(xiàng)列表對(duì)匹配到的字節(jié)流數(shù)據(jù)進(jìn)行解析,將解析后的主協(xié)議成員項(xiàng)列表中的數(shù)據(jù)項(xiàng)發(fā)送記錄儀,進(jìn)行保存。
位協(xié)議成員項(xiàng)數(shù)據(jù)解析方法:判定當(dāng)前位成員項(xiàng)列表的初始化狀態(tài),若已初始化,獲取當(dāng)前位成員項(xiàng)的值,聲明關(guān)鍵值數(shù)組和實(shí)際物理意義數(shù)組,獲取當(dāng)前位段的位長(zhǎng)度(位)并初始化關(guān)鍵值掩碼,根據(jù)當(dāng)前位段的位長(zhǎng)度,設(shè)置對(duì)應(yīng)的關(guān)鍵值掩碼,計(jì)算當(dāng)前位段的關(guān)鍵值,獲取當(dāng)前位段關(guān)鍵值字符串和實(shí)際物理意義字符串,實(shí)例化正則表達(dá)式匹配類(lèi)并進(jìn)行匹配,匹配成功,將匹配結(jié)果存入關(guān)鍵值列表,匹配失敗,跳出循環(huán),遍歷關(guān)鍵值列表和實(shí)際物理意義列表,解析位成員項(xiàng)數(shù)據(jù),計(jì)算位成員項(xiàng)列表數(shù)據(jù),屏顯數(shù)據(jù)轉(zhuǎn)換成指定格式的字符串值并顯示在對(duì)應(yīng)的控件中。
只要數(shù)據(jù)接口中有對(duì)應(yīng)協(xié)議格式的數(shù)據(jù)流傳輸,軟件便會(huì)自動(dòng)將數(shù)據(jù)內(nèi)容匹配解析并顯示在主界面中對(duì)應(yīng)的數(shù)據(jù)顯示區(qū)域內(nèi)。同時(shí),軟件也會(huì)自動(dòng)將接收到的數(shù)據(jù)保存為數(shù)據(jù)文件,包括數(shù)據(jù)流原始數(shù)據(jù)與解析后的數(shù)據(jù)幀。
該文對(duì)某型慣性導(dǎo)航系統(tǒng)進(jìn)行驗(yàn)證,通過(guò)本系統(tǒng)作為數(shù)據(jù)采集向終端設(shè)備發(fā)送命令,接收、解析并保存終端設(shè)備上發(fā)出的數(shù)據(jù)。終端設(shè)備可成功接收到來(lái)自本系統(tǒng)的數(shù)據(jù)和指令,且本系統(tǒng)可以接收到終端設(shè)備傳輸?shù)臄?shù)據(jù)且解析成功,并將解析的數(shù)據(jù)通過(guò)客戶(hù)端進(jìn)行展示,如圖8所示。
圖8 某型組合導(dǎo)航系統(tǒng)驗(yàn)證展示
該文對(duì)通用的協(xié)議組包和解析原理進(jìn)行了深入的分析與研究,設(shè)計(jì)了一種通用串口數(shù)據(jù)協(xié)議解析與顯控系統(tǒng),系統(tǒng)可以在較大程度上提高串行接口數(shù)據(jù)解析相關(guān)領(lǐng)域的工作效率,降低了其技術(shù)門(mén)檻,真正意義上實(shí)現(xiàn)了協(xié)議與軟件的分離。對(duì)任意一種新數(shù)據(jù)協(xié)議,該通用數(shù)據(jù)解析平臺(tái)實(shí)現(xiàn)了不修改源程序代碼,可以接收到不同的系統(tǒng)的數(shù)據(jù)輸出,并進(jìn)行顯示。程序與導(dǎo)航系統(tǒng)、測(cè)量設(shè)備進(jìn)行了實(shí)際的測(cè)試,實(shí)踐證明,正確配置協(xié)議文件之后,都能收到正確的數(shù)據(jù)結(jié)果。用戶(hù)使用該系統(tǒng)時(shí),按照協(xié)議正確填寫(xiě)配置信息后,便能夠與系統(tǒng)進(jìn)行通訊。在設(shè)備驗(yàn)收與測(cè)試中, 具有很強(qiáng)的通用性。