CRC校验原理与程序设计――(RS485总线系统应用之1)

出处:电子产品世界 发布于:2018-08-20 14:42:29

  1.CRC校验原理

  1.1 CRC的基本概念:

  CRC是英文Cyclical Redundancy  Check的缩写,翻译成中文通常称作循环冗余校验或简称为CRC校验。它是数据传输领域中常用的一种差错校验方法,其特点是传输数据和CRC校验值的长度可以任意选定。在当今手机、计算机和数码产品普及的信息数字化时代,CRC校验无处不在。CRC分为多种标准,例如:CRC  -12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16多为美国采用,而CRC-  CCITT多为欧洲国家所采用。而CRC-32码大都被应用在Point-to-Point的同步传输中。更多的CRC校验标准类型参见附表:CRC校验标准类型。

  1.2 CRC校验的基本原理:

  在代数编码理论中,一个数值可以表示为一个多项式。例如:一个十进制数值2892,可以用多项式表示为2x3 + 8x2 + 9x +  2(x=10)。同理,一个二进制数值1010101对应的多项式为x6 + x4 + x2 + 1(x=2)。

  生成CRC码的基本原理是:设被校验的数据为K位,校验码为R位,码字长度为N(=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得

  V(x)=A(x)g(x)=xRm(x) + r(x);

  其中: m(x)为被校验数据的K-1次多项式

  r(x)为校验码的R-1次多项式

  g(x)称为生成多项式:g(x)=g0 + g1x1 + g2x2 + ... + g(R-1)x(R-1) + gRxR

  发送方通过指定的g(x)计算出CRC校验码,接收方则通过该g(x)来验证收到的CRC校验码。综上所述,一个完整的CRC校验过程是:

  发送方:根据要传送的K位原始数据(二进制码序列),以标准指定的多项式计算出一个R位校验码(CRC码),附在原始数据后边,构成一个新的二进制码序列共K +  R位,然后发送出去。

  接收方:将接收到的数据除以与发送方相同的多项式值,如果能够除尽,则正确,否则证明出错。还有另外一种处理,就是接收方用发送方相同的方法计算出接收到数据的CRC校验值,再与发送方发来的校验值比较,相同则正确,否则证明出错。

  2. CRC校验码的计算步骤:

  例如:有一个要发送的7位二进制数1011001;对应的m(x)=x6 + x4 + x3 + 1。设CRC校验码取4位并设g(x)=x4 + x +  1,则该多项式对应的值是10011。根据CRC规则,为保证被除数够除,首先需将要发送的数扩大2R 即24倍(左移4位),得到  10110010000,对应的xRm(x)=x10 + x8 + x7 + x4 。

  CRC校验码的生成本质其实就是采用模2除法取余数,该除法的简捷计算就是将除数和被除数按位做异或(相同为0,不同为1。0^0=0; 0^1=1;  1^0=1;  1^1=0)运算。需要注意的是,进行异或运算时除数必须和被除数有效位对齐。下面是将10110010000除以11001手工计算的演示,得到余数为1010,该值即是数据1011001的CRC校验值。

  10110010000 将1011001左移4位

  10011 多项式值与被除数有效位对齐

  =00101010000 第1次异或结果

  10011 多项式值与被除数有效位对齐

  =00001100000 第2次异或结果

  10011 多项式值与被除数有效位对齐

  =00000101100 第3次异或结果

  10011 多项式值与被除数有效位对齐

  =00000001010 第4次异或结果

  为了简便计算机程序求解CRC,在实际应用中通常把多项式值的位舍掉,并且将参加计算的数据高低位颠倒后再计算。前面的演算数据颠倒后的运算情况如下:

  00001001101

  11001

  00001010100

  11001

  00000110000

  11001

  00110100000

  11001

  01010000000

  提请注意:只有真正读懂以上手工演算的步骤和规律,才能理解下节内容。

  3. CRC校验的程序设计

  下面以常用的CRC-16-IBM校验标准为例来说明CRC校验码的生成过程。  因为CRC-16码由两个字节构成,所以首先要准备一个16位的CRC寄存器,并将每一位都置1。具体的计算步骤为:

  ① 设置CRC寄存器,并给其赋值FFFFH。

  ② 将被校验数据的个字节(8Bit)与CRC寄存器的低8位进行异或,结果存CRC寄存器。

  ③ CRC寄存器的值向右移一位,位(MSB)补零,检查移出的位(LSB)是否为1。

  ④ 如果LSB为0,重复第三步;若LSB为1,CRC寄存器与CRC16多项式值A001H相异或。

  ⑤ 重复第③与第④步,直到该字节的8次移位全部完成。

  ⑥ 如果被校验数据有多个字节,则重复第②至第⑤步直到所有数据全部处理完。

  ⑦ 终CRC寄存器的内容即为CRC值。

  3.1 用查表法求CRC函数的程序

  查表法省去了将被校验数据移位并与多项式异或计算的步骤,因此比计算法更快捷,但程序编码量偏大。

  3.1.1 用VC编写的程序

  unsigned short CRC16(puchMsg, usDataLen)

  unsigned char * puchMsg ;

  unsigned short usDataLen ;

  {

  unsigned char uchCRCHi = 0xFF ;

  unsigned char uchCRCLo = 0xFF ;

  unsigned uIndex ;

  while (usDataLen--)

  {

  uIndex = uchCRCLo ^ * puchMsg++ ;

  uchCRCLo = uchCRCHi ^ auchCRCLo [uIndex] ;

  uchCRCHi = auchCRCHi [uIndex] ;

  }

  return (uchCRCLo  8 | uchCRCHi) ;

  }

  static char auchCRCHi[] = {

  0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

  0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

  0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

  0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

  0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

  0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

  0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

  0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

  0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

  0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,


版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!