您的位置 首页 五金品牌

crc校验原理

crc校验原理 ?随着数据采集系统的功能日益强大,以及微型‰计算机的普及,在现㎎代工业中,利用微?机进行数据通…

crc校验原理

?随着数据采集系统的功能日益强大,以及微型‰计算机的普及,在现㎎代工业中,利用微?机进行数据通讯的工业控?制应用得也越来越广泛。特别是在大规模?高精度数据采集系统中,对数据进行分析?和?计算将占用很大一部分单片机的o资源,可以?将?采集到的数据通过?串行通讯方式传送给PC机,由PC?机来完成数据的处理工作。但是由于传输距离、现场状?况等诸多可能出现的因素m的影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。为了+防止错误∞所带来的影响,在数据的接收?端必须进行差错校验。虽然差错校验也可以完全由硬㏒件来承担,但≥由于单片机和PC都具有很强的?软件编程能力,这就为实施软件的差错校验提供了前提条件,而软件的差错校验有经济实用并且不增加硬件开销的优点。

本文引用地址:ht?tp://www.eepw¤.com.∩cn1/article/14£8662.htm

1 CRC法的原理×

传统的差错检验法有:奇偶校验法,≧?校验?和法,行=列冗余校验法等。这些方法都是在数据后面加一定数量的冗余位?同时?发送出去,例如在单㎏片机的通讯方式2和3中,TB≒8就可以作为奇≦偶?校验位同数据一起发送出去μ,在数据的接收端通过对数据信息进行比较、判别或简单<的求和?运算,然?后将所得和接收到的冗余位进行比较,若相等就认为数据接收正确?,否则就认为数据?传送过程中出现错*误。但是冗余位只能反映数据行或列的奇偶情况,所以这? 类检验方法对数据行或列的偶数个错误不敏感??,漏判的概?率很高。因此,此种方法的可靠性 就差。

循环冗余码校验英※文名称为Cyclical Redundancy Chec≈k,简称CRC。∈它是利用除法及余数 的原理来作错误侦测(Error Det∶ecting)的。实际应用时,发送装置计算出CRC值并随数据一℡同发送给接收装置,㈱接收装置对收到的数据重新计?算CRC并与收到的CRC相比较,若两个CR C值不同,则说%明数据通讯出现错误?。由于这种方法取得校验码的方式具有?很强的信息覆盖能力,所*以它是一种效率极高的错误校验法。错误的?概率几乎为零??。在很多的?仪器设㎡备中都 采用这种冗余校验的通讯规约。

根据?应用环境与习惯的不同,CRC又可分为以下几种?标准:

① CRC-12码;② CRC-16码∠;

③ CRC-CCI﹣TT码;④ CRC-32码。

CRC⌒-12码?通常用来传∑送6-b@it字符串。C♂RC-∏16及C?RC-CCITT码则是用来传送?8-?b it字符?,其中CRC〒-16为美国采用,而CRC-CCITT为欧洲国家?所采用。CRC∝-32码大都被采用在§一′种称为Point-to-P?oi㎞nt的同步传输中。

2 CRC校验码的生成过程

我们以最常用的CRC-16码作为例?子进行说明。

冗余循环码包√括?2个字节,即16位二进制数。¥先预置?16位⊥寄存器全部?为?1,?再逐 步把每8位的数据信息进行处理。在进行CRC计算时只用8位数据位,起始位和停止位,如有奇偶校验位的话也?包括奇偶校验位,都不参与CRC?计算。

在计算CRC码时,8位数据与寄存器的数据相异或,-得到的数据向低位移一位,用 0填补最高位,再检?查最低位。如果最?低位为1,把寄存器的内容与预置数相异mol或;若最低位∥为0,则不进行异?或计算。

这个过程一直重复8次,第8次移位后,下一个8位数据再与现在寄存器中?的内容 ?相?异或,这?个过程和以上一样重复8次。当所有的?信息处理完后,最后寄存器中的内容即为CRC码。这个CRC码将由发送设备跟在数据的最后一起发送。

计算CRC的步骤为:

(1)预置16位寄存器位十六进制数FFF?F(即全为1)。°称此寄存器位CRC寄存器。

(◎2)把第一个8位﹣数据与16位寄存器的低位?相异或⊙,将结果放于CRC寄存器中;

(3)把寄存器的内容右移一位(朝低位),用0填补最高位,检查最?低位;

(4)如果最低位为0,?重复第三步(再次移位);

如果最低位为/1,CRC寄存器与多项式?码进行异或;

(5)重复步骤3和4∮,直到右移8次,这样整个8位数据全部进行了处理;≯

?

(6)重复步骤2到5,进行下一个8位数据的处理;

(7)最后得到的CRC寄存器即为CRC码。

3 ?CRC软件实现

/******≌**********%*********************************

函数功能:求CRC16校验值2程函数

修改日期:2006.7.4

待修改: OK

参数: *STr㏕指向txbuf,待发送数?组;

num为报文字?节数

最后计算结果为2字节数。m

?

MODB?US传输时,C?RC低位在前,crc%256求低位;

高位在后,crc/256求高位。c*********÷*****************㎝****?***********??********/

uint crc1?6(uch∨ar ×*str,uint?∷ num) //CRC计算子程序,

?{

uc?har i;

//?uint? crc¢;

crc=0xf?fff?;

fo ?r (i=0; mli {

arc∴= (str[i] ^ crc) 0x00ff;

crc=_irol_(crc,8)>;        ∵ ⊿  //整形循?环?右移指令

crc= crc 0x00ff;

crc= crc ^ crctable[arc];

}

return(crc);

}

?

/**﹢****************************************************?***********?*********

3

函?数功能:﹤CRC校验程函±数

修改日期:2006.7.4

待修改: OK

参数: N为报㏑文字节∫数?,rxbuf[]为接收报文区

如果最后计算结果CRC==0,说明报文在传输℅过程中正确

*****************?***************************≡***************﹢****㎜?***********/

void crc_verify(uchar N) /?/CRC校验程序

{

uchar i;

cr″c = 0xFFFF∪; /≮/modbus_crc 初值

?

for (i=0; i=7;i++ ) /?/CRC校验方式 可以做一个子程序来处理

{

arc=? (rxbuf[i] ^ crc) 0x00F‖F; //xor?

crc=_irol_(c㏄rc,8); //整形循环右移指令

crc= crc 0x00FF;

crc= crc ^ crctable[arc]; //xor

_nop_();

}

}

uint code crctable[]={ //CR№C计算用表

0·x0000,0xC0C1,0xC181,0x01?40?,0xC301,0x03C0,0x0280,0xC241,

0xC601,0x06C0,0x0780,03xC741,0x0500,0xC5=C1,∷0xC48$1,0×0440,

0xC?C01,0x0C﹥C0,0x0D¬80,0xCD41,0x0F00,0xC?FC1,?0xCE81?,0x0E40,

0x0A00,0≤xC∟AC1,0xCB81,0x0B40,0xC9≠01,?0?x09C0,0x¥0880,0xC841,?

0xD801,?0x18C0,0x1980,∽0xD941,0x?1B00,⊕crc校验原理0xDBC1,0xDA81,0x1A40,

0x1E00,0xDEC1,0xD℃F8♀1,0x1F40£,0xDD01,0x1DC0,℉0∣x1C80,0xDC41,
关于更多crc校验原理内容,可以收藏本网页。2014选秀 解读CRC的校验原理

crc校验原理crc校验原理
本文来自网络,不代表天津五金网立场,转载请注明出处:http://www.mgnqyz.com/mgnqyz/1609.html

作者: mgnqyz

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部