打印

CRC16 问题求助

[复制链接]
5246|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shouzhou|  楼主 | 2010-3-14 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己编写了一个程序,想生成多项式是8005和A001的表格,8005的好像搞定了,但是A001的怎么都没有弄出来,我的算法是参考网上的一点资料,过程如下:
1.预置116位的寄存器(下称CRC寄存器),初试化其内容为十六进制数0xFFFF
2.把第一个待计算的数据即通讯信息帧的首字节与CRC寄存器的低8位相异或,把结果放回CRC寄存器;
3.把CRC寄存器的内容右移一位用0填补最高位即进行逻辑移位处理并检查右移后的移出位;
4.如果移出位为0重复第3步即再次右移一位,如果移出位为1CRC寄存器与CRC生成多项式0xA0011010 0000 0000 0001)进行异或运算,结果放回CRC寄存器;
5.重复步骤34,直到右移8次,对整个8位数据全部进行同样处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
我的程序如下:
void crc_init (void)
{
unsigned short mask, bit, crc, temp;
crc=0xffff;
for( mask = 0; mask < 0x100; mask++ )
{
  crc = mask^crc;
  for( bit = 0; bit < 8; bit++ )
  {
  temp = crc & 0x0001 ;
  crc >>= 1;
  if ( temp != 0 ) crc ^= POLY_CRC16 ;
  }
  TABLE[mask] = crc;

}
}

但是出来的,好像和结果是不同的,有没有高人帮我看下啊,还有,有没有标准的CRC16两种多项式表格下载,多谢多谢!

相关帖子

沙发
zgl7903| | 2010-3-14 19:10 | 只看该作者
CRC16 有几个标准 因此它的多项式和初始化值都有所不同,可以在网上搜到CRC计算器的
http://zorc.breitbandkatze.de/crc.html
http://zorc.breitbandkatze.de/crctester.c

使用特权

评论回复
板凳
shouzhou|  楼主 | 2010-3-14 20:13 | 只看该作者
多谢,被这个搞得有点头大啊

使用特权

评论回复
地板
冷漠| | 2010-3-14 21:54 | 只看该作者
书上有计算公式,特简单,最后研究缩减到只有1条C语句了。
当然,可以查表。表就是计算式自动生成的。

看这本书《串行通信编程指南》北京科海培训中心出版【美】Joe  Campbell原著,游疆来等译。P479  关于生成多项式 A001的计算公式以及查询表。
0000 C0C1  C181  0140  C301 ......

使用特权

评论回复
5
李冬发| | 2010-3-15 00:35 | 只看该作者
0x8005和0xa001是一样的,一个是左移,一个是右移。呵呵,结果同样是一个正的,一个反的!

使用特权

评论回复
6
冷漠| | 2010-3-15 10:10 | 只看该作者
5楼说的好。如果8005 已经搞定,那么A001就不用重新算了,:例如:
                   8247A3F7......商
18005/C366F9550000......被除数
                           AC2B......余数

那么当多项式为A001时 ,观测点站到这个算式的背后去看就行了:这时8005成了习惯上A001,C366F955看作C3669FAA,计算后余数肯定是D435(AC2B的倒序。)

使用特权

评论回复
7
hotpower| | 2011-6-22 23:24 | 只看该作者
8
Zpc| | 2017-6-15 23:18 | 只看该作者

使用特权

评论回复
9
hotpower| | 2017-7-6 09:26 | 只看该作者
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

82

帖子

0

粉丝