馬基賢,王 偉
(1.天津航天機(jī)電設(shè)備研究所,天津 300458;2.中鐵建大橋局電氣化工程有限公司,天津 300000)
航天領(lǐng)域,航天器等設(shè)備研制過程中試驗(yàn)及存放環(huán)境等需要各類地面測(cè)量設(shè)備支持保障,完成試驗(yàn)過程監(jiān)測(cè)及環(huán)境參數(shù)監(jiān)測(cè)等。涉及溫濕度、壓力壓差、氣體成分、位置信息、電量、輸入輸出控制等各類參數(shù)。而在遠(yuǎn)程控制、測(cè)試測(cè)量等應(yīng)用中,溫濕度傳感器、壓力壓差傳感器、氣體流量/組分傳感器、定位模塊、電量模塊、稱重模塊、IO控制模塊等大部分測(cè)試測(cè)量設(shè)備都支持串口通信。串口通信(Serial Communication),是指外設(shè)和計(jì)算機(jī)間,通過數(shù)據(jù)信號(hào)線、地線等,按位進(jìn)行傳輸數(shù)據(jù)的一種通信方式。[1]串口是一種接口標(biāo)準(zhǔn),它規(guī)定了接口的電氣標(biāo)準(zhǔn),沒有規(guī)定接口插件電纜以及使用的協(xié)議[1]。地面測(cè)量設(shè)備的串口通信應(yīng)用主要有支持串口通信的測(cè)試測(cè)量設(shè)備應(yīng)用與具備串口通信功能的測(cè)控設(shè)備研制。本文針對(duì)常用串口通信協(xié)議,歸納分類并相應(yīng)給出數(shù)據(jù)處理流程。
不同的廠家、不同的設(shè)備類型,通信協(xié)議各有不同。常用的通信協(xié)議有MODBUS協(xié)議、導(dǎo)航設(shè)備的NMEA協(xié)議、廠家自定義協(xié)議。
MODBUS是一種串行通信協(xié)議,是Modicon公司(現(xiàn)在的施耐德電氣Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表。MODBUS已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn)(De facto),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式[2]。MODBUS通信協(xié)議分為兩種串行通信模式,ASCII 和RTU通信模式[3]。協(xié)議組成為:起始位、設(shè)備地址、功能代碼、數(shù)據(jù)、校驗(yàn)位、結(jié)束符。
NMEA0183是美國國家海洋電子協(xié)會(huì)(National Marine Electronics Association)為海用電子設(shè)備制定的標(biāo)準(zhǔn)格式。NMEA0183協(xié)議采用ASCII碼來傳遞GPS定位信息,我們稱之為幀[4]。
幀格式為$aaccc,ddd,ddd,?,ddd*hh(CR)(LF),詳細(xì)定義如下:
(1)“$”:幀命令起始位;
(2)“aaccc”:地址域,前兩位為識(shí)別符(aa),后三位為語句名(ccc);
(3)“ddd,ddd”:數(shù)據(jù)內(nèi)容;
(4)“*”:校驗(yàn)和前綴(也可以作為語句數(shù)據(jù)結(jié)束的標(biāo)志);
(5)“hh”:校驗(yàn)和(check sum),$與*之間所有字符 ASCII 碼的校驗(yàn)和(各字 節(jié)做異或運(yùn)算,得到校驗(yàn)和后,再轉(zhuǎn)換 16 進(jìn)制格式的 ASCII 字符);
(6)“(CR)(LF)”:幀結(jié)束,回車和換行符。
MODBUS協(xié)議、NMEA協(xié)議以及廠家自定義協(xié)議。歸納總結(jié),主要有連續(xù)方式和指令方式兩種[5]。
連續(xù)方式:指主機(jī)不需要發(fā)布命令,從機(jī)就能自動(dòng)地向主機(jī)發(fā)送數(shù)據(jù)。
指令方式:指主機(jī)向從機(jī)發(fā)布命令,從機(jī)根據(jù)指令執(zhí)行動(dòng)作,并將結(jié)果“應(yīng)答”給主機(jī)的模式。
其中指令方式又包括一問一答和一問多答兩種形式。
導(dǎo)航設(shè)備通常采用連續(xù)方式,建立連接后,數(shù)據(jù)信息即可連續(xù)上傳。傳感器和控制設(shè)備通常采用指令方式,通過讀寫指令查詢數(shù)據(jù)、控制設(shè)備。自定義協(xié)議通常數(shù)據(jù)內(nèi)容固定、單一的監(jiān)測(cè)設(shè)備采用連續(xù)方式;而數(shù)據(jù)內(nèi)容較多、頻率需求不固定并包含指令設(shè)置的測(cè)控設(shè)備采用指令方式。
本文數(shù)據(jù)處理主要包括數(shù)據(jù)讀寫、數(shù)據(jù)包處理。為保證數(shù)據(jù)完整有效的解析,不同的協(xié)議,數(shù)據(jù)處理方法也有所不同。
連續(xù)方式數(shù)據(jù)處理由于通信延時(shí)、中斷等原因,數(shù)據(jù)端口會(huì)出現(xiàn)數(shù)據(jù)長度不夠一幀或者超出一幀的情況。因此主要考慮數(shù)據(jù)讀寫速度匹配性及數(shù)據(jù)包粘包/半包的問題。根據(jù)通信數(shù)據(jù)長度分定長和變長兩種。
定長數(shù)據(jù)處理根據(jù)端口數(shù)據(jù)長度控制數(shù)據(jù)讀取速度,端口數(shù)據(jù)不夠一幀長度時(shí)循環(huán)等待,大于等于一幀長度時(shí)全部讀回。先將上次的斷幀數(shù)據(jù)與本次的數(shù)據(jù)連接,再通過查找?guī)^并讀取固定長度數(shù)據(jù)的方式拆包,取出完整數(shù)據(jù)包,并保存剩余斷幀數(shù)據(jù),通過“幀頭+固定長度”的方式解決粘包/半包的問題。具體流程如圖1所示。
圖1 定長數(shù)據(jù)處理流程
變長數(shù)據(jù)處理根據(jù)數(shù)據(jù)產(chǎn)生頻率(循環(huán)周期)控制數(shù)據(jù)讀取速度,定時(shí)循環(huán)將端口數(shù)據(jù)全部讀回,前提是端口數(shù)據(jù)長度大于零。讀取后對(duì)數(shù)據(jù)尾部先進(jìn)行幀尾判斷,若是幀尾,即為完整數(shù)據(jù);若不是幀尾,將斷幀數(shù)據(jù)截取保存。數(shù)據(jù)不為空時(shí),再將上次的斷幀數(shù)據(jù)與本次的數(shù)據(jù)連接,完成解析處理。通過“幀頭+幀尾”的方式拆包解決粘包/半包的問題。具體流程如圖2所示。
圖2 變長數(shù)據(jù)處理流程
定長數(shù)據(jù)讀取速度根據(jù)端口數(shù)據(jù)長度控制,有數(shù)即讀。但考慮線程資源,通常設(shè)定50-100ms循環(huán)周期。保證資源有效分配。
上述兩種方法針對(duì)數(shù)據(jù)堵塞時(shí)處理結(jié)果略有不同,定長數(shù)據(jù)處理方式將擁堵數(shù)據(jù)讀回快速循環(huán)處理,最大程度保證數(shù)據(jù)完整性;變長數(shù)據(jù)處理方式將擁堵數(shù)據(jù)讀回只讀取一幀處理,人為造成少量數(shù)據(jù)丟失,但此種方式對(duì)數(shù)據(jù)相對(duì)時(shí)間整齊,對(duì)無時(shí)間標(biāo)志的數(shù)據(jù)存儲(chǔ)較為友好。
指令方式的數(shù)據(jù)處理方法相對(duì)連續(xù)方式,簡(jiǎn)單很多。建立連接后,根據(jù)測(cè)量/控制周期發(fā)送指令,等待接收數(shù)據(jù),不超時(shí),格式檢驗(yàn)成功后解析數(shù)據(jù);超時(shí)或校驗(yàn)不成功時(shí),等待進(jìn)入下次循環(huán)。一問一答和一問多答兩種情況相似。一問一答時(shí),發(fā)一條收一條即可;一問多答時(shí),發(fā)一條后,循環(huán)讀取多條指令,直至判別為“結(jié)束指令”判斷即可再發(fā)送下一條指令。另有些設(shè)備自帶接口函數(shù),直接調(diào)用其讀寫函數(shù)即可。
圖3 一問多答處理流程
數(shù)據(jù)包處理通常根據(jù)協(xié)議內(nèi)容格式處理。協(xié)議內(nèi)容通常有固定位置定義和指定字符索引兩種。固定位置定義以MODBUS RTU為例,起始位(1個(gè)字節(jié))+設(shè)備地址(1個(gè)字節(jié))+功能代碼(1個(gè)字節(jié))+長度(4個(gè)字節(jié))……+校驗(yàn)碼(2個(gè)字節(jié))+結(jié)束符(1個(gè)字節(jié)),將數(shù)據(jù)包格式化成數(shù)組,索引相應(yīng)位置字段即可。指定字符索引以NEMA協(xié)議為例,$aaccc,ddd,ddd,,,,ddd*hh(CR)(LF),需要根據(jù)地址域字符找到所需的數(shù)據(jù)幀,根據(jù)分隔符拆分字段,再根據(jù)字段定義解析。
通常串口類設(shè)備通信速度在秒級(jí),針對(duì)單臺(tái)設(shè)備的讀數(shù)據(jù)和數(shù)據(jù)處理程序結(jié)構(gòu)一般采用上述流程圖順序執(zhí)行即可。
針對(duì)多臺(tái)設(shè)備連接數(shù)據(jù)處理或者程序數(shù)據(jù)量較大時(shí),建議采用并行結(jié)構(gòu),將數(shù)據(jù)讀取和數(shù)據(jù)處理分線程并行處理。推薦采用生產(chǎn)者-消費(fèi)者模式。
圖4 生產(chǎn)消費(fèi)模式
本文針對(duì)常用串口通信協(xié)議,歸納分類并相應(yīng)給出數(shù)據(jù)處理流程。成功應(yīng)用于航天員人體代謝模擬、航天器儲(chǔ)運(yùn)包裝箱測(cè)控系統(tǒng)等測(cè)控軟件編制。其中采用定長數(shù)據(jù)處理流程完成某固定長度的電量監(jiān)測(cè)設(shè)備數(shù)據(jù)處理,采用變長數(shù)據(jù)處理流程完成北斗定位、GPS定位模塊數(shù)據(jù)處理,采用一問一答式數(shù)據(jù)處理流程完成稱重、流量、氣體組分等測(cè)量設(shè)備數(shù)據(jù)處理及空調(diào)設(shè)備控制、IO設(shè)備控制,采用一問多答式數(shù)據(jù)處理流程完成某電源歷史數(shù)據(jù)協(xié)議制定及數(shù)據(jù)處理。上述處理方法可根據(jù)實(shí)際組合變體使用,對(duì)同類串口通信數(shù)據(jù)處理、串口協(xié)議制定具有參考意義。