精华内容
下载资源
问答
  • ProgramProgramDevelopmentDevelopmentofofC CalculatalculatingingCRC-16CRC-16CyclicCyclicRedundancyRedundancyCheckCheckCodeCode【内容摘要】CRC-16 是检测数据在发送过程中发生错误的常用校验方法,本文通过从...

    ProgramProgramDevelopmentDevelopmentofofC CalculatalculatingingCRC-16CRC-16CyclicCyclicRedundancyRedundancyCheckCheckCodeCode

    内容摘要】CRC-16 是检测数据在发送过程中发生错误的常用校验方法,本文通过从工程应用的角度,讲述如何实现 CRC-16 的程序开发,并给出了 Visual Basic Visual C++程序代码,给从事工业控制的人员在写通信程序的时候提供一些有价值的参考。

    一、前言CRC 的计算方式是将欲传输的数据块视为一堆连续位所构成的整个数值,将此数值除以一个特定的除数,通常以二进制表示,此除数称为生成多项式(ANSI CRC-16 的生成多项式为:x16 + x15 + x2 + 1)。目前较常用的 CRC 位数目有 8 16 以及 32,在这里只讲述如何写 CRC 位数目为 16 的程序。CRC 位数目越大,数据的错误检测率则越高,但必须多花一些时间进行数据的计算。

    二、CRC-16CRC-16计算步骤CRC-16 的计算方法有两种:查表法与计算法,在这里只讲述计算法。本人在 2000 年在江西亚东水泥公司上班时,在某电力仪表上的说明书中摘录下来的计算 CRC-16 步骤如下:1、 Load a 16-bit register with FFFF hex. Call this the CRC register.2、 Exclusive OR the first 8-bit byte of the message with the low-order byte of the 16-bit CRC, puttingthe result in the CRC register. 3、 Shift the CRC register one bit to the right (toward the LSB), zero-filling the MSB. Extract andExamine. 4、 If the LSB was 1: Exclusive OR the CRC register with polynomial value A001 hex. If the LSB was0: Repeat step 3 (another shift). 5、 Repeat step 3 and 4 until 8 shifts have been performed. When this is done, a complete 8-bit bytewill have been processed.6、 Repeat step 2 through 5 for the next 8-bit byte of them message.7、 The final content of the CRC register is the CRC value. 中文解释如下:

    1、定义一个初始值为 FFFF 16 位的变量,该变量称为 CRC 寄存器。(想想在程序中,应该怎么表示 16 位的变量呢?)

    2、把欲发送或接收消息的高 8 位和 CRC 寄存器的底 8 位作异或运算,并把结果在赋到 CRC 存器。

    3CRC 寄存器右移 1 位(朝最低位),同时最高位添零。取出并检查最低位是否为1。( Visual Basi c里如何做移位的运算呢?)

    4、如果为 1,则 CRC 寄存器与多项式 A001 异或;如果为 0,则重复第 3 步的动作。(Visual Basic里如何判断一个字节里某个位的值呢?)

    5、重复 3 4 直到完成了 8 次移位。这样完整的 8 位字节将完成处理了。

    6、对于下一个 8 位字节的处理就是重复第 2 步到第 5 步了

    7、把所有的欲发送或接收消息这样处理后, CRC 寄存器里的值就是我们最终需要得到的 CRC校验码。如果你能正确回答我的问题,那么恭喜你,你自己可以用 Visual Basic 写数据采集卡的控制程序了。End Sub

    5b07535e4aa0b5ea10b2f6dc1193018b.png

    0dbfae481e2b1d2f3457a9f5cb39c183.png

    展开全文
  • 如何计算CRC校验码循环冗余检验码)

    万次阅读 多人点赞 2017-06-16 13:25:35
    在数据通信领域,CRC(循环冗余检验码)常用的一种查错校验码,它的信息字段和校验字段的长度可以任意选定。它主要是通过对要传输的数据进行多项式计算,然后将得到的结果附在数据帧的后面在进行传输,在收方收到...

    1、什么是CRC校验     

            在数据通信领域,CRC(循环冗余检验码)常用的一种查错校验码,它的信息字段和校验字段的长度可以任意选定。它主要是通过对要传输的数据进行多项式计算,然后将得到的结果附在数据帧的后面在进行传输,在收方收到数据帧后就可以利用CRC码对数据进行检查,那样就可以实现对数据的检错功能。他的实现原理如下:

            (N,K)码就是在K位的信息码后面加上R位的监督码元,整个码长度位N位,(N,K)码一个重要的特点就是整个编码的长度为N位,其中信息字段就是K位,所以校验字段(也叫作监督码元)的长度就是R=N-K位。

            对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。

    2、如何求解CRC码


            任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
    下面是一个根据一个给定的生成多项式求CRC码的例子

    假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。
    解:
    1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。
    2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000
    3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或得到的余位011,所以最终编码为:1010 011



    通过上面的例子我们大概的就了解了如何去计算一个信息字段的CRC校验码,可以把求CRC校验码的步骤总结如下:

    1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。
    2、将信息码左移R位,相当于对应的信息多项式C(X)*2R
    3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。
    4、将余数拼到信息码左移后空出的位置,得到完整的CRC码

    3、深入理解CRC校验相关概念


    生成多项式

    是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
    在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
    应满足以下条件:
    A、生成多项式的最高位和最低位必须为1。
    B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
    C、不同位发生错误时,应该使余数不同。
    D、对余数继续做除,应使余数循环。


    原则

    若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得
    V(x)=A(x)g(x)=xRm(x)+r(x);
    其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和),
    g(x)称为生成多项式:
    g(x)=g0+g1x1+ g2x2+...+g(R-1)x(R-1)+gRxR
    发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字


    展开全文
  • 各位大侠好, 现在在做数据上传时,因CRC校验码错误...请问,上面的数据包如何计算才能得到后面的校验码“6840”,“5440”? 我按照算法编程,对上面的包进行了计算,就是得不出“6840”,“5440”。请各位支招。
  • CRC校验码

    2018-03-22 11:11:34
    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式...

    什么是CRC校验码?
    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

    如何校验?
    它利用除法及余数的原理来进行错误检测,将整个数据块当成一个连续的二进制数据M(x),在发送时将多项式M(x)用另一个多项式(被称为生成多项式G(x))来除,然后利用余数进行校验。
    基本思想
    数据多项式M(X): M(X)可被看成系数为0或1的多项式,例如:
    这里写图片描述
    生成多项式G(X): G(X)必须比M(X)短,且高位和低位为1,例如:
    这里写图片描述
    假设要发送的信息用多项式M(X)表示,将M(x)左移r位(相当于M(x)*2r),这样M(x)的右边就会空出r位,这就是校验码的位置,用 M(x)*2r 除以生成多项式G(x)得到的余数就是校验码

    计算步骤
    将最高次幂为r的生成多项式G(x)转换成对应的r+1位的二进制数;
    将信息码左移r位,相当于对应的信息多项式m(x)*2r;
    用生成多项式(二进制数)对信息码做除运算,得到r-1位的余数;
    将余数拼到信息码左移后空出的位置,得到完整的信道编码;

    假设使用的生成多项式是G(X)=X3+X+1,4位的原始报文为1010,求编码后的报文
    将生成多项式G(X)转换成对应的二进制除数:1011;
    由于生成多项式有4位,所以计算所得的校验码为3位,即r=3;
    原始报文M(X)=1010,左移3位变成1010 000;
    用1011对1010 000进行模2除运算,相当于按位异或,得到余数011
    将余数附加到1010的后边,得到最后的编码:1010 011;
    在接收方,如果收到的是 1010 011,用其除以生成多项式 1011,能够整除,说明传输没有问题;若不能整除,则说明信道传输出错;

    展开全文
  • 如何进行CRC校验

    千次阅读 2017-06-02 22:21:08
    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式...

    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

    CRC的校验原理

    一、基本原理

    CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。

    二、几个基本概念

    1、帧检验序列FCS(Frame Check Sequence):为了进行差错检验而添加的冗余码。

    2、多项式模2运行:实际上是按位异或(Exclusive OR)运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。如:10011011 + 11001010 = 01010001。

    3、生成多项式(generator polynomial):当进行CRC检验时,发送方与接收方需要事先约定一个除数,即生成多项式,一般记作G(x)。生成多项式的最高位与最低位必须是1。常用的CRC码的生成多项式有:

    CRC8=X8+X5+X4+1 (X8表示第8位为1)

    CRC-CCITT=X16+X12+X5+1

    CRC16=X16+X15+X5+1

    CRC12=X12+X11+X3+X2+1

    CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

    每一个生成多项式都可以与一个代码相对应,如CRC8对应代码:100110001。

    三、CRC检验码的计算

    设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:

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

    其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式。

    这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。

    r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。

    计算示例

    设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。

    四、错误检测

    当接收方收到数据后,用收到的数据对P(事先约定的)进行模2除法,若余数为0,则认为数据传输无差错;若余数不为0,则认为数据传输出现了错误,由于不知道错误发生在什么地方,因而不能进行自动纠正,一般的做法是丢弃接收的数据。

    五、几点说明:

    1、CRC是一种常用的检错码,并不能用于自动纠错。

    2、只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。

    3、仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(只是非常近似的认为是无差错的),并不能保证可靠传输。

    展开全文
  • VB下如何编写CRC校验程序 随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。由于传输距离、现场状况等诸多...一、循环冗余码校验原理 循环冗余码校验英文名称为Cyclical
  • CRC校验

    2017-06-26 02:14:49
     CRC是一种循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。具有数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行...
  • VB下如何编写CRC校验程序 随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。由于传输距离、现场状况等诸多可能... 一、 循环冗余码校验原理 循环冗余码校验英文名称为Cycl
  • 为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验循环冗余码校验就是其中最常用的校验算法。串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。我们把如何发现传输中的...
  • CRC(CRC16)校验在工程中的应用

    千次阅读 2018-12-31 20:56:03
    CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,...
  • 串口通讯之 CRC校验

    千次阅读 2018-11-02 16:53:48
     循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题...
  • 串口通信中的CRC校验

    千次阅读 2014-04-15 16:49:07
     循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题...
  • crc32全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”。 它的计算是非常非常非常严格的。严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同 至于crc32...
  • 串口通信中CRC16校验类的实现

    千次阅读 2009-11-09 11:44:00
    一、CRC16简介 循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是...
  • crc32 — 计算一个字符串的 crc32 多项式生成 string 参数的 32 位循环冗余校验码多项式……:这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式算法,来计算一个字符串,返回一...
  • [CortexM0--stm32f0308]CRC简述

    千次阅读 2015-07-26 11:41:02
    问题描述CRC,即循环冗余码校验,是一种对传输/存储数据的完整性进行检查的校验算法。因为在许多地方可能都会用到,所以stm32f0308就将这个算法用一个CRC硬件计算单元实现在了IC中,当有应用要用到CRC时,那么就可以...
  • 1.在循环冗余差错(CRC)检测中,若待发送的数据为110110,生成多项式为P(x)=x^3+1 ,请计算冗余码? 答:被除数为:110110000,除数为:1001.模2除法得到余数为:000,则应该添加在发送数据后面的CRC校验码即为000...
  • visual C++_Turbo C串口通信编程实践

    热门讨论 2010-07-30 09:14:24
    7.3.4 CRC循环冗余码校验 7.4 串口通信数据包处理方法编程实例第8章 单片机串口通信 第8章 单片机串口通信 8.1 单片机串口硬件系统及C51程序开发 8.1.1较典型的单片机硬件系统实例 8.1.2 C51语言及程序...
  • 第14章 循环冗余校验 276 14.1 简介 276 14.2 理论 277 14.3 实现 279 14.3.1 硬件实现 281 14.3.2 软件实现 283 14.4 习题 285 第15章 纠错 286 15.1 简介 286 15.2 汉明码 287 15.2.1 SEC-DED 289 ...
  • 11.5.2 循环冗余码校验 319 11.6 串口连接和TCP/IP连接对比 320 11.7 现场总线与RS-232、RS-485的本质区别 320 11.8 MODEM通信技术 320 11.8.1 MODEM的基本工作原理 320 11.8.2 MODEM的功能 322 11.8.3 MODEM的分类 ...
  • 9.13 用HDL语言实现循环冗余校验(712) 9.14 利用单片机和CPLD实现直接数字频率合成(DDS)(717) 9.15 基于VerilogHDL的轴承振动噪声电压峰值检测(722) 第十章 综合应用 10.1 AVR高速单片机LED显示系统(728) 10.2 ...
  • 6.10 循环冗余校验检测差错 32 6.11 模块联接 33 6.12 突发错误 34 6.13 帧格式和差错检测机制 34 6.14 小结 35 练习 35 第7章 局域网技术与网络拓扑 37 7.1 概述 37 7.2 直接点对点通信 37 7.3 共享通信信道 38 7.4...
  • 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 9 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9 7、char型变量...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

如何计算循环冗余校验码