串口通讯中的CRC循环校验方法与原理,虽然已有两个帖子,但仍然困惑(200分)

  • 主题发起人 主题发起人 zhbzhb
  • 开始时间 开始时间
Z

zhbzhb

Unregistered / Unconfirmed
GUEST, unregistred user!
请各位大虾贴上CRC循环校验的实例,我的计算机要和单片机通讯,g622、Another-eYes、soit等同志要特别注意。
 
好象在那里见过关于CRC循环校验的文章,待我找找看!
 
www.vclxx.com的非可视单元
or
www.csdn.net中的c/c++单元中也有
16,32位的都有原码,并有说明
 
源码我也有,g622先生能不能给发个帖子具体讲讲其中原理
 
找一本《数据结构》看看吧,书上的东西是最详细的。
 
crc ,多项式编码,是基于把位串看成系数为0.1的多项式
一个K位的帧可以看成X的K-1次到X的0次的K次多项式的
系数序列.双方先约定一个生成多项式G(X),当然G(X)的
最高位,最低位必须是1,计算M位的帧的生成多项式G(X)应该比
M(X)短,基本思想是:将校验和加在帧的末尾,使整个多项式
能被G(X)除尽,当接受端接受了加校验的帧后,如果用G(X)除不尽
则说明出错.这里的除法以2为模.可以证明:一个r位的检测位可以
查出<=r位的所有突发错误.
这种算法易用硬件实现
有三个多项式是国际标准:
x12+x11+x3+x2+x1+1
x16+x15+x2+1
X16+X12+X5+1
 
可以了吗?
 
老兄,是不是做课程设计.:)
CRC校验的原理并不复杂:
CRC码利用N位码,N=K+R,K位数据位,R位校验码
(1)传输前先编码:
将数据位左移R位,相当于乘上2的次方,设C(X)为数据,G(X)为多项式
C(X)*POW(2,R)/G(X)=Q(X)+R(X)/G(X)
Q(X)为商,R(X)/G(X)为余数,
(2) 由于CRC的四则运算采用模2运算,不考虑借位移位.所以有
C(X)*POW(2,R)=Q(X)*G(X)+R(X)
C(X)*POW(2,R)+R(X)=Q(X)*G(X)
注意:R(X)换边,符号不变.
(3)C(X)*POW(2,R)+R(X)即为N位CRC码,R(X)即为校验码,C(X)*POW(2,R)即为
左移R位的数据.
诚然(C(X)*POW(2,R)+R(X))/G(X)=Q(X),余数为0.
校验时将CRC码除以G(X),余数为0则传输数据正确,否则错误,要求重新传输.
(4)常用的CRC编码的G(X)多项式:
一个G(X)多项式对应特定的N,K
N K 多项式 G(X)编码
7 4 X3+X+1 1011
7 4 X3+X2+1 1101
7 3 X4+X3+X+1 11011
7 3 X4+X2+X+1 10111
15 11 X4+X+1 10011
31 26 X5+X2+1 100101
63 57 X6+X+1 1000011
1041 1024 X16+X15+X2+1 1100 0000 0000 0101
(5)模2运算:
就是普通的二进制运算不考虑借位,进位.
+法:0+0=0 , 0+1=1, 1+0=1 , 1+1=0
-法:0-0=0 , 0-1=1, 1-0=0 , 1-1=0
*法:利用模2加法求部分积之和,无进位.
/法:利用模2减法求部分积之和,无借位.
(6)如还有疑问请查阅
1.软件水平考试专用书<<程序设计>>程序员级,高级程序员级 王春森
2.<<计算机组成与结构>> 王爱英
都是清华大学出版社的.
 
多人接受答案了。
 

Similar threads

后退
顶部