crc校验,keilc里和vb得到的校验码不同,请问什么原因,谢谢
keil里单片机程序unsignedshortcal_crc(UChar*ptr,UCharlen){u8CRC16Lo,CRC16Hi,CL,CH,SaveHi,Sav...
keil里单片机程序
unsigned short cal_crc(UChar *ptr , UChar len)
{
u8 CRC16Lo ,CRC16Hi,CL,CH,SaveHi,SaveLo,lag;
unsigned short crc16;
CRC16Lo = 0xFF;
CRC16Hi = 0xFF;
CL = 0x21;
CH = 0x10 ;
while(len--!=0)
{
CRC16Lo ^= *ptr ;
for (lag=0;lag<8;lag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo ;
CRC16Hi = ((CRC16Hi)>>1);
CRC16Lo = ((CRC16Lo)>>1);
if (((SaveHi) & (0x01)) == 1)
{
CRC16Lo|=0x80;
}
if (((SaveLo) & (0x1)) == 1)
{CRC16Hi^=CH;
CRC16Lo^=CL;
}
}
ptr++;
}
ReturnData[0] = CRC16Hi ;
ReturnData[1] = CRC16Lo ;
crc16 =( ReturnData[0]<<8)| ReturnData[1];
return crc16;
}
请问,我单片机里的程序完全按照这个改的,为什么得到的校验码不同,谢谢 展开
unsigned short cal_crc(UChar *ptr , UChar len)
{
u8 CRC16Lo ,CRC16Hi,CL,CH,SaveHi,SaveLo,lag;
unsigned short crc16;
CRC16Lo = 0xFF;
CRC16Hi = 0xFF;
CL = 0x21;
CH = 0x10 ;
while(len--!=0)
{
CRC16Lo ^= *ptr ;
for (lag=0;lag<8;lag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo ;
CRC16Hi = ((CRC16Hi)>>1);
CRC16Lo = ((CRC16Lo)>>1);
if (((SaveHi) & (0x01)) == 1)
{
CRC16Lo|=0x80;
}
if (((SaveLo) & (0x1)) == 1)
{CRC16Hi^=CH;
CRC16Lo^=CL;
}
}
ptr++;
}
ReturnData[0] = CRC16Hi ;
ReturnData[1] = CRC16Lo ;
crc16 =( ReturnData[0]<<8)| ReturnData[1];
return crc16;
}
请问,我单片机里的程序完全按照这个改的,为什么得到的校验码不同,谢谢 展开
2个回答
展开全部
CRC校验结果的不同从计算原理上有以下几个方面:
1.简化式不同,比如CRC8在应用上有5种常用简化式,简化式的不同结果必然不同。
2.正向算法与逆向算法,正向算法是数据右侧为高位,CRC初始值为0,简化式正向,逆向算法是数据右侧为低位,CRC初始值为ffff,简化式需逆向。
从程序运行的硬件角度看:
1.单片机和ARM数据定义不同,比如单片机中int型是16位数据,ARM中一般为32位,在PC中有可能就是64位了,这样的数据定义在CRC运算时会产生不同的结果。
2.单片机种存储数据的空间是有说法的,比如code,idata,xdata区需要弄清除你的待校验数据存储的位置,看是否真的将数据存储对了,否则有可能是00,或ff的校验结果。
从你程序上看,硬件原因的可能性大些,一定注意数据的定义,比如在51中的short int型变量时啥??你直接8位定义成char,16位定义成int,32位定义成long就完了,弄个short多愁人啊
1.简化式不同,比如CRC8在应用上有5种常用简化式,简化式的不同结果必然不同。
2.正向算法与逆向算法,正向算法是数据右侧为高位,CRC初始值为0,简化式正向,逆向算法是数据右侧为低位,CRC初始值为ffff,简化式需逆向。
从程序运行的硬件角度看:
1.单片机和ARM数据定义不同,比如单片机中int型是16位数据,ARM中一般为32位,在PC中有可能就是64位了,这样的数据定义在CRC运算时会产生不同的结果。
2.单片机种存储数据的空间是有说法的,比如code,idata,xdata区需要弄清除你的待校验数据存储的位置,看是否真的将数据存储对了,否则有可能是00,或ff的校验结果。
从你程序上看,硬件原因的可能性大些,一定注意数据的定义,比如在51中的short int型变量时啥??你直接8位定义成char,16位定义成int,32位定义成long就完了,弄个short多愁人啊
2014-05-08
展开全部
当初发给V环保节能
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询