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