这两天看了论坛上CRC的相关帖子,自己也调了调,采用的是计算方法求CRC,使用KEIL的软件防真发现了以下问题: (1)和(2)程序仅两条语句的先后顺序不同,最后观察的结果也不同,想了半天也没有搞懂,各位看看是什么原因啊?
(1)正常的的程序(运行最后结果result=0): #include "reg51.h" #define uchar unsigned char #define uint unsigned int uchar DataBuff [10] = { 0x10,0xff,0x05,0xf9,0x86,0x6d,0xd2,0xe3}; /************************************************************************ 函数名称:GetCrc16 函数功能:计算方法得到16位CRC 生成多项式: G(X)=X^16 + X^12 + X^5 + 1 输入参数:计算CRC16数组的首地址;数据的长度; 输出参数:16位CRC结果 创建日期:2007.6.28 *************************************************************************/ uint GetCrc16(uchar *ptr,uchar len) { uchar i; uint crc = 0; while(len--) { for(i=0x80; i!=0; i>>=1) { if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} //1-1 else crc<<=1; //1-2 if((*ptr&i)!=0) crc^=0x1021; //1-3 } ptr++; } return(crc); }
void main(void) {
uint result; result = GetCrc16(DataBuff,8);//求8个字节的CRC.
DataBuff[9] = (result&0xff); //CRC低位在后 !!!!!!!!! DataBuff[8] = (result>>8)&0xff;//CRC高位在前!!!!!!!!!!就这里和(2)的顺序不同.
result = GetCrc16(DataBuff,10);
while(1); } (2)有问题的程序(运行最后结果result=0xD100):
#include "reg51.h" #define uchar unsigned char #define uint unsigned int uchar DataBuff [10] = { 0x10,0xff,0x05,0xf9,0x86,0x6d,0xd2,0xe3}; /************************************************************************ 函数名称:GetCrc16 函数功能:计算方法得到16位CRC 生成多项式: G(X)=X^16 + X^12 + X^5 + 1 输入参数:计算CRC16数组的首地址;数据的长度; 输出参数:16位CRC结果 创建日期:2007.6.28 *************************************************************************/ uint GetCrc16(uchar *ptr,uchar len) { uchar i; uint crc = 0; while(len--) { for(i=0x80; i!=0; i>>=1) { if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} //1-1 else crc<<=1; //1-2 if((*ptr&i)!=0) crc^=0x1021; //1-3 } ptr++; } return(crc); }
void main(void) {
uint result; result = GetCrc16(DataBuff,8);//求8个字节的CRC.
DataBuff[8] = (result>>8)&0xff;//CRC高位在前 !!!!!!! DataBuff[9] = (result&0xff); //CRC低位在后 !!!!!!!就这里顺序和(1)不同. result = GetCrc16(DataBuff,10);
while(1); }
|