新聞中心

EEPW首頁 > 測試測量 > 設(shè)計應(yīng)用 > 水情遙測系統(tǒng)中快速差錯校驗的軟件方法

水情遙測系統(tǒng)中快速差錯校驗的軟件方法

作者: 時間:2006-05-07 來源:網(wǎng)絡(luò) 收藏

摘要:討論了在自報式水情無線遙測系統(tǒng)數(shù)據(jù)通信中進行快速差錯校驗的必要性,給出了經(jīng)過實驗檢驗、可行的軟件快速校驗方法,并比較了它們的優(yōu)劣與適應(yīng)的場合。

本文引用地址:http://m.butianyuan.cn/article/255623.htm

關(guān)鍵詞:CRC 漢明碼 水情遙測 數(shù)據(jù)通信 差錯校驗

將測站的實時水情數(shù)據(jù)(水位、閘位、雨量等)準(zhǔn)確無誤地發(fā)送到中心站,提供給水文洪水預(yù)報、洪水調(diào)度、防洪排澇決策等高一級系統(tǒng),是水情遙測系統(tǒng)最基本、最重要的功能之一。水情遙測系統(tǒng)是一個軟硬件綜合系統(tǒng)。其基本工作流程是:在測量端(測站)完成水情參數(shù)的采集與處理(信源編碼、存儲記錄、信道編碼等),然后將處理過的數(shù)據(jù)通過無線或有線信道直接或經(jīng)中繼發(fā)送至遠端的中心站,由中心站進行接收解碼并作進一步處理。圖1為水情無線遙測系統(tǒng)結(jié)構(gòu)示意圖。測站和中繼站的主控設(shè)備一般采用單片機,用匯編語言編程;而中心接收端主機一般采用微型機,用C語言(或其它高級語言)編程。

水情遙測系統(tǒng)的報汛方式一般有三種:定時自報式、查詢-應(yīng)答多和混合式(自報和查詢-應(yīng)答兼容)。三種報汛方式兼有長短。綜合考慮系統(tǒng)功耗、可靠性、復(fù)雜性等要素,定時自報方式在水情遙測系統(tǒng)中仍占主流。其優(yōu)點是:功耗極低(值守狀態(tài)50μA@+12V,大多以蓄電池供電),系統(tǒng)結(jié)構(gòu)簡單,可靠性較高;缺點是無法實現(xiàn)反饋重發(fā)、反傳校驗等差錯控制。顯然,需要選擇一種合適的有差錯校驗方法。

水情遙測系統(tǒng)的數(shù)據(jù)通信方式可分為超短波通信、微波通信、衛(wèi)星通信、移動通信、有線通信等。因其遙測站點常建于交通不便、供電及有線通信條件不足的地區(qū),基于建設(shè)成本及運行費用等考慮,數(shù)據(jù)通信仍以無線超短波通信為主要方式。

在無線數(shù)據(jù)通信過程中,即使信道質(zhì)量良好,但由于信號衰減、失真,特別是某些突發(fā)性的干擾(如雷電,電磁輻射)不可避免地會發(fā)生數(shù)據(jù)誤傳,即誤碼。根據(jù)水情遙測系統(tǒng)的相關(guān)規(guī)范,超短波數(shù)據(jù)傳輸?shù)恼`碼率應(yīng)小于10 -4,以及在每個數(shù)據(jù)收集周期平均應(yīng)有90%以上測站(重點控制站必須包括在內(nèi))能準(zhǔn)確傳送數(shù)據(jù)至中心站。因此采取適當(dāng)?shù)牟铄e控制方法,提高數(shù)據(jù)傳輸?shù)目煽啃院苡斜匾?。常用的差錯控制方法分軟件和硬件方式。最簡單的是由器件直接實現(xiàn)奇偶校驗方式,它占用10%的時間,只檢出奇數(shù)個位出錯。據(jù)檢測,在電話網(wǎng)中以1200波特率傳輸數(shù)據(jù)時,若采用奇偶校驗方式,仍會有40%的錯誤不能檢出,這對水情遙測顯示是不夠的。欲對包括中繼在內(nèi)的每一個站實行碼校驗,還要求所選校驗方式具有高檢出率、速度快、編碼簡單等特點。常見的方式有漢明碼、循環(huán)冗余校驗(CRC)等,雖然這些校驗方式也可由硬件實現(xiàn),但人們角傾向于采用簡單經(jīng)濟又具靈活性的軟件校驗。以下結(jié)合工作實際給出經(jīng)驗證可行的快速校驗方式,并比較了它們的優(yōu)劣。文中所涉及到的程序算法均以C語言的形式給出,而將其轉(zhuǎn)變成單片機的算法也不難。

1 CRC校驗

CRC(Cyclical Redundancy Check)校驗,又稱循環(huán)冗余校驗,具有極強的檢錯能力(不能糾錯),算法簡單。早期用硬件電路直接搭成,但軟件方法成本更低,實現(xiàn)更簡單,運算速度也很快。16位的CRC檢錯率如表1所示[1]。

表1 16位的CRC檢錯率

單位個位錯誤 雙位錯誤 奇數(shù)個位錯誤 比16位短的突出性錯誤 恰好17位的突發(fā)性錯誤 其他所有突發(fā)性錯誤
100% 100% 100% 100% 99.9969% 99.9984%

常用的16位CRC多項式有兩種:一種是CRC-CCITT標(biāo)準(zhǔn),在微機通信的XMODEM協(xié)議中得到了應(yīng)用;另一種是CRC-16標(biāo)準(zhǔn),它實際捕獲錯誤的能力不如CRC-CCITT,在IBM的二進制同步協(xié)議(BYSYNC)的數(shù)據(jù)傳送中應(yīng)用已久。兩者采用的多項式如表2所示,本文采用前者。

表2 常用的16位CRC多項式

生成多項式的值(genpoly) 本原多項式表示 標(biāo) 準(zhǔn)
1021H
F005H
X 16+X 12+X 5+1
X 16+X 15+X 2+1
CRC-CCITT
CRC-16

注:genpoly為generator polynomial的合成調(diào),在程序中用作“生成多項式”寄存器。

1.1 直接模2除法CRC實現(xiàn)方式

對16位的CRC而言,用信息段作被除數(shù),生成多項式(本文1021H,CCITT標(biāo)準(zhǔn))作除數(shù),進行模2除法所產(chǎn)生的余數(shù)(2字節(jié))即為CRC校驗值,且CRC校驗只間余數(shù)而不管商是多少。發(fā)送時將校驗值連在信息段的后面一起發(fā)送。在接收端,接收方只需把接收到的CRC校驗值連同信息一,作為新的信息段并對其進行相同的CRC運算(只比發(fā)送時多2字節(jié))。若得到的新余數(shù)(校驗值)為0,則表明接收到的信息段和CRC都無差錯;反之,說明信息段或CRC有錯,應(yīng)做相應(yīng)處理。所以CRC的編碼和譯碼并沒有本質(zhì)的區(qū)別。程序如下:USHORT crc(USHORT data,USHORT genpoly,USHORT accum)

{// data:數(shù)據(jù),所用信息字的第一個字節(jié);genpoly:CRC多項式,如1021H;accum:累加器的值,第一次賦0,以后放每次校驗結(jié)果。

data=8; //信息字節(jié)左移到高字節(jié)

for(int i=8;i>0;i--){

if((data^accum)0x800) //如果(data異或accum)的最高位是1

accum=(accum1)^genpoly; //移位與genpoly異域

else accum=1; //否則僅移位

data=1; //將信息字的下一位升格

}

return accum; //返回用作下一個信息字校驗的累加器值

}

1.2 快速CRC實現(xiàn)方式

直接模2除法CRC方式雖編程簡單,但效率不高。采用方式方式,要使用16位的多項式及兩字節(jié)的累加器,對每一信息位(bit)累加器都要移位一次,再根據(jù)移位結(jié)果判斷是否作異式;每一字節(jié)重復(fù)8位,運算速度相對較慢,不符合計算機按比特進行計算的規(guī)律。但如果采用微機通信中XMODEM協(xié)議所使用的CRC查詢方式,則比直接CRC模2除法方式快4~10倍。查詢方法實施過程:首先用信息字節(jié)與累加器的高字節(jié)進行異或,并將其結(jié)果作初始累加器為0的CRC;然后與原累加器的低字節(jié)再作一次異或。第一步只有256個樣式,可以構(gòu)造一個256個雙字節(jié)的查詢表,一步實現(xiàn)。這樣對每一字節(jié)只要作兩次操作就可完成。以下是具體步驟。

(1)構(gòu)造查詢表,運行直接模2除法CRC函數(shù)CRC(i,1021,0),用I從0~255代入,將結(jié)果按序排列可得到一個256個樣式的雙字節(jié)查詢表。該表只作一次,可以先用C語言微型機上作好,然后再移到單片機上,留作以后查詢使用。

(2)取一個雙字節(jié)累加器accum,賦初值0,將信息流的第一個字節(jié)賦給另一雙字節(jié)變量data(accum和data都是雙字節(jié)變量,以下步驟也是作雙字節(jié)運算)。

(3)將accum>>8(也即取原累加器accum的高字節(jié))的值與信息字data相異或,所得結(jié)果(是一個256的值)查上述構(gòu)造好的查詢表,得到一個16位的暫存值。

(4)將accum8(即原累加器accum的低字節(jié)左移成高字節(jié),低位補0),與上一步得到的暫存值(16位的值)相異或,結(jié)果作為新的累加器值,賦值給accum。

(5)取信息流的下一字節(jié)賦給data,重復(fù)進行第(3)步和第(4)步,直至所有的信息字節(jié)寢用完為止,最后累加器的值就是余數(shù)。

2 擴展?jié)h明碼

2.1 編碼方法

CRC校驗只能檢錯但不能糾錯。而1949年提出的漢明碼是一種能糾正單個錯誤的線性分組碼。其中,既是線性分組碼同時也是循環(huán)碼的(7,4)碼有兩種。其生成矩陣和校驗矩陣分列如下:

兩者使用效果等價。

漢明碼是糾正單個錯誤的完備碼,所有的接收碼都可對應(yīng)到一個信息(多一對應(yīng)),要么是正確信息,要么是發(fā)生單個錯誤的情形。當(dāng)有兩個錯誤時,會把它當(dāng)成另一個碼的單個錯誤加以糾正,導(dǎo)致誤碼。

擴展?jié)h明碼在此基礎(chǔ)上引入一個校驗和,即在編碼在時候增加第8位偶校驗位,構(gòu)成(8,4)線性分組碼,因而可以糾正一位錯誤同時檢出兩位錯誤。事件上,在發(fā)生錯誤時就是這個偶校驗位確定了是錯一位還是錯兩位。若錯一位則可以糾正,錯兩位就只能檢出但不能糾正。

編、譯碼均以擴展?jié)h明碼(8,4)線性分組碼為例。為了方便單片機的運算,實現(xiàn)快速編碼,可采用查詢法。因為信息是一個4位的矢量,記作C,共有16個可能值。為了構(gòu)成8位發(fā)射碼矢量,可以建立16個一字節(jié)的查詢作為8位的發(fā)送碼。以生成矩陣G1為例,用信息矢量C乘以成矩陣G1再加上一位偶校驗就得到了生成碼(發(fā)送碼)。查詢表為:

信息生成碼信息生成碼信息生成三信息生成碼
0000
0001
0010
0011
00000000
00010111
00101101
00111010
0100
0101
0110
0111
01001110
01011001
01100011
01110100
1000
1001
1010
1011
10001011
10011100
10100110
10110001
1100
1001
1110
1111
11000101
10011100
11101000
11111111

2.2 譯碼方法

用查詢法對(8,4)碼進行譯碼,需要建造有256個值的查詢表。按照譯碼編寫查詢表。先定出擴展?jié)h明碼的校驗矩陣,實際上就是將原校驗矩陣H1擴展,記為H1,

對于作一8位的接收碼矢量R,進行RH1 T運算,得到一個4位的伴隨矢量,再按如下步驟比較確定原信息。

(1)如果伴隨式矢量是全0矢量,接收碼是正確的,碼的前(低)4位就是信息。

(2)如果伴隨矢量的最后一位是1,則有一位錯,可糾正。將伴隨矢量與矩 陣H1的每一列相比較,找出相同的那一列,記下列號,再將接收碼與該列號相對應(yīng)的那一位變號(1變0,0變1),得到的碼就是糾正后的原碼,信息取碼的前(低)4位。

(3)否則,是一位以上的錯碼且不能糾正。

將一個字節(jié)可能出現(xiàn)的所有0~255個可能值值都按上面的譯碼步驟做一遍得到查詢表,留作譯碼用。另外譯碼和編碼還可以對整個信息字節(jié)作一字節(jié)的垂直校驗以增強校驗?zāi)芰Α?/p>

上述檢驗方式已在江蘇、寧夏、福建等地的實際工作中得到了驗證。CRC校驗雖不具備糾錯功能但有很高的檢錯率,應(yīng)用面也很廣。其中,直接模2除法CRC方式因編程簡單、占用程序空間少(不用查詢表),適合于數(shù)據(jù)通信量不大且程序及內(nèi)存空間有限的場合,反之可選用快速CRC方式。在對數(shù)據(jù)完整性要求高的場合,可根據(jù)具體情況考慮使用漢明碼呀擴展?jié)h明碼。某些要求更高的特殊情況下,則可選用更復(fù)雜一些的校驗碼,同時通信條件的好壞也是影響校驗方式選用的因素之一。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
矢量控制相關(guān)文章:矢量控制原理
水位傳感器相關(guān)文章:水位傳感器原理


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉