这个校验方法是属于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;
}
手动演算的你按照步骤来,不会有错的。有错也是你不够细心和没有耐心。祝你好运气! |