在您的帖子中
uchar CalculateCRCValue(uchar ucNewData,uchar ucCRCValue)
{
bit bXorValue; //
uchar ucTempValue; //模拟CRC硬件内部的8位数据寄存器
uchar ucCount;
for(ucCount=0; ucCount<8; ucCount++)
{
//提取新数据位与CRC寄存器的内容的异或值的D0位作为内部通道的输入
bXorValue = (ucNewData ^ ucCRCValue)& 0x01;
//执行X4、X5的异或操作
if(bXorValue)
{
ucTempValue = ucCRCValue ^ 0x18;
}
else
{
ucTempValue = ucCRCValue;
}
//CRC寄存器无进位右移
ucTempValue >>= 1;
//补上进位位,即D0位
if(bXorValue)
{
ucCRCValue = ucTempValue | 0x80;
}
else
{
ucCRCValue = ucTempValue;
}
//为处理下一位作准备
ucNewData >>= 1;
}
return ucCRCValue;
}
这个 ucTempValue = ucCRCValue ^ 0x18;
0x18是怎么来的,照我的理解应该是0x31
看图片上的逻辑应该这样算才对啊
uchar Calculate_CRC_byte(uchar NewData,uchar CRCValue) //单字节CRC计算
{
bit bXorValue;
uchar Count;
for(Count=0; Count<8; Count++)
bXorValue = ((NewData & 0x01)*0x80) != (CRCValue&0x80);
CRCValue <<= 1;
if(bXorValue)
{
CRCValue ^= 0x31;
}
//为处理下一位作准备
NewData >>= 1;
}
return CRCValue;
}
这样理解有什么不对? 请明白人指点,谢谢! |