该标准上对于CRC16校验的描述如下:
在论坛上搜了很多代码实现,但是在测试的时候会出现偶尔校验码算错的情况,最终找到的C代码实现如下,亲测可用。需要注意的是,HJT212中的CRC16校验,和标准的CRC16校验不一样,也就是用网上那些在线校验工具算出的校验码都与HJT212中的不一致,所以在使用过程中不能以CRC16在线校验工具为判断对错的标准。
代码如下:
unsigned int HJT212_CRC16 ( unsigned char *msg, unsigned int msg_len )
{
unsigned int i,j,crc,check;
crc= 0xFFFF;
for(i = 0; i < msg_len ; i++)
{
crc = (crc >> 8) ^ msg[i];
for(j = 0; j < 8; j++)
{
check = crc & 0x0001;
crc >>= 1;
if(check == 0x0001)
{
crc ^= 0xA001;
}
}
}
return crc;
}