這個校驗方法是屬于CRC-8/MAXIM,多項式就是提到的X8+X5+X4+1(簡記31),CRC初值為0x00。其步驟如下所述:
1)初值CRC=0x00
2)CRC與待驗數據異或并判斷最低位真假,若是真則執行第3步,若是假執行第4步
3)CRC與0x18異或再右移一位再與0x80按位或運算,執行第5步
4)CRC右移一位,執行第5步
5)待驗數據右移一位,執行第6步
6)判斷第5步是否已經執行8次,若8次,本次計算結束,若沒夠8次,執行第2步
這個步驟是對一個字節的校驗。下面給出C的代碼,可對一串數據進行校驗。
#include <stdio.h>
#include <stdlib.h>
/*
函數名稱:get_crc
說 明:對數據幀進行CRC-8MAXIM校驗,多項式31(簡記)
入 口:待校驗數據字節地址msg,待校驗數據個數msg_length
出 口:無
返 回:1個字節的CRC結果
*/
unsigned char get_crc(unsigned char *msg,unsigned char msg_length)
{
unsigned char crc=0;//初值
unsigned char data;//臨時數據變量
while (msg_length--)//待校驗數據數量
{
data = *msg++;//更新需要檢驗的數據
for (unsigned char i = 0;i < 8;i++)//一字節數據逐位校驗
{
if((crc^(data))&0x01)
{
crc ^= 0x18;
crc >>= 1;
crc |= 0x80;
}
else
{
crc >>= 1;
}
data >>= 1;
}
}
return crc;
}
int main()
{
unsigned char crc = 0x01;
crc = get_crc(&crc,1);
printf("0x%02x\n",crc);//對0x01CRC8校驗,結果為0x5e
system("pause");
return 0;
}
手動演算的你按照步驟來,不會有錯的。有錯也是你不夠細心和沒有耐心。祝你好運氣! |