康冰 趙琳 衛(wèi)瑞 張蔚 鄭洋
1、前言
在自動化控制系統(tǒng)(如單片機(jī)和DSP等嵌入式系統(tǒng))中,串行通信是實(shí)現(xiàn)兩端設(shè)備數(shù)據(jù)交換的一種非常重要且普遍使用的通信方式。串行通信在數(shù)據(jù)量要求不是特別高的情況下,因其具有硬件設(shè)備簡單、成本低廉、成熟度高和編碼復(fù)雜程度低等優(yōu)點(diǎn),為過去和現(xiàn)在的自動化控制系統(tǒng)作出了巨大的貢獻(xiàn),在未來一段時期仍將發(fā)揮不可低估的作用。
串行通信中,由于實(shí)際信道的傳輸特性不盡理想以及噪聲干擾,使得通信接收端易產(chǎn)生誤碼。為了保證通信可靠,實(shí)現(xiàn)兩端設(shè)備數(shù)據(jù)正確交換,通信協(xié)議中需要采取差錯控制技術(shù),實(shí)現(xiàn)差錯檢測和糾正,改善通信系統(tǒng)的傳輸可靠性。本文介紹了差錯控制技術(shù)在串行通訊協(xié)議中的應(yīng)用。
2、差錯控制概述
2.1差錯控制
差錯就是在通信接收端收到的數(shù)據(jù)與發(fā)送端實(shí)際發(fā)出的數(shù)據(jù)出現(xiàn)不一致的現(xiàn)象。差錯出現(xiàn)的原因有多種,如信號在物理信道中傳輸時,線路本身電器特性造成的隨機(jī)噪聲、信號幅度的衰減、頻率和相位的畸變、電器信號在線路上產(chǎn)生反射造成的回音效應(yīng)、相鄰線路間的串?dāng)_等造成的信號失真;如大氣中的閃電、開關(guān)的跳火、外界強(qiáng)電流磁場的變化、電源的波動等各種外界因素造成的信號失真等。在串行數(shù)據(jù)通信中,信號失真將會使接收端收到的二進(jìn)制數(shù)位和發(fā)送端實(shí)際發(fā)送的二進(jìn)制數(shù)位不一致,從而造成由“0”變成“1”或由“1”變成“0”的差錯。物理層傳輸鏈路受到干擾帶來的數(shù)據(jù)差錯無法被物理層識別,因而在數(shù)據(jù)鏈路層通信協(xié)議中采取差錯控制技術(shù),實(shí)現(xiàn)差錯檢測、數(shù)據(jù)糾正是十分必要的。
差錯控制是指在數(shù)據(jù)通信過程中能發(fā)現(xiàn)或糾正差錯,把差錯限制在盡可能小的允許范圍內(nèi)。差錯檢測是通過差錯控制編碼來實(shí)現(xiàn)的;而差錯糾正是通過差錯控制方法來實(shí)現(xiàn)的。
2.2差錯控制編碼
差錯控制編碼是用以實(shí)現(xiàn)差錯控制的編碼,可分為檢錯碼和糾錯碼。檢錯碼是指能自動發(fā)現(xiàn)差錯的編碼,如奇偶校驗(yàn)碼、循環(huán)冗余校驗(yàn)碼(CRC)等。糾錯碼是指不僅能發(fā)現(xiàn)差錯而且能自動糾正差錯的編碼,如正反碼、海明碼等。
差錯控制編碼的原理是:發(fā)送方對準(zhǔn)備傳輸?shù)臄?shù)據(jù)進(jìn)行抗干擾編碼,即按照某種算法附加上一定的冗余位,構(gòu)成一個碼字后再發(fā)送。接收方收到數(shù)據(jù)后進(jìn)行校驗(yàn),即檢查信息位和附加的冗余位之間的關(guān)系,以檢查傳輸過程中是否有差錯發(fā)生。
2.3差錯控制方法
差錯控制方法是在數(shù)據(jù)通信中檢測差錯后對差錯進(jìn)行糾正,把差錯限制在所能允許范圍內(nèi)的技術(shù)和方法。差錯控制方法一般可分為反饋檢測、自動請求重發(fā)(ARQ)和前向糾錯(FEC)三類。
反饋檢查方法的原理是:雙方在進(jìn)行數(shù)據(jù)傳輸時,接收方將接收到的數(shù)據(jù)重新發(fā)送回發(fā)送方,由發(fā)送方檢查是否與原始數(shù)據(jù)完全相符;如不相符,則發(fā)送方發(fā)送一個控制信息刪去出錯的數(shù)據(jù),并重新發(fā)送該數(shù)據(jù);如相符則發(fā)送下一個數(shù)據(jù)。
自動請求重發(fā)(ARQ)的原理是:發(fā)送方將要發(fā)送的數(shù)據(jù)附加上一定的冗余檢錯碼一并發(fā)送。接收方則根據(jù)檢錯碼對數(shù)據(jù)進(jìn)行差錯檢測;如發(fā)現(xiàn)差錯,則接收方返回請求重發(fā)的信息,發(fā)送方在收到請求重發(fā)的信息后,重新傳送數(shù)據(jù);如沒有發(fā)現(xiàn)差錯,則發(fā)送下一個數(shù)據(jù)。ARQ方式使用檢錯碼檢查差錯,并通過重發(fā)機(jī)制糾正差錯。
前向糾錯(FEC)的原理是:發(fā)送方將要發(fā)送的數(shù)據(jù)附加上一定的冗余糾錯碼一并發(fā)送,接收方則根據(jù)糾錯碼對數(shù)據(jù)進(jìn)行差錯檢測,如發(fā)現(xiàn)差錯,由接收方進(jìn)行糾正。FEC方式需要使用糾錯碼。
3、差錯控制在串口通信協(xié)議中的應(yīng)用
串口通信協(xié)議是串行通信的核心,它的主要功能是為應(yīng)用層提供可靠的數(shù)據(jù)信息。串口通信協(xié)議包括數(shù)據(jù)格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等。為了能夠充分發(fā)揮串口通信的自身作用,制定合適的數(shù)據(jù)鏈路層協(xié)議就顯得尤為重要。串口通信數(shù)據(jù)鏈路層協(xié)議包括協(xié)議幀結(jié)構(gòu)、重發(fā)機(jī)制等內(nèi)容。
3.1差錯控制編碼的應(yīng)用
3.1.1協(xié)議幀結(jié)構(gòu)
設(shè)備常用的串口通信數(shù)據(jù)鏈路層協(xié)議幀結(jié)構(gòu)一般包括幀頭、信息域、檢錯碼和幀尾。在實(shí)際應(yīng)用中,根據(jù)實(shí)際情況可以對幀結(jié)構(gòu)進(jìn)行刪減,但是刪減的前提是保證幀結(jié)構(gòu)的檢錯能力,把差錯限制在所能允許的范圍內(nèi)。
3.1.2幀頭和幀尾
如果接收端在接收中有一個錯誤,導(dǎo)致識別不到下一個數(shù)據(jù)幀的開始或結(jié)束,整個通信將會混亂,所以幀頭和幀尾的識別相當(dāng)重要。幀頭是識別幀起始的重要標(biāo)志。幀頭的長度越長識別的可靠性就越高,但是過長的幀頭會帶來整幀長度的增加,從而影響傳輸效率。因此幀頭一般控制在1-3個字節(jié)。幀尾是識別幀結(jié)束的重要標(biāo)志。如果定義了幀長度,那么可以通過幀長度和幀尾共同識別幀的結(jié)束,增加識別的可靠性。幀尾一般控制在1-2個字節(jié)。
3.1.3信息域
信息域包含的內(nèi)容豐富,長度是可變的。信息域包括地址段、控制段、數(shù)據(jù)段等多種信息。其中控制段的內(nèi)容還可細(xì)分為幀序號、幀長度、幀類型、通信控制命令和數(shù)據(jù)塊鏈接信息等等,它們可以根據(jù)實(shí)際需求刪減。地址段、控制段中的幀序號和幀長度等等信息都是識別差錯的重要依據(jù)。地址段用于識別發(fā)送端、接收端地址,如果不是多機(jī)通信,可以刪減。幀序號的設(shè)置主要目的是為了數(shù)據(jù)幀在傳輸過程中出錯時,進(jìn)行漏幀檢測。幀長度表示協(xié)議幀的字節(jié)數(shù),指示幀的結(jié)束位置。在非定長幀協(xié)議中,幀長度的定義是非常必要的。數(shù)據(jù)段是數(shù)據(jù)信息交互的部分。如果協(xié)議設(shè)計(jì)中數(shù)據(jù)段采用ASCII碼數(shù)據(jù)格式,幀頭幀尾、地址段、控制段等其他信息選用區(qū)別于數(shù)據(jù)段使用的ASCII碼,則在數(shù)據(jù)幀的檢測中可以大大提高識別的可靠性。ASCII碼數(shù)據(jù)格式的缺點(diǎn)是數(shù)據(jù)冗長、傳輸效率低,比較適用于數(shù)據(jù)量少且實(shí)時性要求不高的場合。
3.1.4檢錯碼的應(yīng)用
檢錯碼用于檢測通過物理層鏈路傳輸后數(shù)據(jù)可能出現(xiàn)的錯誤。比較常用的檢錯碼有:累加和、異或和、縱向冗余校驗(yàn)、循環(huán)冗余校驗(yàn)(CRC)等等。累加和(Check-Sum)校驗(yàn)算法:累加和校驗(yàn)碼的初始值為0,將需運(yùn)算的所有數(shù)據(jù)字節(jié)(8bit),與初始值相加模256,最后所得的余數(shù)即為累加和校驗(yàn)碼。異或(XOR)校驗(yàn)算法:異或和校驗(yàn)碼的初始值為0,將需運(yùn)算的所有數(shù)據(jù)字節(jié)(8bit),與初始值相異或,最后所得結(jié)果即為異或校驗(yàn)碼。縱向冗余(Longitudinal Redundancy Code,簡稱LRC)校驗(yàn)算法:縱向冗余校驗(yàn)碼的初始值為0,將需運(yùn)算的所有數(shù)據(jù)字節(jié)(8bit)相加,所得之和丟棄進(jìn)位,求補(bǔ)碼,所得結(jié)果即為縱向冗余校驗(yàn)碼。
循環(huán)冗余(Cyclic Redundancy Check,簡稱CRC)校驗(yàn)算法:將需運(yùn)算的所有數(shù)據(jù)字節(jié)(8bit),按照約定的CRC碼生成規(guī)則,用16位CCITT生成多項(xiàng)式G(x)生成的余數(shù)即是CRC碼(n位)。目前較常使用的CRC位數(shù)(n位)有8、16、32,CRC位數(shù)越大,錯誤檢測能力越強(qiáng),不過運(yùn)算費(fèi)時。據(jù)理論統(tǒng)計(jì),使用16位CRC時,超過17個連續(xù)位的錯誤檢測率有99.9969%。累加和、異或和、縱向冗余3種檢錯碼算法簡單,對內(nèi)存要求小,但是檢錯碼的重碼率高,錯誤檢測率低;相對來說CRC校驗(yàn)碼是高效的。
3.2差錯控制方法的應(yīng)用
根據(jù)多年的實(shí)際工作總結(jié),串口通信數(shù)據(jù)鏈路層協(xié)議中可以通過以下三種方法實(shí)現(xiàn)重發(fā)機(jī)制:逐字節(jié)檢測重發(fā)、全數(shù)據(jù)檢測重發(fā)、時間控制重發(fā)。
3.2.1逐字節(jié)檢測重發(fā)
逐字節(jié)檢測重發(fā)機(jī)制屬于差錯控制方法中的反饋檢測方法。兩端數(shù)據(jù)傳輸過程中進(jìn)行逐字節(jié)握手,如果握手不成功則重新開始逐字節(jié)握手,直到確認(rèn)整幀握手成功。優(yōu)點(diǎn):糾錯能力強(qiáng),不依靠檢錯碼檢錯、隨時糾錯。缺點(diǎn):兩端數(shù)據(jù)逐字節(jié)握手,傳輸效率低。這種數(shù)據(jù)重發(fā)機(jī)制適用于對傳輸時間要求低,但對傳輸可靠性要求高的系統(tǒng)。在進(jìn)行軟件系統(tǒng)設(shè)計(jì)時,需重點(diǎn)考慮完成整幀發(fā)送和接收的最長時間是否有可能對系統(tǒng)時間或時序造成影響。
3.2.2全數(shù)據(jù)檢測重發(fā)
全數(shù)據(jù)檢測重發(fā)機(jī)制屬于差錯控制方法中的自動請求重發(fā)方法。發(fā)送端將數(shù)據(jù)包一次性發(fā)出,接收端根據(jù)幀頭幀尾、地址段、檢錯碼等特征字符判斷接收的數(shù)據(jù)包的完整性和正確性,如果不正確要求發(fā)送端重發(fā)。與逐字節(jié)檢測方式相比,全數(shù)據(jù)檢測方式握手頻率減少,大大提高了傳輸效率,只是檢錯和糾錯只能在一幀數(shù)據(jù)傳輸完畢之后。
在進(jìn)行軟件系統(tǒng)設(shè)計(jì)時,如果選用這種數(shù)據(jù)重發(fā)機(jī)制,需考慮通信出現(xiàn)錯誤時發(fā)送方?jīng)Q定重發(fā)的條件、重發(fā)次數(shù)和重發(fā)延時時間,及對系統(tǒng)的影響。建議發(fā)送方的重發(fā)延時時間取T21的5~10倍。
3.2.3時間控制重發(fā)
時間控制重發(fā)機(jī)制屬于差錯控制方法中的前向糾錯方法的簡化。發(fā)送端按約定的頻率,不斷將數(shù)據(jù)幀發(fā)送到接收端;接收端根據(jù)幀頭幀尾、地址段、檢錯碼等特征字符判斷接收的數(shù)據(jù)包的完整性和正確性。由于沒有握手機(jī)制,如果檢測到差錯只能等待下一時刻的數(shù)據(jù)幀來完成糾錯;同樣由于沒有握手機(jī)制,數(shù)據(jù)傳輸具有較高的實(shí)時性,尤其在傳輸線路條件良好的前提下。
在進(jìn)行軟件系統(tǒng)設(shè)計(jì)時,需根據(jù)數(shù)據(jù)傳輸波特率、數(shù)據(jù)幀長度、字格式計(jì)算數(shù)據(jù)傳輸時間,然后確定數(shù)據(jù)幀間隔時間。上述幾種不同的差錯控制方法各有其優(yōu)缺點(diǎn)和使用范圍。如果存在反饋信道,而且傳輸?shù)膶?shí)時性要求不高,那么ARQ方式是很好的選擇。串口通信數(shù)據(jù)鏈路層協(xié)議廣泛采用了ARQ方式的差錯控制方法:運(yùn)用檢錯方法和重發(fā)機(jī)制達(dá)到對差錯的檢測和糾正。
4、結(jié)語
文中介紹了一種適用于單片機(jī)系統(tǒng)的串行數(shù)據(jù)通信協(xié)議,協(xié)議將差錯控制方法與差錯控制編碼相結(jié)合,實(shí)現(xiàn)了數(shù)據(jù)差錯的有效控制。差錯控制一直是保障通信傳輸可靠性的重要手段,通過合理運(yùn)用差錯控制方法可以有效的提高數(shù)據(jù)通信的可靠性及通信質(zhì)量。
(作者單位:北京航天發(fā)射技術(shù)研究所)