回复 2# weinview
CRC16计算方法1:使用2个256长度的校验表
CRC16计算方法2:使用简单的校验表
CRC16计算方法3:使用直接结算的方法
通常在存储空间没有限制的情况下,采用方法1是最好的,毕竟在通讯中,保障通讯速度是至关重要的。而方法2占用空间很少。而与方法2相比,方法3似乎不占有什么优势。
现在一般采用方法1的较多,在weinview官网的下载中心--范例程序--D40与51单片机通讯实例中,我看到了一段CRC的代码,也就是采用了我上面说的算法1,如下:
uint crc16(uchar *puchMsg,uchar usDataLen) // puchMsg message to calculate CRC upon
{ // usDataLen quantity of bytes in message
uchar uchCRCHi = 0xFF ; // high byte of CRC initialized
uchar uchCRCLo = 0xFF ; // low byte of CRC initialized
uint uIndex ; // will index into CRC lookup table
while (usDataLen--) // Pass through message buffer
{
uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;
}
其中最后的return语句是否正确,是否应该为return (((uint)(uchCRCHi) << 8) | uchCRCLo) ;
还有一个疑问,在触摸屏宏指令CRC中,你们的源码是采用的哪种算法1,2还是3?如果采用了方法1,那最后的return语句是什么? |