馬基賢,王 偉
(1.天津航天機電設備研究所,天津 300458;2.中鐵建大橋局電氣化工程有限公司,天津 300000)
航天領域,航天器等設備研制過程中試驗及存放環境等需要各類地面測量設備支持保障,完成試驗過程監測及環境參數監測等。涉及溫濕度、壓力壓差、氣體成分、位置信息、電量、輸入輸出控制等各類參數。而在遠程控制、測試測量等應用中,溫濕度傳感器、壓力壓差傳感器、氣體流量/組分傳感器、定位模塊、電量模塊、稱重模塊、IO控制模塊等大部分測試測量設備都支持串口通信。串口通信(Serial Communication),是指外設和計算機間,通過數據信號線、地線等,按位進行傳輸數據的一種通信方式。[1]串口是一種接口標準,它規定了接口的電氣標準,沒有規定接口插件電纜以及使用的協議[1]。地面測量設備的串口通信應用主要有支持串口通信的測試測量設備應用與具備串口通信功能的測控設備研制。本文針對常用串口通信協議,歸納分類并相應給出數據處理流程。
不同的廠家、不同的設備類型,通信協議各有不同。常用的通信協議有MODBUS協議、導航設備的NMEA協議、廠家自定義協議。
MODBUS是一種串行通信協議,是Modicon公司(現在的施耐德電氣Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發表。MODBUS已經成為工業領域通信協議的業界標準(De facto),并且現在是工業電子設備之間常用的連接方式[2]。MODBUS通信協議分為兩種串行通信模式,ASCII 和RTU通信模式[3]。協議組成為:起始位、設備地址、功能代碼、數據、校驗位、結束符。
NMEA0183是美國國家海洋電子協會(National Marine Electronics Association)為海用電子設備制定的標準格式。NMEA0183協議采用ASCII碼來傳遞GPS定位信息,我們稱之為幀[4]。
幀格式為$aaccc,ddd,ddd,?,ddd*hh(CR)(LF),詳細定義如下:
(1)“$”:幀命令起始位;
(2)“aaccc”:地址域,前兩位為識別符(aa),后三位為語句名(ccc);
(3)“ddd,ddd”:數據內容;
(4)“*”:校驗和前綴(也可以作為語句數據結束的標志);
(5)“hh”:校驗和(check sum),$與*之間所有字符 ASCII 碼的校驗和(各字 節做異或運算,得到校驗和后,再轉換 16 進制格式的 ASCII 字符);
(6)“(CR)(LF)”:幀結束,回車和換行符。
MODBUS協議、NMEA協議以及廠家自定義協議。歸納總結,主要有連續方式和指令方式兩種[5]。
連續方式:指主機不需要發布命令,從機就能自動地向主機發送數據。
指令方式:指主機向從機發布命令,從機根據指令執行動作,并將結果“應答”給主機的模式。
其中指令方式又包括一問一答和一問多答兩種形式。
導航設備通常采用連續方式,建立連接后,數據信息即可連續上傳。傳感器和控制設備通常采用指令方式,通過讀寫指令查詢數據、控制設備。自定義協議通常數據內容固定、單一的監測設備采用連續方式;而數據內容較多、頻率需求不固定并包含指令設置的測控設備采用指令方式。
本文數據處理主要包括數據讀寫、數據包處理。為保證數據完整有效的解析,不同的協議,數據處理方法也有所不同。
連續方式數據處理由于通信延時、中斷等原因,數據端口會出現數據長度不夠一幀或者超出一幀的情況。因此主要考慮數據讀寫速度匹配性及數據包粘包/半包的問題。根據通信數據長度分定長和變長兩種。
定長數據處理根據端口數據長度控制數據讀取速度,端口數據不夠一幀長度時循環等待,大于等于一幀長度時全部讀回。先將上次的斷幀數據與本次的數據連接,再通過查找幀頭并讀取固定長度數據的方式拆包,取出完整數據包,并保存剩余斷幀數據,通過“幀頭+固定長度”的方式解決粘包/半包的問題。具體流程如圖1所示。

圖1 定長數據處理流程
變長數據處理根據數據產生頻率(循環周期)控制數據讀取速度,定時循環將端口數據全部讀回,前提是端口數據長度大于零。讀取后對數據尾部先進行幀尾判斷,若是幀尾,即為完整數據;若不是幀尾,將斷幀數據截取保存。數據不為空時,再將上次的斷幀數據與本次的數據連接,完成解析處理。通過“幀頭+幀尾”的方式拆包解決粘包/半包的問題。具體流程如圖2所示。

圖2 變長數據處理流程
定長數據讀取速度根據端口數據長度控制,有數即讀。但考慮線程資源,通常設定50-100ms循環周期。保證資源有效分配。
上述兩種方法針對數據堵塞時處理結果略有不同,定長數據處理方式將擁堵數據讀回快速循環處理,最大程度保證數據完整性;變長數據處理方式將擁堵數據讀回只讀取一幀處理,人為造成少量數據丟失,但此種方式對數據相對時間整齊,對無時間標志的數據存儲較為友好。
指令方式的數據處理方法相對連續方式,簡單很多。建立連接后,根據測量/控制周期發送指令,等待接收數據,不超時,格式檢驗成功后解析數據;超時或校驗不成功時,等待進入下次循環。一問一答和一問多答兩種情況相似。一問一答時,發一條收一條即可;一問多答時,發一條后,循環讀取多條指令,直至判別為“結束指令”判斷即可再發送下一條指令。另有些設備自帶接口函數,直接調用其讀寫函數即可。

圖3 一問多答處理流程
數據包處理通常根據協議內容格式處理。協議內容通常有固定位置定義和指定字符索引兩種。固定位置定義以MODBUS RTU為例,起始位(1個字節)+設備地址(1個字節)+功能代碼(1個字節)+長度(4個字節)……+校驗碼(2個字節)+結束符(1個字節),將數據包格式化成數組,索引相應位置字段即可。指定字符索引以NEMA協議為例,$aaccc,ddd,ddd,,,,ddd*hh(CR)(LF),需要根據地址域字符找到所需的數據幀,根據分隔符拆分字段,再根據字段定義解析。
通常串口類設備通信速度在秒級,針對單臺設備的讀數據和數據處理程序結構一般采用上述流程圖順序執行即可。
針對多臺設備連接數據處理或者程序數據量較大時,建議采用并行結構,將數據讀取和數據處理分線程并行處理。推薦采用生產者-消費者模式。

圖4 生產消費模式
本文針對常用串口通信協議,歸納分類并相應給出數據處理流程。成功應用于航天員人體代謝模擬、航天器儲運包裝箱測控系統等測控軟件編制。其中采用定長數據處理流程完成某固定長度的電量監測設備數據處理,采用變長數據處理流程完成北斗定位、GPS定位模塊數據處理,采用一問一答式數據處理流程完成稱重、流量、氣體組分等測量設備數據處理及空調設備控制、IO設備控制,采用一問多答式數據處理流程完成某電源歷史數據協議制定及數據處理。上述處理方法可根據實際組合變體使用,對同類串口通信數據處理、串口協議制定具有參考意義。