大佬们,我用了计算法和查表法来进行CRC校验,但是两种方法都没有的到我想要的结果,能帮我研究研究吗?
uint16_t getcrc16(uint8_t *puchMsg, uint8_t usDataLen)
{
unsigned short tmp = 0xffff;
unsigned short ret1 = 0;
int n, i;
for(n = 0; n < usDataLen; n++)
{
tmp = puchMsg[n] ^ tmp;
for(i = 0; i < 8; i++)
{
if(tmp & 0x01)
{
tmp = tmp >> 1;
tmp = tmp ^ 0xa001;
}
else
tmp = tmp >> 1;
}
}
ret1 = tmp >> 8;
return (ret1 | (tmp << 8));
// uint8_t uchCRCHi = 0xFF ;
// uint8_t uchCRCLo = 0xFF ;
// uint8_t uIndex = 0;
// uint16_t crc_data;
//
// while (usDataLen--)
// {
// uIndex = uchCRCHi ^ *puchMsg++;
// uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
// uchCRCLo = auchCRCLo[uIndex] ;
// }
// crc_data = uchCRCHi;
// crc_data = crc_data << 8;
// return (uint16_t)(crc_data | uchCRCLo) ;
}
我输入的数据是uint8_t rx_buff[8] = {0x01,0x03,0x00,0x01,0x00,0xd5,0xca};
返回的数据应该的是01 03 02 03 E9 79 3A 才对,但是两个方法的返回值的第一位分别为04和02,其他的都能对应上,数组也没有超限,求大神帮忙指点一二。 |