打印

请这个CRC校验程序写的对不?

[复制链接]
3828|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bhsdlmj|  楼主 | 2009-10-11 14:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 bhsdlmj 于 2009-10-12 14:13 编辑



chunyang说:
1.预置1个16位的寄存器(下称CRC寄存器),初试化其内容为十六进制数0xFFFF;
2.把第一个待计算的数据即通讯信息帧的首字节与CRC寄存器的低8位相异或,把结果放回CRC寄存器;
3.把CRC寄存器的内容右移一位用0填补最高位即进行逻辑移位处理并检查右移后的移出位;
4.如果移出位为0重复第3步即再次右移一位,如果移出位为1则CRC寄存器与CRC生成多项式0xA001(1010 0000 0000 0001)进行异或运算,结果放回CRC寄存器;
5.重复步骤3和4,直到右移8次,对整个8位数据全部进行同样处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,最后得到的CRC寄存器的内容即为CRC校验码,将其附着在原通讯信息帧后进行传输即可。如果用于Modbus协议设备则还需交换高低8位,非Modbus协议设备可以不必交换。接收方依同样方法进行计算,只是计算的内容不要包括最后两个字节,然后比较生成的CRC校验码和数据帧中的是否相同即可。如果发送方交换CRC校验码的高低8位,则接收方可以计算包括交换后的CRC码在内的整个数据帧,传输正确的话结果恒为0x0000。
========================================================
如何判断我写的这个对不对呢??有没有什么软件判断啊?各位看看我写的对不对?多谢
/*----------------------
    计算校验值
------------------------*/
INT16U generateValueCRC16(INT8U *address, INT16U length)
{
INT8U *ptr;
INT8U bitSeqNum;//一个字节的第几位(称做"位序号") (范围7--0)
volatile INT16U regCRC = 0xFFFF;
bit LSB;

for (ptr = address; ptr < (address + length); ptr++) {
  regCRC =  (*ptr) ^ (regCRC & 0x00FF);
  for (bitSeqNum = 0; bitSeqNum < 8; bitSeqNum++) {
   LSB = (regCRC & 0x0001);
   regCRC = (regCRC >> 1);
   if (LSB) { //如果LSB是1
    regCRC = (regCRC ^ 0xA001);
   }
  }
}
return(regCRC);
}


''''''''''''''''''''''''''''''

哈哈哈 我写的肯定对了

因为我算了 转换的话 能得出0x0000
========================
估计是错了  怎么回事啊?和软件算的不一致啊  晕倒

相关帖子

沙发
bhsdlmj|  楼主 | 2009-10-12 08:00 | 只看该作者
chunyang/xwj/hotpower/yewuyi匠人/computer00心理暗想:
感觉这个程序时对的,但是如果万一有错误可并没有发现的话,那也太丢面子了,还是沉默好了!!!;P

使用特权

评论回复
板凳
yewuyi| | 2009-10-12 09:03 | 只看该作者
呵呵,俺都是查表的。

CRC生成多项式不一样,计算的代码就不一样,只要你发送和接受计算CRC的公式是一致的,就不存在对和错的问题。

使用特权

评论回复
地板
bhsdlmj|  楼主 | 2009-10-12 10:25 | 只看该作者
楼上 查表咋写的?
能不能慷慨的给我看看?

使用特权

评论回复
5
ZRL700424| | 2009-10-12 10:36 | 只看该作者
楼上 查表咋写的?
能不能慷慨的给我看看?
bhsdlmj 发表于 2009-10-12 10:25


楼主还没搞明白啊?
因为计算比较费时,所以很多时候都是用查表来代替计算(可以根据所选的单片机和项目的具体情况决定是计算还是查表)

查表:比如8位(由于单片机资源有限,偶一般都用8位查表)
先用计算的程序把0-255的CRC全部算出来(专门写个这样的程序),然后把结果按顺序放在一个数组里(表格),使用时直接用待计算的数据去查表得到CRC值

使用特权

评论回复
6
ZRL700424| | 2009-10-12 10:38 | 只看该作者
当然,网上或者书上有大把的例子,没有必要自己去算(自己算只是为了验证网上或者书上的例子有没有错误)

使用特权

评论回复
7
chunyang| | 2009-10-12 12:37 | 只看该作者
程序就不看了,俺从来不看别人写的程序,至于结果检验,有CRC计算器下载的,去比对一下即可,用0来比对是否严格取决于你的程序工艺,最好直接比对结果。

使用特权

评论回复
8
xwj| | 2009-10-12 12:43 | 只看该作者
不喜欢被点名,
也不喜欢看别人的程序,
更不喜欢被点名看程序,
然后还被人代表了...

使用特权

评论回复
9
lover9| | 2009-10-12 12:48 | 只看该作者
哈哈,LZ牛啊~

使用特权

评论回复
10
bhsdlmj|  楼主 | 2009-10-12 13:18 | 只看该作者
程序就不看了,俺从来不看别人写的程序,至于结果检验,有CRC计算器下载的,去比对一下即可,用0来比对是否严格取决于你的程序工艺,最好直接比对结果。 ...
chunyang 发表于 2009-10-12 12:37


恩 那我就直接比较结果好了!!
但是
我还是怀疑我的程序写的有问题啊!!因为我下载了1个软件和我算的不是一样啊!!!

chunyang大叔能不能提供个软件给我???

使用特权

评论回复
11
yewuyi| | 2009-10-12 21:26 | 只看该作者
生成多项式不一样,其结果就不一样。

使用特权

评论回复
12
chunyang| | 2009-10-13 11:03 | 只看该作者
在网上搜“CRC计算器”,有很多版本,找合适的,还有个“串口精灵”也带有。

使用特权

评论回复
13
mohanwei| | 2009-10-13 12:19 | 只看该作者
可以看看这个:http://www.skycn.com/soft/49092.html
我平时编程和设计时常用的小工具集合。
功能:
1-8位校验和
2-16位校验和
3-计算CRC8
4-计算CRC16
5-计算CRC32
6-计算MD5
7-计算SHA1
8-十六进制字符串转换为Ascii字符串
9-Ascii字符串转换为十六进制字符串
10-十六进制字符串转换为浮点数
11-浮点数转换为十六进制字符串
12-统计**的字符个数,精确到每一个字符
13-把文件转换为C语言数组(这样可以把文件嵌入到我们的程序中)
14-电阻值选型(开发中)
15-电容值选型(开发中)
16-电感值选型(开发中)
17-滤波器选型(开发中)
18-执行C语言Printf函数(开发中)
19-产生一组随机数
20-把字符串转换为大写
21-把字符串转换为小写
22-字符串头尾对调
23-十六进制格式转换
……
功能陆续添加中……

使用特权

评论回复
14
bhsdlmj|  楼主 | 2009-10-14 11:41 | 只看该作者
2.把第一个待计算的数据即通讯信息帧的首字节与CRC寄存器的低8位相异或,把结果放回CRC寄存器


搞定了 应该是放入CRC寄存器的低8位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

351

帖子

0

粉丝