基於E2P讀寫的CRC 16校驗

2021-05-22 13:56:23 字數 2676 閱讀 2323

在除錯客戶使用平台下

,測試出e2p讀crc校驗碼的bug。在客戶重複上電的情況下,讀e2p crc校驗資料不匹配,導致設定預設引數資料進行系統初始化。此問題開始沒有重視,最終測試到時crc校驗出錯。

以下是crc原理,演算法可以不用太了解。

一、什麼是crc校驗

迴圈校驗碼(

jyclic redundancy check,簡稱crc碼):

是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。

二、crc校驗計算

crc碼是由兩部分組成,前部分是資訊碼,就是需要校驗的資訊,後部分是校驗碼,如果crc碼共長n個bit,資訊碼長k個bit,它的編碼規則是:

1、首先將原資訊碼(kbit)左移r位(k+r=n),對應多項式為m(x)。

2、運用乙個生成r次多項式g(x)(也可看成二進位制數)用模2除上面的式子,得到的

餘數

就是校驗碼,r=r。

非常簡單,要說明的:模2除就是在除的過程中用模2加,模2加實際上就是我們熟悉的異或運算,就是加法不考慮進製,公式是:    

0+0=1+1=0,1+0=0+1=1

,即『異』則真,『非異』則假。

由此得到定理:a+b+b=a 也就是

『模2減』和『模2加』直值表完全相同。

有了加減法就可以用來定義模2除法,於是就可以用生成多項式g(x)生成crc校驗碼。

例如:**

1010111

對應的多項式為

x6+x

4+x2+x+1

,而多項式為

x5+x

3+x2+x+1

對應的**

101111

現在計算 資訊碼1011001(多項式為x6+x

4+x3+1),生成多項式g(x)=x4+x

3+1(資訊碼為11001)的crc,計算過程如下

step1:   1011001左移4位得到10110010000

steo2:   採用多項式除法:  得餘數為: 1010     (即校驗欄位為:1010)

crc碼即為1011001,1010 (逗號前為資訊碼,後為校驗碼)

三、實際應用(基於crc-4校驗)

傳送方

:發出的傳輸欄位為: 

1 0 1 1 0 0 1

1 0 10

資訊字段      

校驗字段

接收方

:使用相同的生成碼進行校驗:接收到的字段/生成碼(二進位制除法)

如果能夠除盡,則正確

四、部分例項程式(基於crc-16)

#define initcrc    0x1021

//

多個位元組生成累加後的最終crc校驗碼crc-16,生成兩個位元組crc碼

static word makecrc( word address, word length)

return crc; }

//乙個位元組crc-16 校驗生成碼

static word gencrc16(word accum, byte datain)

return accum; }

//e2p讀

ret_stat fargm_readnvramblock(byte b_blocktype, byte b_index, byte * bp_buffer, word w_offset, word w_length )

gm_print("dnvram_readblock =%d",dnvram_readblock(address, bp_buffer, length) );

if(dnvram_readblock(address, bp_buffer, length) == ok)

#if 0

//讀入crc校驗碼是否和上次儲存引數後的crc碼是否一致

if(address != makecrc(info.address, length))

#endif }

gm_print("----ok-----",0 );

return ok; }

}return err_read; }

#define crc_size 

sizeof(word)

//e2p寫

ret_stat far gm_writenvramblock(byte b_blocktype, byte b_index, byte * bp_buffer, word w_offset, word w_length)

if(dnvram_writeblock(address, bp_buffer, length) == ok)//寫完儲存的引數資料

return ok; }

} return err_write; }

CRC16校驗的學習

一般一些工業上儀器儀表都會選擇crc16校驗,而寫程式對幀資料的校驗也需要選擇crc16校驗看看對不對。所以選擇crc16校驗還是很有必要的。當然crc是2位元組的,具體儲存方式大端儲存還是小端儲存,不同機器不一樣。crc的初值也可能不一樣有的是0x0000,而有的又卻是0xffff具體怎麼選還有根...

C 中的crc16校驗

private static ushort crctab new ushort 256 crc校驗公式 crc 傳送的資料序列 新crc private static ushort xcrc ushort crc,byte cp 新增crc校驗字 資訊串 不包括校驗字的串總長度 public sta...

基於Qt的CRC16校驗實現(查表法)

簡介 crc為校驗和的一種,是兩個位元組資料流採用二進位制除法 沒有進製,使用xor來代替減法 相除所得到的餘數。其中被除數是需要計算校驗和的資訊資料流的二進位制表示 除數是乙個長度為 n 1 的預定義 短 的二進位制數,通常用多項式的係數來表示。rc16碼表 static const quint1...