当前位置:文档之家› crc算法及其单片机实现

crc算法及其单片机实现

第27卷第5期V01.27No.5

广东教育学院学报

Journal。fGuangdongEducationInstitute

2007年10月

Oct.2007CRC算法及其单片机实现

杨庆

(湖北民族学院电气工程系,湖北恩施445000)

摘要:在数据通信中.由于诸多因素的影响,设备之间的通信数据常常会发生一些无法预测的错误.为确保高效而无差错地传输数据,降低错误所带来的影响,必须对数据进行检错.即差错控制.一般在通信时采用数据校验的办法,在诸多检错手段中,CRC是最著名的一种.利用5l系列单片机可以实现CRC.

关键词:循环冗余校验;单片机;实现

中田分类号:TP311.1;TN802文献标识码:A文毫缩号:1007—8754(2007)05—0083—04

在通信技术不断进步的今天,各种数据通信的应用越来越广泛.由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误.为确保高效而无差错地传输数据,降低错误所带来的影响,必须对数据进行检错,即差错控制.一般在通信时采用数据校验的办法,在诸多检错手段中,cRc是最著名的一种.

cRc(cyclicRedundancycheck).循环冗余校验,是对传送数据进行校验的一种高效的差错控制方法,其特点是:检错能力极强.开销小,易于用编码器及检测电路实现.从其检测能力来看,它所不能发现错误的几率可达0.0047%以下f从性能和开销上均远远优于奇偶校验及算术和检验等方式.因而,在数据存储和数据通信领域,CRC无处不在.

1CRC原理

CRC校验主要是利用线性编码理论,其基本原理如下:

在发送端,根据要传送的^位二进制码信息序列,以一定的规则产生一个校验用的r位监督码(即cRc码)。并附在信息序列后边,构成一个新的(女+r)位二进制码序列,发送出去I在接收端,根据信息码和cRc码之间所遵循的规则进行校验,以确定传送中是否出错.

校验码R是通过对数据序列D进行二进制除法取余运算得到的。它被一个称为生成多项式的(r+1)位二进制序列G一[grg,-…gt勘]来除,用多项式表示为

哿导=∞,+器?㈣其中zrD(z)表示将数据序列D左移r位(即在D的末尾再增加r个。位),Q(z)代表这一除法所得的商,R(z)就是所需的余式.这一运算关系还可以用下式来表示.

R(z)=Re[≤拳导],(2)其中,Re[]表示对括号内的式子进行取余运算.

校验码的编码计算如上所述.而校验过程则是对M序列直接进行除法取余运算,即

收稿日期}2007—03—24

作者简介,抽庆(1959一),井(土摩蕞)。湖北戚丰人.湖北民蘸学簏电气工程系剖教授,硕士

84广东教育学院学报第27卷

粉=Q(z)+黔。

(3)

或表示为胁)_Re[滁],

(4)所得到的余式R(。)若为O表示数据正确.否则认为发生错误Ⅲ.

2算法设计与程序实现

CRC的算法可以分为两种,一种是按位求cRc,另一种是按字节求CRC.

2.1按位计算CRC

对于一个二进制序列,可以用多项式表示为(以16位的cRC码为例):

D(z)一D。(z)?2”+D俨t(z)?2f1+…+Dl(T)?2+D。(z),(5)

求此二进制序列的cRc码时,先将(5)式乘以2“(即左移16位),再除以多项式G(z),所得的余数即是所要求的CRC码.即旦笔毛与坐一旦祥?z“+旦型警?z”1+…+里掣,cs)G(.r)G(z)。G(z)“1

G(工)’…可以设

簪一“z,+船,其中Q(z)为整数.R。(z)为16位二进制余数,将(7)式代人(6)式得学一瞰z)+警]-2”+电器坐俨I+_..+等=Qc小z“+[警学+号黑鲨].2一+...+等,再设

&!至!:!‘G(z)D扩l(z)?216

G(z)(7)(8)乳山)+%馨,(9)

其中(k,o)为整数,R一,(z)为16位二进制余数.将(9)式代入(8)式,如上类推,最后得到

学一[Q(枷。+“(小2“+...+Q0(z)+躲,

(10)根据CRC的定义.显然。16位二进制数R。(膏)即是要求的cRc码.

由(10)式,可以得到按位求CRC的C语言子程序,由于程序很简单,此处从略.

按位计算法就是依据cRc校验码的产生原理来设计程序.其优点是模块代码少,修改灵活,可移植性好.这种算法简单,容易实现。对任意长度生成多项式D(T)都适用.在发送的数据不长的情况下可以使用,但是如果发送的数据块很长,这种方法就不太适合了.因为它1次只能处理1位数据,效率太低,运算量大.2.2按字节计算cRc

对于一个二进制序列数按字节可以表示为

D(z)一D。(z)?2h+D卜1(z)?2“r”+…+D1(z)?28+DD(z)。(11)

式中D.(z)为一个字节(8位).

求cRc码时,先乘以2“(即左移16位),再除以多项式G(z),所得的余数即是所要求的cRC码.其推导过程与按位求CRC码完全相同,最后得到旦哗一[Q(z)28一+绯。(z).28(r-I’+…+Q0(z)+拿攀要,(12)

二进制数R。(z)即是要求的CRC码.

(12)式说明,计算本字节后的cRC码等于上一字节余式cRc码的低8位左移8位后,再加上上一字节CRC右移8位(也即取高8位)和本字节之和后所求得的CRC码.如果把8位二进制序列的CRC全部计算出

第5期杨庆:CRC算法度其单片机实现85

来,放在一个表中,然后在程序中采用查表法获取CRc值,可以大大提高计算速度,

和按位计算法相反,按字节采用查表法生成cRc校验码的优点是运算量小,速度快;但是,256个cRc余式表(共512字节的内存)对于单片机系统的代码空间而言,是不小的一笔开销,而且程序的可移植性较差‘“.

2.3按半字节计算CRC

综合上述两种算法.下面给出按半字节计算cRc算法,这种算法既可以相对节约代码空间,又可使cRc的计算速度不至于太慢.

一个二进制序列数按半字节可以表示为

D(上);D。(z)?2h+D剃(工)?2“r”+…+D1(z)?2‘+Do(z),(13)式中D。(z)位半个字节(4位).

求cRc码时,先乘以2“(即左移16位),再除以多项式G(z),所得的余数即是所要求的cRC码,其推导过程与按位求CRC码完全相同.最后得到

警=Ⅲ枷“+啡。(小2““)+...+Q0(z)+船,(14)

式中R。(工)即是要求的CRC码.

(14)式是编写按半字节计算cRc程序的基本表达式,如果把4位二进制序列数的cRc全部计算出来,放在一个表里,采用查表法,每个字节算两次,可以兼顾速度和内存空间嘲.

按半字节计算cRc的c语言子程序H—BYTE()如下.

unitH—BYTE(uchar。ptr,ucharlcng)

unitcrc;

ucharda;

/*cRc余式表*/

unitxdatacrc—tab[16]一

OxOOO,0x1021,0x2042,0x3063.0x4084,Ox50a5.Ox60c6,Ox70e7,

OxOx8108,0x9129,0xal4a,0xbl6b,0xcl8c.Oxdlad,0xelce,Oxflef

);

crc一0;

while(1eng一!=O)

da一((uchar)(crc/256))/16

crc<<一4:

crc‘=crc-tab[dal(’ptr/16)]

da一((uchar)(crc/256))/16}

crc.一crLtab[da‘(。ptr&oxof)],//暂存CRc的高4位

//CRc右移4位。即取CRC的低12位

/*cRc的高4位和本字节的前半字节相加后查表计算cRc,然后加上上一次cRc的余数*/

//暂存CRc的高4位

/*CRC的高4位和本字节的后半字节相加后查表计算CRC,然后加上上一次CRC的余数*/

ptr++I

return(crc);

程序中,*ptr表示指向发送缓冲区的首字节,1eng是要发送的总字节数,cRc余式表是按0x121多项式求出的….

86广东教育学院学报第27卷3结语

上述结果经过实验,可得出以下几点结论.

3.1在某些应用中,如果对硬件存储器空间要求很高,并且在一定程度上对时间没有特别高的要求时,可以采用按位计算法,以节约存储器空间.

3.2如果不考虑生成16位cRc生成表的时问,如直接把16位cRC生成表烧人到51系列单片机的可编程闪速存储器Flash中,采用按字节查表法的运行速度比直接计算法饔快得多.因此.在类似情况下?在进行数据传输要求生成16位cRC校验码时。应该选择按字节查表法.

3.3在需要综合考虑运算速度和兼顾存储器空间时,可以采用按半字节计算cRc的方法来实现.

3.4虽然实验结果对16位cRc校验码的3种算法进行了对比.但是所得到的结论也适用于8位、24位、32位cRc校验码.

cRc循环冗余校验码是一种方便、有效、快速的校验方法,被广泛应用在许多实际工程中.文中所列的3种算法,都可以得到cRc校验码;但是它们各有特点,在工程应用中应该根据实际需要选择最适合的方法,以得到最优的效果”].

参考文献

[1]戴佳,戴卫恒.51单片机c语言程序设计实例精讲[M].北京:电子工业出版社,2006:340.

[2]张平安.16住循环冗余校验码(cRc)的原理和性能分析[J].山西科技,2005,20(5):87.

[3]翟中,徐问之,袁威.cRc算法在计算机网络通信中的应用[J].微机发展,2002,12(2):12一14.

[4](蔓)J()Ecampbell.串行通信c程序员指南[M].2版.镣国定,廖卫东,张庆,译.北京:清华大学出版社,1995:603—613.

[5]张欣.vLsI数字信号处理一设计与实现[M].北京:科学出版社,2003:17l_

CRCCalculationMethodandAchievementwithMCU

YANGQing

(Dept.ofElectricalE“gineering,HubeiInstituteforNationalities,Enshi,Hubei,445000,P.R.China)

Abstnct:Indatacommunications,severalunexpectederrorsmayoccurduetovariousfactors.Therefore,inordertoensurethattheprocessofdatatransmissiongoeseffiencientlyandprecisely,andto1imittheimmea¥urableIossesbroughtbytheseerrors.it’snecessarytocorrectthedata,whichisalsoknownaserrorcontr01.Aswidelyaccepted,tocheckthedataisgenerallythebasicmeans.Andamonga

MCUvarietymethods耐thismeans,CRCisregardedasthemostfamousone,whichcanbeachievedwith

in51series.

Keywords:CRCIMCUIachiev8

CRC算法及其单片机实现

作者:杨庆, YANG Qing

作者单位:湖北民族学院,电气工程系,湖北,恩施,445000

刊名:

广东教育学院学报

英文刊名:JOURNAL OF GUANGDONG EDUCATION INSTITUTE

年,卷(期):2007,27(5)

引用次数:0次

参考文献(5条)

1.戴佳.戴卫恒51单片机C语言程序设计实例精讲 2006

2.张平安16位循环冗余校验码(CRC)的原理和性能分析[期刊论文]-山西科技 2005(5)

3.瞿中.徐问之.袁威CRC算法在计算机网络通信中的应用[期刊论文]-微机发展 2002(2)

4.JOE Campbell.徐国定.廖卫东.张庆串行通信C程序员指南 1995

5.张欣VLSI数字信号处理-设计与实现 2003

相似文献(10条)

1.会议论文曹爱请.曹洁循环冗余校验在单片机通信中的C语言的实现2002

本文介绍了循环冗余校验(CRC-Cycle Redundancy Code)的原理以及用二进制无借位除法计算生成多项式为CRC-16的CRC校验的方法,并给出了当发送一个字节时的CRC校验的C语言程序和流程图.循环冗余校验是提高数字传输可靠性的一种有效的方法.

2.期刊论文陈阳.聂敏.李希文单片机通信过程中循环冗余校验的实现-电讯技术2000,40(2)

本文介绍了循环冗余校验(CRC)在MCS-51单片机中的实现方法.

3.期刊论文赵希权.曾志新.李勇.Zhao Xiquan.Zeng Zhixin.Li Yong循环冗余校验在单片机无线通信中的应用-微计算机信息2005(20)

本文介绍了循环冗余码(CRC码)校验的原理和计算方法,分析两种查表冗余校验快速算法,提出新型分段查表法,良好地解决以单片机为核心的湿度测控系统无线数据传输差错控制的实时性和小存储量的要求.

4.学位论文栾昌海基于单片机的烟气二氧化硫浓度检测仪的研制2005

二氧化硫作为主要的大气污染物之一,对环境造成严重的危害.而煤、石油等燃料的燃烧过程是排放二氧化硫的最主要的人工污染源,因此对烟气二氧化硫浓度的检测,有十分重要的意义. 本课题分析了目前有关二氧化硫浓度检测的方法及国内外烟气二氧化硫浓度检测仪的情况,以二氧化硫电化学传感器为基础,研制出一种低成本、高精度的能适应较恶劣环境的烟气二氧化硫浓度检测仪.本课题详细地给出了传感器的检测原理、检测仪的总体结构、硬件设计、软件的实现及通讯接口的设计. 本检测仪在硬件上由气路部分和电路部分组成.根据传感器的特点,采用双传感器气路结构,并且在气路上采用自然降温和利用气水分离器实现快速除水.系统的硬件电路设计包括二氧化硫浓度、温度、湿度检测电路;泵、阀驱动电路:通讯接口电路以及波特率、地址设置电路.以AT89C52单片机为控制器,把二氧化硫传感器的微弱电流信号,经过I/V转换、前置放大器,转换成电压信号,再经过多量程、高精度的A/D转换器,把二氧化硫浓度信号以数据的形式存入单片机中.系统不但提供了常用的RS-232/485标准接口,同时研究了V/I转换电路,设计了4~20mA的线性输出电流接口. 在软件设计部分,探讨了C语言在嵌入式系统中的应用,并充分利用了C语言丰富的库函数和强大的数据处理能力.软件主要由控制程序、数据处理和通信程序组成.本文研究了16位的循环冗余校验码CRC-CCITT在数据通信中的应用,给出了基于模2运算的查表法,实验证明:在保证了系统通信可靠性的基础上,大大提高了计算速度. 本课题的重点是:恒电位仪及二氧化硫信号处理电路的设计,通讯接口的设计以及系统软件的实现. 本检测仪适用于烟气脱硫工程的浓度检测和其它较高浓度的二氧化硫检测,其研制的成功有较大的应用价值.

5.学位论文施长浩基于TI S6700的大功率RFID系统设计2006

射频识别(RFID)技术采用大规模集成电路技术、识别技术、计算机及通信技术,通过阅读器和安装在载体上的应答器(RFID卡)构成RFID系统,实现对载体的非接触的识别和数据信息交换。同其他一些识别技术相比,射频识别技术具有高效快捷、非接触、无污染、识别率高等突出优点。因此,对RFID技术的研究、开发和应用具有深远的理论和实际意义。 本文作者在对RFID系统的相关理论和技术深入研究的基础上,提出采用TIS6700阅读器芯片集成化设计新型阅读器的方案,实现数据采集、存储、显示和有效远距离传输,并通过在信号发射端口增加功率放大模块的方法提高阅读器的有效阅读距离。 本论文的主要研究内容包括:(一)设计基于S6700阅读器芯片的新型阅读器,通过使用对中高频阅读器外加功率放大模块的方法,实现较远距离通信。(二)采用单片机通用口三线模拟的方法模拟通用SPI口时序,克服其不可位操作的缺点,实现对S6700的驱动。(三)在RFID系统中集成设计了RS232/RS485通讯模块、液晶显示模块等,着重说明了其软硬件实现方法。(四)分析了RFID系统的通信协议IS015693并按照该协议说明指令工作过程及对数据的处理过程。(五)讨论了RFID系统的通信安全及突发的偶然因素,包括校验和防冲突设计,着重说明了循环冗余校验和防冲突算法的原理及实现方法。 所设计的新型RFID系统具有价格低廉、识别率高、界面友好等特点,在门禁、交通等领域有很好的应用前景。

6.期刊论文来卫国.徐冉循环冗余校验码的单片机及CPLD实现-单片机与嵌入式系统应用2002(7)

循环冗余码校验(CRC)是一种可靠性很高的串行数据校验方法.介绍循环冗余码校验的基本原理,并分别用单片机和CPLD作了循环冗余码校验的软件实现和硬件实现.包括汇编语言和VHDL语言源程序.

7.会议论文王少云FBBM型编码器的CRC算法研究2006

介绍了FBBM型遥控编码器的组成和工作原理,对循环冗余校验CRC的差错控制算法进行了理论分析,提出了适用于单片机系统的快速直接计算法对三字节序列进行简单快捷的CRC计算,给出了实现CRC-16算法的软件流程图,并用PL/M-51语言编写了软件程序,在FBBM型编码器研制过程中进行了使用验证。8.期刊论文黄育和.程韬波.HUANG Yu-he.CHENG Tao-bo基于Modbus RTU协议的数字智能模块的设计-机电工程技术2007,36(5)

首先简要介绍了Modbus协议,并阐述了基于高性能单片机P89V51RD2的数字智能模块硬件结构和软件设计.最后,详细地描述了Modbus RTU协议从站的单片机程序实现.数字智能模块成功地应用于工业测控系统,其功能得到工程验证,说明设计合理.

9.期刊论文赵鸿图DNP3.0中CRC算法研究-科技创新导报2008(33)

DNP 3.0规约是在欧洲及北美洲比较流行的一种规约,其数据帧都帚有CRC校验功能.为了把CRC应用在实际中就需要有正确的算法及相应的程序.本文提出了CRC信息单元编码算法,即以包含若干位的信息块为单位计算CRC的方法,并进行了详细的数学推导,给出了CRC的编码算法流程图.分析了CRC的解码算法并给出了CRC的解码算法流程图.对于从低字节的低位开始计算CRC的情况,提出了计算CRC的信息位反转法.在讨论了DNP3.0中CRC程序漉程图的基础上,给出了在keil μ Vision8.08a环境下调试通过的单片机KeilC51程序.

10.期刊论文刘浩应用于起搏器程控遥测的CRC软件算法实现-计算机工程与设计2004,25(9)

为了保证起搏器程控与遥测数据的正确性,采用软件完成CRC校验.介绍了3种适合于微处理器应用的算法,并在PIC单片机上实现计算多字节信息码的CRC校验码的功能,比较了3种算法在运行时间、耗费系统资源等方面的不同之处.

本文链接:https://www.doczj.com/doc/f33488924.html,/Periodical_gdjyxyxb200705021.aspx

下载时间:2010年1月4日

相关主题
文本预览
相关文档 最新文档