1. 前面的数 7A 01 00,计算的结果是0X4920
2. 那么把数据CRC加上
3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!!
4. 换了套代码,还是一样的值,难道说,CRC检验的必须是双数字节吗?我输入的是5个,或许我可以输入6个测试一下,也不行
5. 去CRC官网看了一下
对比下代码发现,CRC-16用的多项式应该是0XA001,总上所述,第3步的代码是错误的。那么我有疑问,为啥第3步的代码居然还有人在用?而且使用正确,我猜测那套产生自己的CRC,又检验自己的CRC,说起来是定制化的一套CRC,不是标准的CRC,所以那套CRC只能自产自销,如果去校验另外一个人产生的标准的CRC数据就会出错了。
6. 下面是从gitHUB上下载的代码实际测试可用。https://github.com/lammertb/libcrc
uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ) {
uint16_t crc;
uint16_t low_byte;
uint16_t high_byte;
uint16_t short_c;
uint16_t short_p;
const unsigned char *ptr;
size_t a;
crc = CRC_START_SICK;
ptr = input_str;
short_p = 0;
if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {
short_c = 0x00FF & (uint16_t) *ptr;
if ( crc & 0x8000 ) crc = ( crc << 1 ) ^ CRC_POLY_SICK;
else crc = crc << 1;
crc ^= ( short_c | short_p );
short_p = short_c << 8;
ptr++;
}
low_byte = (crc & 0xFF00) >> 8;
high_byte = (crc & 0x00FF) << 8;
crc = low_byte | high_byte;
return crc;
} /* crc_sick */