在除錯客戶使用平台下
,測試出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...