crc的校验原理及其软件实现_第1页
crc的校验原理及其软件实现_第2页
crc的校验原理及其软件实现_第3页
crc的校验原理及其软件实现_第4页
crc的校验原理及其软件实现_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CRC 的校验原理及其软件实现 随着数据采集系统的功能日益强大,以及微型计算机的普及,在现代工业中,利用微机 进行数据通讯的工业控制应用得也越来越广泛。特别是在大规模高精度数据采集系统中, 对数据进行分析和计算将占用很大一部分单片机的资源,可以将采集到的数据通过串行 通讯方式传送给 PC 机,由 PC 机来完成数据的处理工作。但是由于传输距离、现场状 况等诸多可能出现的因素的影响,计算机与受控设备之间的通讯数据常会发生无法预测 的错误。为了防止错误所带来的影响,在数据的接收端必须进行差错校验。虽然差错校 验也可以完全由硬件来承担,但由于单片机和 PC 都具有很强的软件编程能力,这就为 实施软件的差错校验提供了前提条件,而软件的差错校验有经济实用并且不增加硬件开 销的优点。 1 CRC 法的原理 传统的差错检验法有:奇偶校验法,校验和法,行列冗余校验法等。这些方法都是 在数据后面加一定数量的冗余位同时发送出去,例如在单片机的通讯方式 2 和 3 中, TB8 就可以作为奇偶校验位同数据一起发送出去,在数据的接收端通过对数据信息进行 比较、判别或简单的求和运算,然后将所得和接收到的冗余位进行比较,若相等就认为 数据接收正确,否则就认为数据传送过程中出现错误。但是冗余位只能反映数据行或列 的奇偶情况,所以这 类检验方法对数据行或列的偶数个错误不敏感,漏判的概率很高。 因此,此种方法的可靠性 就差。 循环冗余码校验英文名称为 Cyclical Redundancy Check,简称 CRC。它是利用除 法及余数 的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出 CRC 值并随数据一同发送给接收装置,接收装置对收到的数据重新计算 CRC 并与收到 的 CRC 相比较,若两个 CR C 值不同,则说明数据通讯出现错误。由于这种方法取得 校验码的方式具有很强的信息覆盖能力,所以它是一种效率极高的错误校验法。错误的 概率几乎为零。在很多的仪器设备中都 采用这种冗余校验的通讯规约。 根据应用环境与习惯的不同,CRC 又可分为以下几种标准: CRC12 码; CRC16 码; CRCCCITT 码; CRC32 码。 CRC-12 码通常用来传送 6-bit 字符串。CRC-16 及 CRC-CCITT 码则是用来传 送 8-b it 字符,其中 CRC-16 为美国采用,而 CRC-CCITT 为欧洲国家所采用。CRC- 32 码大都被采用在一种称为 Point-to-Point 的同步传输中。 2 CRC 校验码的生成过程 我们以最常用的 CRC16 码作为例子进行说明。 冗余循环码包括 2 个字节,即 16 位二进制数。先预置 16 位寄存器全部为 1,再逐 步把每 8 位的数据信息进行处理。在进行 CRC 计算时只用 8 位数据位,起始位和停止 位,如有奇偶校验位的话也包括奇偶校验位,都不参与 CRC 计算。 在计算 CRC 码时,8 位数据与寄存器的数据相异或,得到的数据向低位移一位, 用 0 填补最高位,再检查最低位。如果最低位为 1,把寄存器的内容与预置数相异或; 若最低位为 0,则不进行异或计算。 这个过程一直重复 8 次,第 8 次移位后,下一个 8 位数据再与现在寄存器中的内 容 相异或,这个过程和以上一样重复 8 次。当所有的信息处理完后,最后寄存器中的 内容即为 CRC 码。这个 CRC 码将由发送设备跟在数据的最后一起发送。 计算 CRC 的步骤为: (1)预置 16 位寄存器位十六进制数 FFFF(即全为 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 校验值程函数 修改日期:2006.7.4 待修改: OK 参数: *str 指向 txbuf,待发送数组; num 为报文字节数 最后计算结果为 2 字节数。 MODBUS 传输时,CRC 低位在前,crc%256 求低位; 高位在后,crc/256 求高位。*/ uint crc16(uchar *str,uint num) /CRC 计算子程序, uchar i; /uint crc; crc=0xffff; for (i=0; i arc= (stri crc) crc=_irol_(crc,8); / 整形循环右移指令 crc= crc crc= crc crctablearc; return(crc); /* 函数功能:CRC 校验程函数 修改日期:2006.7.4 待修改: OK 参数: N 为报文字节数,rxbuf 为接收报文区 如果最后计算结果 CRC=0,说明报文在传输过程中正确 */ void crc_verify(uchar N) /CRC 校验程序 uchar i; crc = 0xFFFF; /modbus_crc 初值 for (i=0; i=7;i+ ) /CRC 校验方式 可以做一个子程序来处理 arc= (rxbufi crc) /xor crc=_irol_(crc,8); /整形循环右移指令 crc= crc crc= crc crctablearc; /xor _nop_ (); uint code crctable= /CRC 计算用表 0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241, 0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440, 0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40, 0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841, 0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40, 0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41, 0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641, 0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040, 0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240, 0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441, 0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41, 0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840, 0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41, 0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40, 0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640, 0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041, 0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240, 0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441, 0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41, 0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840, 0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41, 0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40, 0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640, 0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041, 0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241, 0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440, 0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40, 0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841, 0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40, 0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41, 0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641, 0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040 ; 运动追踪传感器或将成为老年痴呆症的克星 导读: 一个来自德国跨学科科研团队的研究人员发现,通过简单的运动传感器可以 对老年人身体运动及机能的改变进行追踪,从而发现与阿尔茨海默病相关的病理行病变, 从而对今早发现和诊断老年痴呆症起到积极有效的作用。 o 关键字 o 运动追踪传感器 OFweek 电子工程网讯:10 月 9 日消息,阿尔茨海默病,也就是我们俗称的 老年痴呆症。这是一种神经系统退行性疾病。临床上以记忆障碍、失语、失用、失认、 视空间技能损害、执行功能障碍以及人格和行为改变等全面性痴呆表现为特征,病因迄 今未明。 阿尔茨海默病目前已经成为了挑战全球医疗保健领域的一大难题,目前仍然没有治 愈的有效办法。由于阿尔茨海默病病情发展缓慢,因此能够早发现早预防就成为了最有 效的途径。现在,一个来自德国跨学科科研团队的研究人员发现,通过简单的运动传感 器可以对老年人身体运动及机能的改变进行追踪,从而发现与阿尔茨海默病相关的病理 行病变,从而对今早发现和诊断老年痴呆症起到积极有效的作用。 研究人员通过在实验者脚踝处放置三轴加速计,就像大部分健身追踪装置一样,对 阿尔茨海默病潜在人群的日常行为进行追踪。通过对大量随机的运动数据进行分析之后 识别阿尔茨海默病与普通人区别的准确率达到了 91%。看来对于阿尔茨海默病患者来 说在日常行为和特征中还是具有一定的规律可以总结,让护理人员及家人更加有效的照 料。 Ros

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论