隨著計算機技術(shù)的不斷發(fā)展,在現(xiàn)代工業(yè)中,利用微機進(jìn)行數(shù)據(jù)通訊的工業(yè)控制應(yīng)用得也越來越廣泛。由于傳輸距離、現(xiàn)場狀況等諸多可能出現(xiàn)的因素影響,計算機與受控設(shè)備之間的通訊數(shù)據(jù)常會發(fā)生無法預(yù)測的錯誤。為了防止錯誤所帶來的影響,一般在通訊時采取數(shù)據(jù)校驗的辦法,而循環(huán)冗余碼校驗是最常用的校驗方法之一。
一、循環(huán)冗余碼校驗原理
循環(huán)冗余碼校驗英文名稱為Cyclical Redundancy Check,簡稱CRC。它是利用除法及余數(shù)的原理來作錯誤偵測(Error Detecting)的。實際應(yīng)用時,發(fā)送裝置計算出CRC值并隨數(shù)據(jù)一同發(fā)送給接收裝置,接收裝置對收到的數(shù)據(jù)重新計算CRC并與收到的CRC相比較,若兩個CRC值不同,則說明數(shù)據(jù)通訊出現(xiàn)錯誤。
根據(jù)應(yīng)用環(huán)境與習(xí)慣的不同,CRC又可分為以下幾種標(biāo)準(zhǔn):
①CRC-12碼;
②CRC-16碼;
③CRC-CCITT碼;
④CRC-32碼。
CRC-12碼通常用來傳送6-bit字符串。CRC-16及CRC-CCITT碼則用是來傳送8-bit字符,其中CRC-16為美國采用,而CRC-CCITT為歐洲國家所采用。CRC-32碼大都被采用在一種稱為Point-to-Point的同步傳輸中。
下面以最常用的CRC-16為例來說明其生成過程。
CRC-16碼由兩個字節(jié)構(gòu)成,在開始時CRC寄存器的每一位都預(yù)置為1,然后把CRC寄存器與8-bit的數(shù)據(jù)進(jìn)行異或,之后對CRC寄存器從高到低進(jìn)行移位,在位(MSB)的位置補零,而最低位(LSB,移位后已經(jīng)被移出CRC寄存器)如果為1,則把寄存器與預(yù)定義的多項式碼進(jìn)行異或,否則如果LSB為零,則無需進(jìn)行異或。重復(fù)上述的由高至低的移位8次,第一個8-bit數(shù)據(jù)處理完畢,用此時CRC寄存器的值與下一個8-bit數(shù)據(jù)異或并進(jìn)行如前一個數(shù)據(jù)似的8次移位。所有的字符處理完成后CRC寄存器內(nèi)的值即為最終的CRC值。
下面為CRC的計算過程:
1.設(shè)置CRC寄存器,并給其賦值FFFF(hex)。
2.將數(shù)據(jù)的第一個8-bit字符與16位CRC寄存器的低8位進(jìn)行異或,并把結(jié)果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB補零,移出并檢查LSB。
4.如果LSB為0,重復(fù)第三步;若LSB為1,CRC寄存器與多項式碼相異或。
5.重復(fù)第3與第4步直到8次移位全部完成。此時一個8-bit數(shù)據(jù)處理完畢。
6.重復(fù)第2至第5步直到所有數(shù)據(jù)全部處理完成。
7.最終CRC寄存器的內(nèi)容即為CRC值。
二、循環(huán)冗余碼校驗程序的編寫
明白了CRC校驗碼的產(chǎn)生過程,編寫起程序來就非常容易了。由于Visual Basic的廣泛普及以及其在數(shù)據(jù)通訊中的重要地位,下面就以VB語言來編寫CRC的生成程序,其它語言只需稍做修改即可。
編寫CRC校驗程序有兩種辦法:一種為計算法,一種為查表法。下面對兩種方法分別討論。
一、循環(huán)冗余碼校驗原理
循環(huán)冗余碼校驗英文名稱為Cyclical Redundancy Check,簡稱CRC。它是利用除法及余數(shù)的原理來作錯誤偵測(Error Detecting)的。實際應(yīng)用時,發(fā)送裝置計算出CRC值并隨數(shù)據(jù)一同發(fā)送給接收裝置,接收裝置對收到的數(shù)據(jù)重新計算CRC并與收到的CRC相比較,若兩個CRC值不同,則說明數(shù)據(jù)通訊出現(xiàn)錯誤。
根據(jù)應(yīng)用環(huán)境與習(xí)慣的不同,CRC又可分為以下幾種標(biāo)準(zhǔn):
①CRC-12碼;
②CRC-16碼;
③CRC-CCITT碼;
④CRC-32碼。
CRC-12碼通常用來傳送6-bit字符串。CRC-16及CRC-CCITT碼則用是來傳送8-bit字符,其中CRC-16為美國采用,而CRC-CCITT為歐洲國家所采用。CRC-32碼大都被采用在一種稱為Point-to-Point的同步傳輸中。
下面以最常用的CRC-16為例來說明其生成過程。
CRC-16碼由兩個字節(jié)構(gòu)成,在開始時CRC寄存器的每一位都預(yù)置為1,然后把CRC寄存器與8-bit的數(shù)據(jù)進(jìn)行異或,之后對CRC寄存器從高到低進(jìn)行移位,在位(MSB)的位置補零,而最低位(LSB,移位后已經(jīng)被移出CRC寄存器)如果為1,則把寄存器與預(yù)定義的多項式碼進(jìn)行異或,否則如果LSB為零,則無需進(jìn)行異或。重復(fù)上述的由高至低的移位8次,第一個8-bit數(shù)據(jù)處理完畢,用此時CRC寄存器的值與下一個8-bit數(shù)據(jù)異或并進(jìn)行如前一個數(shù)據(jù)似的8次移位。所有的字符處理完成后CRC寄存器內(nèi)的值即為最終的CRC值。
下面為CRC的計算過程:
1.設(shè)置CRC寄存器,并給其賦值FFFF(hex)。
2.將數(shù)據(jù)的第一個8-bit字符與16位CRC寄存器的低8位進(jìn)行異或,并把結(jié)果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB補零,移出并檢查LSB。
4.如果LSB為0,重復(fù)第三步;若LSB為1,CRC寄存器與多項式碼相異或。
5.重復(fù)第3與第4步直到8次移位全部完成。此時一個8-bit數(shù)據(jù)處理完畢。
6.重復(fù)第2至第5步直到所有數(shù)據(jù)全部處理完成。
7.最終CRC寄存器的內(nèi)容即為CRC值。
二、循環(huán)冗余碼校驗程序的編寫
明白了CRC校驗碼的產(chǎn)生過程,編寫起程序來就非常容易了。由于Visual Basic的廣泛普及以及其在數(shù)據(jù)通訊中的重要地位,下面就以VB語言來編寫CRC的生成程序,其它語言只需稍做修改即可。
編寫CRC校驗程序有兩種辦法:一種為計算法,一種為查表法。下面對兩種方法分別討論。