以下3种算法都何以生成同样的16位crc结果。
计算法最省单片机空间,查表法最快。
还有种简单查表,应该性能折衷。
/***************** 下面是5行示例crc16数据,前6个字节数据,后两个字节crc结果。
F9 0C C2 36 13 2A 55 2A
F9 0C C2 35 13 32 A5 20
F9 0C C2 61 13 3A E5 36
F9 0C C2 62 13 02 14 E4
F9 0C C2 39 13 0A 64 F1
******************/
//==================计算法======================//
//modbus计算16位crc
uint16 calcrc16(uint8 *p,uint8 len)
{
uint8 i,j,temp;
uint16 wcrc=0xffff;
for (i = 0; i < len; i++)//循环计算每个数据
{
temp = *p & 0X00FF;//将八位数据与crc寄存器亦或
p++;//指针地址增加,指向下个数据
wcrc ^= temp;//将数据存入crc寄存器
for (j = 0; j < 8; j++)//循环计算数据的
{ if (wcrc & 0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。
{ wcrc >>= 1;//先将数据右移一位
wcrc ^= 0XA001;//与上面的多项式进行异或
} else//如果不是1,则直接移出
{ wcrc >>= 1;//直接移出
}
}
}
//高低字节交换
return (wcrc<<8)+(wcrc>>8); }
/