打印

实用资料——CRC校验码生成算法

[复制链接]
32462|69
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chunyang|  楼主 | 2007-4-13 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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。

相关帖子

沙发
ida| | 2007-4-14 08:05 | 只看该作者

啊,这个应该对我很有价值

呵呵呵呵呵呵呵

使用特权

评论回复
板凳
bcaiyo| | 2007-4-15 13:35 | 只看该作者

好东西!直接!

使用特权

评论回复
地板
Chang_HS| | 2007-4-16 13:58 | 只看该作者

经过实验验证吗?

如果发送方交换CRC校验码的高低8位,则接收方可以计算包括交换后的CRC码在内的整个数据帧,传输正确的话结果恒为0x0000。
上面这句怎么理解?
是不是如果交换高低位,则多计算2个字节结果会为0?

使用特权

评论回复
5
chunyang|  楼主 | 2007-4-16 16:41 | 只看该作者

自己试试吧

使用特权

评论回复
6
雨亭工作室| | 2007-5-7 03:54 | 只看该作者

有现成的呀

使用特权

评论回复
7
江门表哥| | 2007-5-18 20:02 | 只看该作者

实用资料——CRC校验码生成算法

虽然我现在不太懂,但我觉的让我找到一点好东西...

使用特权

评论回复
8
chunyang|  楼主 | 2007-5-19 00:12 | 只看该作者

这比源代码有用

使用特权

评论回复
9
genuineli| | 2007-5-19 13:15 | 只看该作者

不错

顶!

使用特权

评论回复
10
devusb| | 2007-6-10 11:51 | 只看该作者

gz

gz

使用特权

评论回复
11
kinglionsz| | 2007-7-10 17:26 | 只看该作者

很不错,我找找看以前的代码

很不错,我找找看以前的代码,不知道没有

使用特权

评论回复
12
wangzongcumt| | 2009-8-7 11:53 | 只看该作者
MODBUS协议的CRC校验子程序代码
为方便读者使用MODBUS协议,将VC、VB、ASM51环境下MODBUS协议的CRC校验子程序代码一并给出,供读者参考。
//***CRC Calculation for MODBUS Protocol for VC ***//
//数组snd为地址等传输字节,num为字节数,发为6收为5//
unsigned int mb_crc(BYTE *snd,int num)
{ int i,j;
unsigned int c,crc=0xFFFF
for (i=0;i<num;i )
{ c=str[i] & 0x00FF;
crc^=c;
for(j=0,j<8,j )
{ if (crc & 0x0001)
{crc>>=1;crc^=0xA001;}
else crc>>=1
}
}
return(crc);
}
' //***CRC Calculation for MODBUS Protocol for VB***//
mb_crc(ByRef snd() as BYTE,num as integer) as Long
crc_l=crc_h=&HFF
for i=1 to num
crc_l=crc_l XOR snd(i)
for j=1 to 8
if crc_l AND 1 then
crc_l=(crc_l-1)/2
if crc_h and 1 then
crc_l=crc_l 128
crc_h=(crc_h-1)/2
end if
crc_l=crc_l XOR &HA0
crc_h=crc_h XOR &H01
else: crc_l=crc_l/2
if crc_h and 1 then
crcl_l=crc_l 128
crc_h=(crc_h-1)/2
else: crc_h=crc_h/2
end if
end if
next j
next i
mb_crc=crc_l crc_h*256
End
 
;CRC Calculation for MODBUS Protocol for ASM51
;R1 为发送(接收)字节的缓存首地址
;R2 为发送(接收)字节的字节数(不含CRC字节),
;R3 为CRC校验低位字节,
;R4 为CRC校验高位字节,
CRC: MOV A,#0FFH
MOV R4,A
MOV R3,A
CRC1: MOV A,@R1
XRL A,R3
MOV R3,A
MOV R2,#08H
CRC8: CLR C
MOV A,R4
RRC A
MOV R4,A
MOV A,R3
RRC A
MOV R3,A
JNC CRC10
MOV A,R3
XRL A,#01H
MOV R3,A
MOV A,R4
XRL A,#0A0H
MOV R4,A
CRC10: DJNZ R2,CRC8
INC R1
DJNZ CRC1
RET

使用特权

评论回复
13
itxss| | 2009-8-7 12:07 | 只看该作者
很不错,试了一下,果然很灵

使用特权

评论回复
14
chunyang|  楼主 | 2009-8-7 13:58 | 只看该作者
理解原理,编程就是小菜一碟。

使用特权

评论回复
15
bcaiyo| | 2009-8-7 16:36 | 只看该作者
总没搞懂多项式是怎样生成的.那个X8-X5-X4-1为什么时0x18

使用特权

评论回复
16
chunyang|  楼主 | 2009-8-7 19:16 | 只看该作者
CRC有多种算法和标准,生成多项式决定了不同数据对应的校验值重合概率的大小,常见生成多项式是根据重合概率的大小用穷举法比较、筛选出来的,当然,用数学证明也可以,但比较复杂,非专业数学专家很难掌握,而借助计算机很容易用穷举法筛选,工程上则直接引用结果即可,这些都已形成工业标准,如CCITT标准、CRC16标准、CRC8标准、Modbus标准等等。

使用特权

评论回复
17
ocon| | 2009-8-13 18:45 | 只看该作者
记下,得空试试~

使用特权

评论回复
18
电子混混| | 2009-9-7 10:36 | 只看该作者
好东东,做个标记

使用特权

评论回复
19
bhsdlmj| | 2009-9-30 07:33 | 只看该作者
各位,我现在对春阳大叔处于盲目崇拜阶段,只要他说的,我都认为是正确的。都是精华!:loveliness:

好,让我慢慢仔细阅读以下!!

使用特权

评论回复
20
johngordon| | 2010-1-11 13:16 | 只看该作者
学习ing

使用特权

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

本版积分规则

170

主题

44289

帖子

1498

粉丝