CRC演算法

ckkyjtqlt發表於2017-07-26
  1. CRC16-MODBUS 
  2. 多項式碼:A001(8005的二進位制反轉後結果,所謂反轉即是二進位制碼倒轉一遍,例如8005:1000000000000101,反轉後A001:1010000000000001)
  3. unsigned int CRC16(unsigned char *buf,unsigned char length)//CRC16計算  
  4. {  
  5.   unsigned char i;  
  6.   unsigned int crc=0xFFFF;  
  7.   while(length--)  
  8.     for(crc^=*(buf++),i=0;i<8;i++)  
  9.       crc=(crc&0x0001)?(crc>>1)^0xA001:crc>>1;  
  10.   return crc;  
  11. }  

演算法:

;1) 設定1個16 位的暫存器(高位元組和低位元組)稱此暫存器為 CRC暫存器。填充為: 0FFFFH

;2) 把(待處理的)第一位元組資料與 CRC暫存器的低位元組相異或, 結果放於 CRC暫存器。

;3) 把 CRC 暫存器的內容右移一位,最高位(Bit15)填0, 移出位(Bit0)在標誌暫存器的C內。

;4) 如果移出位為 0, 重複第 3 步 ( 再次右移一位); 如果移出位為 1, CRC 暫存器與多項式A001 ( 1010 0000 0000 0001) 進行異或。

;5) 重複步驟 3 和步驟 4, 直到右移 8 次,這樣一個位元組資料處理結束。

;6) 重複步驟 2 到步驟 5, 進行下一個位元組的處理。

;7) 將所有位元組資料按上述步驟計算完成後,得到的16位CRC暫存器的高、低位元組進行交換。

;8) 最後得到的 CRC暫存器內容即為 CRC碼。


相關文章