■ 夏志飛 趙雷/凌云科技集團有限責任公司
串口通信常用于計算機及嵌入式設備的數(shù)據(jù)通信,尤其是在遠程控制、測試測量等工業(yè)應用中,數(shù)據(jù)經(jīng)常以數(shù)據(jù)包的形式傳輸,發(fā)送數(shù)據(jù)時需封包,接收數(shù)據(jù)時需解包,準確無誤地解包是一項非常重要的工作。
目前常見的串口通信接口標準有RS-232、RS-422、RS-485等, 其 中,RS-232是美國電子工業(yè)協(xié)會(EIA)在20世紀60年代發(fā)布的通信協(xié)議,方便不同廠家產(chǎn)品之間數(shù)據(jù)的通信;RS-422在RS-232的基礎上提高了傳輸距離和抗干擾能力;RS-485又在RS-422的基礎上增加了多點雙向通信能力[1]。這幾種標準只規(guī)定了通信接口的物理層電氣標準,在此基礎上,用戶可以建立自己的高層通信協(xié)議。
對于工程應用而言,信息傳輸?shù)姆€(wěn)定性以及正確性非常重要,如果每次傳輸?shù)臄?shù)據(jù)超過一幀,一般就采用數(shù)據(jù)包的形式傳輸。如圖1所示,每個數(shù)據(jù)幀由多個連續(xù)的位(Bite)構成,通常包括起始位、數(shù)據(jù)位、校驗位和停止位,數(shù)據(jù)位長度一般為5~9,每個數(shù)據(jù)包又由多個連續(xù)的數(shù)據(jù)幀構成。串口通信的速率相對較低,一般數(shù)據(jù)量有限,采用單數(shù)據(jù)包機制,少數(shù)也有采用類似網(wǎng)絡通信分層處理方式的,但中間層一般還是采用數(shù)據(jù)包機制。
為了避免數(shù)據(jù)傳輸中的混亂與錯誤,便于數(shù)據(jù)的解釋與分析,數(shù)據(jù)包之間必須有明顯的標志,通常基于以下兩種方式。
以特殊字符作為數(shù)據(jù)包的開始,再根據(jù)幀尾或幀長確定整個數(shù)據(jù)包,具體的格式很多,如包頭+數(shù)據(jù)+校驗+包尾、包頭+數(shù)據(jù)長度+數(shù)據(jù)+校驗值等,優(yōu)點是特殊字符識別容易、邏輯簡單,缺點是數(shù)據(jù)域中不能包含包頭、包尾,當然可通過增加轉(zhuǎn)義符的方式來避免,只是要增加額外的處理。
圖1 數(shù)據(jù)包結構
數(shù)據(jù)包內(nèi)數(shù)據(jù)連續(xù)傳輸,數(shù)據(jù)包間存在一定的間隔時間。優(yōu)點是比較通用,絕大部分串口通信都不是滿負荷傳輸,數(shù)據(jù)包間都存在較大的時間間隙;缺點是處理稍復雜,需要判定時間。
當然,以上兩種方法經(jīng)常結合在一起使用,可以減少數(shù)據(jù)傳輸中出現(xiàn)的異常,共同保證了數(shù)據(jù)傳輸?shù)目煽俊?/p>
串口數(shù)據(jù)包的解包過程通常分為數(shù)據(jù)包分割、數(shù)據(jù)提取與分析兩部分,在不清楚串口通信協(xié)議的情況下,還需反推數(shù)據(jù)幀和數(shù)據(jù)包的格式。
在缺少資料的情況下,可直接基于串口通信物理接口進行分析,采用示波器分析可知串口通信的類型。RS-232一般采用三線制傳輸數(shù)據(jù),少數(shù)采用五線制傳輸數(shù)據(jù),標準RS-232信號電平為±12V;單片機之間的通信有時也采用TTL電平標準。RS-422/RS-485采用四線或雙線差分傳輸,差分電壓一般為±5V。
確定串口通信標準后,還需確定數(shù)據(jù)幀的格式。采用邏輯分析儀進行分析較為方便,部分邏輯分析儀如Saleae Logic等包含了串行總線數(shù)據(jù)分析功能(見圖2)[2],設定串口數(shù)據(jù)幀的波特率、數(shù)據(jù)位長度、停止位、校驗位等參數(shù)后再分析采樣數(shù)據(jù),嘗試幾次便可確定數(shù)據(jù)幀的格式。
絕大部分數(shù)據(jù)包之間都存在一定的時間間隙,可據(jù)此判定分割。數(shù)據(jù)量較多時,一般需借助計算機程序自動分割,下面介紹一種數(shù)據(jù)包分割識別的方案。
圖3為數(shù)據(jù)包分割的基本流程,無論是計算機還是單片機都可使用。對于計算機而言,Windows操作系統(tǒng)下定時器精度一般只達到1ms,無數(shù)據(jù)時長(數(shù)據(jù)包間隔)一般要求大于10ms;對于單片機而言,由于不少型號的單片機沒有串口硬件緩存,定時查詢的時間需小于單個數(shù)據(jù)幀傳輸?shù)臅r間。
依據(jù)數(shù)據(jù)包間隔超時分割數(shù)據(jù)包時,還可同時依據(jù)數(shù)據(jù)包頭、數(shù)據(jù)包尾、校驗等進行判定及篩選,圖4是基于此原理開發(fā)的UART splitter軟件數(shù)據(jù)包分割的設置界面。
反推數(shù)據(jù)包格式時,首先確定數(shù)據(jù)包的構成。一般數(shù)據(jù)的包頭、包尾、包長度的位置是固定的,較容易識別;校驗通常有和校驗、CRC校驗等幾種,需要猜測幾次才能確定;余下的一般就是數(shù)據(jù)區(qū)。
圖2 Saleae Logic邏輯分析儀串口總線分析設置界面
圖3 數(shù)據(jù)包分割的基本流程
圖4 UART splitter軟件數(shù)據(jù)包分割設置界面
確定數(shù)據(jù)包的構成后,需要重點分析的便是數(shù)據(jù)區(qū)。常見的數(shù)據(jù)編碼有BNR(按2的補碼小數(shù)記法表示的二進制)碼、BCD碼或ASCII碼等,少數(shù)采用自定義編碼,或由多個數(shù)據(jù)組合成一個數(shù)據(jù)包,甚至涉及加密,這樣的數(shù)據(jù)需要大量采樣后統(tǒng)計、分析其規(guī)律。
數(shù)據(jù)包中的數(shù)據(jù)通常不能直接處理,其處理方式需根據(jù)工程的需求而定,一般需將有效數(shù)據(jù)提取出來并進行一定的轉(zhuǎn)換處理后再進行分析。若數(shù)據(jù)量很大或計算復雜時,Windows操作系統(tǒng)下一般需另開線程處理,單片機中一般需在低級別的中斷中處理,以確保數(shù)據(jù)包分割的實時性。
本文主要介紹了串口數(shù)據(jù)解包的基本原理和方法,該方法已應于筆者參與的多個工程中,取得了較好的效果,此外,該方法對 SPI、I2C、CSDB、Manchester等串行總線數(shù)據(jù)的解包也有借鑒意義。