CRC校验码软件
- 格式:docx
- 大小:19.92 KB
- 文档页数:8
modbus crc校验算法
Modbus CRC校验算法用于检查Modbus通信中数据的完整性。
CRC校验算法基于循环冗余校验码(CRC)。
以下是Modbus CRC校验算法的步骤:
1. 初始化一个CRC寄存器(一般为16位,初始值为0xFFFF)和一个多项式寄存器(用于执行位移和异或操作)。
2. 对要发送的数据(包括请求或响应报文)的每个字节执行以下步骤:
a. 将CRC寄存器和数据字节进行位移(右移8位)。
b. 将位移后的CRC寄存器与多项式寄存器进行异或操作。
c. 将异或操作结果反复执行,在每次操作后进行位移,直到处理完所有位。
3. 返回最终处理后的CRC寄存器的值作为校验码。
这样,接收端可以使用同样的算法对接收到的数据执行CRC校验,然后将计算得到的校验码与接收到的校验码进行比较,以判断数据的完整性。
注意:Modbus协议中的CRC校验算法可能会因实现方式或版本而有所不同,因此在实际应用中应根据具体情况进行适当的调整。
以上提供的是一种常见的Modbus CRC校验算法实现。
Lua应用-CRC16校验V1.0工程技术笔记修订历史目录1.适合范围 (1)2.开发环境版本 (2)3.概述 (3)4.教程实现 (4)4.1.1准备工程素材 (4)4.1.2软件平台 (4)4.2配置串口屏工程 (4)4.2.1画面配置 (5)4.3下载工程 (7)4.3.1下载 (7)附录 (9)1.适合范围本文档适合物联型、M系列、F系列(固件版本>=V4.2.401.0)的串口屏产品使用。
2.开发环境版本1.VisualTFT软件版本:V3.0.1.1111及以上的版本。
2.串口屏硬件版本:物联型固件>=V3.0.598.0,M系列固件>=V6.1.199.00,F型固件>=V4.2.401.0。
3.概述CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,对数据进行多项式计算,并将得到的结果附在帧里面,以保证数据传输的正确性和完整性。
一般而言,串口屏在自定义协议中使用CRC校验比较常见,故本文在lua脚本实现CRC校验。
本例程中的CRC算法类型如下:1)参数模型:X16+X15+X2+12)校验宽度:2个字节,即CRC16,高位前,低位后。
3)预装载值:这是算法开始时,初始化预置值=0xFFFF(16进制表示)4.教程实现本文主要将以下2点进行说明:1.准备工程素材;2.配置串口屏工程;4.1.1准备工程素材在实现例程前需要作以下3个准备:1.硬件平台;2.软件平台;3.UI素材;该例程使用W系列7寸串口屏DC80480W070_1111_0T为验证开发平台。
如图5-1所示;图5-1W系列7寸串口屏其他尺寸、M系列、F系列(固件版本>=V4.2.401.0)的串口屏均可借鉴此教程。
4.1.2软件平台使用上位机软件VisualTFT配置工程。
如图5-2所示;图5-2下载软件4.2配置串口屏工程用户点击画面依次输入文本数据(10进制输入,16进制显示),点击计算,将输入的数据进行校验并显示出来。
WinRAR CRC校验失败,文件被破坏的解决办法昨天下载了一个将近一G的软件,在解压时,提示“CRC校验失败,文件被破坏”,不至于再重新下载吧,需要四个多小时呢,网上的方法也试了好多种,都不好用...我采用的方法很简单:在没有解压完(提示出错的情况下)拷贝文件到其它目录,等解压完成,OK,文件依然好用,这个方法应该是有针对性地,还是枚举一下网络的做法。
网络的方法:办法一:WinRAR本身就带有压缩包修复功能。
点击菜单“工具”下的“修复压缩文件”即可,快捷键是“ALT+R”。
此法可修复一部分压缩包的常规错误,但是成功率不高。
你可以试着连续修复几次。
WinRAR的这个功能对压缩包里有很多文件且文件容量都比较小的情况比较适用。
办法二:打开压缩包(不是解压,而是用WinRAR打开),选中你要解压缩的文件,单击鼠标右键,在弹出的菜单里选择“无需确认直接解压缩”,快捷键是“ALT+W”。
用此方法,不管是好的压缩包还是坏的压缩包,统统畅行无阻,成功率100%!办法三:釜底抽薪法!其原理就是让RAR压缩包内损坏的文件解压缩出来,不理会WinRAR的警告,能解压多少就解压多少。
解压缩软件还是用WinRAR,不过要做小小的设置。
在右键点击解压缩文件后跳出的窗口里,把“保留被损坏的文件”复选框选中,点击确定开始解压缩。
不要理会解压缩出错的信息,解压缩结束之后你会发现损坏的文件被解压出来了。
经过这样解压出来的损坏文件能正常使用的几率还是非常高的。
做好保险工作1.做好恢复记录原始RAR压缩包在压缩时,如果选择放置恢复记录,这样用户下载后即使CRC出错也有自己修复的机会!2.采取分卷压缩采取分卷压缩的方法便可较大地减少因为出现不可恢复的错误带来的损失。
3.老文件也加恢复记录有人也许会问,新压缩的RAR压缩包可以加入恢复记录,那么已经压缩过的RAR包有没有办法也加上恢复记录呢?给已经压缩好的RAR压缩包加上恢复纪录是有办法的。
一、概述近年来,数据通信和数据传输在各行各业中扮演着至关重要的角色。
而CRC(Cyclic Redundancy Check)作为一种广泛应用于数据传输中的错误检测方法,一直备受关注。
在CRC算法中,CRC16算法因其简单高效而被广泛使用。
而在实际的软件开发中,使用查表法计算CRC16值可以大大提高运算效率。
MATLAB作为一种强大的数学计算工具,提供了丰富的工具箱和函数,可用于实现CRC16的查表法计算。
本文将介绍MATLAB中实现CRC16算法的查表法,并给出具体的实现步骤和代码。
二、CRC16算法简介CRC16算法是一种基于多项式除法的错误检测方法,它通过对数据进行循环移位和异或运算,生成一个固定长度的校验值。
CRC16算法广泛应用于网络通信、存储系统和物联网等领域。
CRC16算法的计算过程包括初始化、按位异或、循环移位和结果取反等步骤,具体过程较为复杂。
在实际的软件开发中,为了提高计算效率,通常采用查表法来实现CRC16算法。
三、查表法计算CRC16算法1. CRC16算法的查表法原理CRC16算法的查表法原理是将CRC16的计算结果预先存储在一个查表中,待计算CRC16校验值时,直接查表得到结果,从而避免了重复计算多次。
这种方法可以大大提高CRC16的计算效率,尤其是在大规模数据传输和通信中,具有明显的优势。
2. MATLAB中的CRC16查表法实现在MATLAB中,可以通过自定义查表,并结合位操作函数来实现CRC16的查表法计算。
以下是MATLAB中实现CRC16查表法的基本步骤:2.1 定义CRC16查表首先需要构建一个256个元素的查表,每个元素的值为CRC16校验码的计算结果。
这个查表可以通过一次性计算出来,并在程序中直接进行引用。
2.2 数据处理在计算CRC16校验值时,首先需要对待校验的数据进行预处理,比如补位、初始化等操作。
然后将数据按位进行异或和查表操作,得到CRC16校验值。
如何在VB中编写CRC校验程序
在VB中编写CRC校验程序,可以通过以下步骤来实现:
1.了解CRC校验算法:
CRC(Cyclic Redundancy Check)校验是一种常见的错误检测机制,
通过对数据进行计算生成固定长度校验码来验证数据的完整性。
CRC校验
算法使用生成多项式来计算校验码,具体的生成多项式由所使用的CRC标
准决定。
2.导入系统命名空间:
3.创建CRC校验类:
在VB中,可以创建一个类来封装CRC校验的相关操作。
可以定义该
类的属性来存储生成多项式等信息,以及定义方法来执行CRC校验。
4.实现CRC校验方法:
根据CRC校验算法,可以实现一个方法来计算数据的校验码。
具体步
骤如下:
-准备一个数据缓冲区,将待校验的数据按照一定的规则放入缓冲区。
-根据生成多项式,对缓冲区中的数据进行逐位运算,得到校验码。
-返回校验码。
5.调用CRC校验方法:
在主程序中,可以实例化CRC校验类,并调用其中的方法来进行校验。
将待校验的数据作为参数传递给校验方法,获取校验码。
6.完善错误处理:
在代码中需要加入适当的错误处理机制,以捕捉可能出现的异常情况,并给出相应的提示或处理方法。
综上所述,以上是在VB中编写CRC校验程序的基本实现步骤。
具体
的代码实现可以从以下几个方面来展开:导入命名空间、创建CRC校验类、实现CRC校验方法、调用CRC校验方法、错误处理和测试验证等。
编写时
需要根据具体的应用场景和需求来确定具体的实现细节和功能。
python⽣成crc校验⽣成modbus16位校验码CRC16 Modbus计算原理1. 预置 1 个 16 位的寄存器为⼗六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
2. 把第⼀个 8 位⼆进制数据 (通信信息帧的第⼀个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
3. 把 CRC 寄存器的内容右移⼀位( 朝低位)⽤ 0 填补最⾼位, 并检查右移后的移出位。
4. 如果移出位为 0, 重复第 3 步 ( 再次右移⼀位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进⾏异或。
5. 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进⾏了处理。
6. 重复步骤 2 到步骤 5, 进⾏通信信息帧下⼀个字节的处理。
7. 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的⾼、低字节进⾏交换。
8. 最后得到的 CRC寄存器内容即为 CRC码。
python代码实现def one_byte_crc(data, crc_data):"""处理⼀个字节的crc校验环节:param data:待处理的数据:param crc_data:crc寄存器值,最初始的为0xffff:return:"""# 把第⼀个8位⼆进制数据(通信信息帧的第⼀个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器。
crc_data_tmp1 = (get_crc_low(crc_data) ^ data) + (0xff00 & crc_data)length = 8while True:# 把CRC寄存器的内容右移⼀位(朝低位)⽤0填补最⾼位,并检查右移后的移出位。
# 如果移出位为0,重复第3步(再次右移⼀位);如果移出位为1,CRC寄存器与多项式A001(1010000000000001)进⾏异或。
crc循环冗余校验matlab 实现-概述说明以及解释1.引言1.1 概述概述部分的内容:CRC(循环冗余校验)是一种在数据通信中常用的差错检测方法。
它通过对发送数据进行一系列的计算和校验,以判断接收数据是否出现了错误或被篡改。
CRC技术广泛应用于各种数据传输系统,包括计算机网络、无线通信、存储设备等。
CRC算法的原理是将发送数据看作一个多项式,并利用这个多项式进行一系列的运算。
通过对多项式进行除法运算,得到一个余数。
发送方将这个余数附加在数据后面发送给接收方。
接收方同样利用CRC算法对接收到的数据进行一系列的运算,得到一个余数。
如果发送方和接收方的余数一致,则可以认为数据传输没有出现错误;反之,如果余数不一致,则说明数据发生了错误或被篡改。
Matlab是一种功能强大的科学计算软件,也是进行CRC算法实现的优秀工具。
通过Matlab的计算和编程能力,我们可以方便地编写CRC算法的相关代码,实现CRC校验的过程。
Matlab提供了各种函数和工具箱,可以帮助我们进行多项式的运算、二进制数据的转换以及CRC校验码的计算等操作。
本篇文章将详细介绍如何在Matlab中实现CRC循环冗余校验。
首先,我们将介绍CRC算法的基本原理和步骤。
然后,我们将详细讲解如何使用Matlab进行CRC校验的编程实现,包括数据的转换、多项式的计算和余数的检验。
最后,我们将通过实际的案例来展示Matlab实现CRC的应用场景和效果。
通过阅读本文,读者将能够了解CRC循环冗余校验的基本原理和应用场景,并能够使用Matlab进行CRC算法的实现和应用。
本文的内容将有助于读者提高对CRC技术的理解和掌握,在进行数据通信和差错检测的相关工作中发挥更好的作用。
文章结构部分应该涵盖关于整篇文章章节的简要说明,以下是一种可能的编写方式:1.2 文章结构本文共分为三个主要部分:引言、正文和结论。
每个部分的内容如下所述:1. 引言在引言部分,我们将首先对文章所涉及到的主题进行概述,包括简要介绍循环冗余校验(CRC)的概念和应用领域。
matlab crc校验函数Matlab是一种广泛应用于科学计算和工程设计的高级编程语言和环境。
在数据通信中,CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,用于验证数据传输的准确性。
本文将介绍Matlab中的CRC校验函数,包括其基本原理、使用方法以及常见应用场景。
我们来了解一下CRC校验的基本原理。
CRC校验是通过对待传输数据进行多项式计算,并将计算结果添加到数据中作为校验码。
接收方在接收到数据后,同样进行CRC校验计算,并将计算结果与接收到的校验码进行比较,以判断数据是否传输正确。
CRC校验可以检测出多达r位错误,其中r是多项式的阶数。
在Matlab中,可以使用crc32函数进行CRC校验的计算。
该函数接受待校验的数据作为输入,并返回计算得到的校验码。
crc32函数的使用方法如下:```matlabcrc = crc32(data);```其中,data是待校验的数据,crc是计算得到的校验码。
需要注意的是,crc32函数只能计算32位的CRC校验码。
除了crc32函数,Matlab还提供了其他一些用于CRC校验的函数,如crc16、crc15等。
这些函数的使用方法与crc32类似,只是计算得到的校验码的位数不同。
CRC校验在数据通信中有着广泛的应用。
例如,在串行通信中,发送方可以使用CRC校验对发送的数据进行校验,以确保数据传输的准确性。
接收方在接收到数据后,同样使用CRC校验对接收到的数据进行校验,以判断数据是否传输正确。
如果校验失败,接收方可以要求发送方重新发送数据。
CRC校验也常用于存储介质中的数据完整性校验。
例如,磁盘驱动器和闪存设备等存储介质通常会使用CRC校验来确保数据在存储和读取过程中不会发生错误。
在实际应用中,我们可以根据具体的需求选择合适的CRC多项式和校验码位数。
不同的CRC多项式和校验码位数对应着不同的校验能力和计算复杂度。
通常情况下,校验码位数越高,校验能力越强,但计算复杂度也越高。
crc校验实验报告python代码标题:CRC校验实验报告:Python代码实现与解析一、引言CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用在数据通信和存储系统中的错误检测码。
其基本原理是通过在原始数据后添加一个特定的校验码,然后在接收端再次计算并比较这个校验码,以此来判断数据在传输过程中是否发生了错误。
本实验报告将详细阐述如何使用Python语言实现CRC校验,并通过具体的代码示例进行解析。
二、CRC校验原理CRC校验的基本思想是将待校验的数据看作是一个大数,然后用这个大数除以一个预设的除数,得到的余数就是CRC校验码。
在接收端,同样的操作被执行,如果得到的余数为0,则认为数据在传输过程中没有发生错误。
三、Python代码实现以下是一个简单的Python代码实现CRC校验的例子:pythondef crc8(data):polynomial = 0x07 # 使用0x07作为生成多项式crc = 0x00 # 初始化CRC值为0for byte in data:crc ^= byte # XOR当前字节与CRC值for _ in range(8): # 对每个位进行处理if crc & 0x80: # 如果最高位为1crc = (crc << 1) ^ polynomial # 左移一位并异或生成多项式else:crc <<= 1 # 否则只左移一位crc &= 0xFF # 保留8位return crcdata = b"Hello, World!" # 待校验的数据checksum = crc8(data) # 计算CRC校验码print("CRC8 Checksum:", hex(checksum)) # 输出CRC校验码四、代码解析1. 定义CRC函数`crc8`,输入参数为待校验的数据。
一、CRC码工作原理1. CRC校验原理CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。
它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
CRC计算与普通的除法计算有所不同。
普通的除法计算是借位相减的,而CRC计算则是异或运算。
任何一个除法运算都需要选取一个除数,在CRC运算中我们称之为poly,而宽度W就是poly最高位的位置。
比如poly 1001的W是3,而不是4。
注意最高位总是1,当你选定一个宽度,那么你只需要选择低W各位的值。
假如我们想计算一个位串的CRC码,并要保证每一位都要被处理,因此我们需要在目标位串后面加上W个0。
CRC校验原理看起来比较复杂,因为大多数书上基本上是以二进制的多项式形式来说明的。
其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。
当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。
到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。
因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。
如果有余数,则表明该帧在传输过程中出现了差错。
【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。
模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。
相当于二进制中的逻辑异或运算。
也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。
对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。
根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。
通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。
编辑本段几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。
可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。
多项式包括生成多项式G(x)和信息多项式C(x)。
如生成多项式为G(x)=x^4+x^3+x+1,可转换为二进制数码11011。
而发送信息位 1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。
2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。
在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:a、生成多项式的最高位和最低位必须为1。
b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
c、不同位发生错误时,应该使余数不同。
d、对余数继续做除,应使余数循环。
3 CRC码的生成步骤1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当与对应的信息多项式C(x)*2的R次方。
3、用生成多项式(二进制数)对信息码做除,得到R位的余数。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
CRC校验及其软件实现姚七栋;张春玉【摘要】数据通信技术是计算机网络技术发展的基础,已经成为现代生活中必不可少的一部分.但通过通信信道传输的数据往往会有差错的产生,而且差错的产生是不可避免的,我们的任务是分析差错产生的原因与差错类型,研究检查是否出现差错及如何纠正差错.循环冗余码(CRC)是目前应用最广的检错纠错编码方法之一.论述了CRC的教学原理及其在数据通信中的作用,并提出了用8031汇编语言实现CRC校验的程序设计.【期刊名称】《现代电子技术》【年(卷),期】2006(029)013【总页数】3页(P67-68,71)【关键词】CRC校验;信道;误码;检错【作者】姚七栋;张春玉【作者单位】陕西财经职业技术学院,陕西,咸阳,712000;陕西财经职业技术学院,陕西,咸阳,712000【正文语种】中文【中图分类】TN911在计算机通信过程中,由于信道上存在的各种复杂因素(例如:冲击噪声和热噪声等)的影响,所传输的信号将受到不同程度的干扰,严重时会造成误码以致阻断通信。
所以应该在接收方检查所接收的数据是否正确,可采用多种检测方法。
其中循环冗余校验码(CRC校验)是目前在计算机网络通信及存储器等方面应用最为广泛的一种校验编码方法,是一种强有力的检测手段。
人们将该技术用于多处数据通信系统中,收到了令人满意的效果。
本文从CRC校验的教学原理及汇编语言实现两方面入手,详细介绍了CRC校验方法。
1 CRC校验的教学原理CRC检错方法的工作原理是:将要发送的数据比特序列当做一个多项式K(X)的系数,在发送端用收发双方预先约定的生成多项式G(x)去除,求得一个余数多项式R(x)。
将余数多项式加到数据多项式之后(称为T(X))发送到接收端。
在接收端用同样的生成多项式G(x)去除接收到的数据多项式T′(X),如果除得尽,表明无差错,即T(X)= T′(X);如果除不尽,表明有差错,即T(X)≠T′(X);余数将指明出错位所在位置。
modbus rtu crc16 校验码计算方法
Modbus RTU使用CRC16校验码,其计算方法如下:
1. 初始化为0xFFFF(十六进制)。
2. 从数据帧中的第一个字节开始遍历。
3. 对于每个字节,执行以下操作:
a. 将字节与CRC寄存器的当前值进行按位异或(^)。
b. 将结果向左移动一位(|)。
c. 如果最高位是1,则将CRC寄存器的值增加1。
4. 当遍历完所有字节后,将CRC寄存器的值再次右移一位并重新赋值给CRC校验码。
5. 如果CRC校验码与实际接收到的校验码匹配,则校验通过。
值得注意的是,Modbus RTU的CRC校验码并不是固定不变的,它可能因不同的硬件和通信环境而略有不同。
此外,由于Modbus RTU的帧长度限制,在CRC计算过程中可能需要跳过某些字节,这可能会影响校验码的计算结果。
因此,在实际应用中,需要仔细考虑这些因素,以确保Modbus RTU通信的正确性和可靠性。
MODBUS的CRC校验和程序(VB编制)modbus协议做为一种通用协议得到了广泛的应用,它有两种传输模式:ASCII和RTU。
ASCII模式采用LRC校验,RTU模式采用CRC校验。
CRC方法错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。
使用RTU模式,消息包括了一基于CRC方法的错误检测域。
CRC域检测了整个消息的内容。
CRC域是两个字节,包含一16位的二进制值。
它由传输设备计算后加入到消息中。
接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。
仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。
LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。
整个过程要重复8次。
在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。
最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC域附加在消息的最后,添加时先是低字节然后是高字节。
故CRC的高位字节是发送消息的最后一个字节。
下面是用VB实现的CRC校验和程序:Function CRC16(data() As Byte) As String ’CRC计算函数Dim CRC16Lo As Byte, CRC16Hi As Byte ’CRC寄存器Dim CL As Byte, CH As Byte ’多项式码&HA001Dim SaveHi As Byte, SaveLo As ByteDim I As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For I = 0 To UBound(data)CRC16Lo = CRC16Lo Xor data(I) ’每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2 ’高位右移一位CRC16Lo = CRC16Lo \ 2 ’低位右移一位If ((SaveHi And &H1) = &H1) Then ’如果高位字节最后一位为1CRC16Lo = CRC16Lo Or &H80 ’则低位字节右移后前面补1End If ’否则自动补0If ((SaveLo And &H1) = &H1) Then ’如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext IDim ReturnData(1) As ByteReturnData(0) = CRC16Hi ’CRC高位ReturnData(1) = CRC16Lo ’CRC低位asd = Right("00" + Hex(CRC16Lo), 2) + Right("00" + Hex(CRC16Hi), 2) End Function多线程串行通讯VB源码Option ExplicitPrivate WithEvents oTest1 As TestExe.clsTestPrivate WithEvents oTest2 As TestExe.clsTestPrivate Declare Function GetTickCount Lib "kernel32" () As LongDim mi, i As IntegerPublic Sub timedelay(ByVal t As Long)Dim tt As Doublett = GetTickCount()DoDoEventsLoop Until GetTickCount() - tt > tEnd SubPrivate Sub Command1_Click()Set oTest1 = New TestExe.clsTestoTest1.lMillisecs = 100oTest1.StartSub (1000)Set oTest2 = New TestExe.clsTestoTest2.lMillisecs = 100oTest2.StartSub (1000)Command1.Enabled = FalseCommand2.Enabled = TrueEnd SubPrivate Sub Command2_Click()oTest1.StopSuboTest2.StopSubCommand1.Enabled = TrueCommand2.Enabled = FalseEnd SubPrivate Sub Command3_Click()oTest1.StopSuboTest2.StopSubSet oTest1 = NothingSet oTest2 = NothingEnd SubPrivate Sub Form_Unload(Cancel As Integer)oTest1.StopSuboTest2.StopSubSet oTest1 = NothingSet oTest2 = NothingEnd SubPrivate Sub oTest1_Progress(ByVal lProgress As Long)List1.AddItem lProgressList1.ListIndex = List1.ListCount - 1End SubPrivate Sub oTest2_Progress(ByVal lProgress As Long)recieve_messageList2.AddItem lProgressList2.ListIndex = List2.ListCount - 1End SubPrivate Sub send_message()If MSComm1.PortOpen = False Then '置位mPort = 1MSComm1.PortOpen = TrueEnd IfMSComm1.Settings = "57600,n,8,2"MSComm1.InputLen = 0MSComm1.InputMode = comInputModeTextMSComm1.Output = Text1.TextDotimedelay 100DoEventsLoop While MSComm1.InBufferCount <= 2Label1.Caption = MSComm1.InputIf Label1.Caption = "" ThenMsgBox "通讯错误,请确认线路是否连接", vbOKOnly, "错误"Else'Label1.Caption = "开始运行"End IfMSComm1.InputLen = 0MSComm1.PortOpen = FalseEnd SubPrivate Sub recieve_message() '接收应答信息,初始化MSComm Dim str As StringIf MSComm1.PortOpen = False Then '置位mPort = 1MSComm1.PortOpen = TrueEnd IfMSComm1.Settings = "57600,n,8,2"MSComm1.InputLen = 0MSComm1.InputMode = comInputModeText'MSComm1.InputMode = comInputModeBinaryDotimedelay 100DoEventsLoop While MSComm1.InBufferCount <= 2str = MSComm1.InputLabel1.Caption = strDebug.Print strEnd SubPrivate Sub sent_msg_Click()send_messageEnd SubPrivate Sub show_msg_Click()recieve_messageEnd Sub如何用VB实现Modbus串行通讯在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。
metadata crc error detected元数据是指关于数据的信息,例如文件属性、文件大小、创建时间等等。
这些信息通常被存储在文件的开头或结尾。
当你的计算机或存储设备发现元数据出现错误时,就会出现“metadata crc error detected”的错误提示。
这个错误提示意味着什么呢?CRC是循环冗余校验码的缩写,它是一种用于检测数据传输错误的技术。
当数据在传输过程中出现错误时,CRC可以检测出这些错误并报告给用户。
在存储设备中,CRC通常用于检测元数据的完整性。
当你的计算机或存储设备检测到元数据的CRC错误时,它会给你一个警告,表示元数据不完整或已损坏。
这可能会导致文件丢失、无法打开或无法访问。
这种错误可能是由于存储设备的损坏、文件系统错误或传输错误等原因引起的。
如果你遇到了“metadata crc error detected”的错误提示,该怎么办呢?首先,你需要检查你的存储设备是否有损坏。
你可以尝试使用其他存储设备或计算机打开文件,看看是否能够正常访问。
如果你能够正常访问文件,那么很有可能是你的存储设备出现了问题。
其次,你可以尝试使用数据恢复软件来修复损坏的元数据。
这些软件通常可以帮助你恢复丢失的文件或修复文件系统错误。
然而,使用这些软件需要谨慎,因为它们有可能会进一步破坏你的数据。
最后,如果你无法解决这个问题,你可以寻求专业的帮助。
你可以联系存储设备制造商或专业的数据恢复公司,寻求他们的帮助。
总之,“metadata crc error detected”是一个比较常见的错误提示。
当你遇到这个问题时,不要惊慌,首先需要检查存储设备是否有损坏,尝试使用数据恢复软件修复元数据,如果不行,可以寻求专业的帮助。
希望这篇文章能帮助你解决这个问题。
CRC-16校验完整代码CRC-16校验完整代码通信领域经常用到CRC校验。
这里把CRC-16的代码转发一下。
不过,我推荐一个用于生成各种校验码的开源软件 Fsum frontend它的开源项目网址是:/下载其源代码,可看到各种算法,但不是用c写的。
该软件的用处是,可以验证你的算法。
CRC-16 IBM x 16 + x 15 + x 2 + 1CRC编码的原理,网上有很多,简单的说就是将数据用生成式进行模2除法。
这里我主要写一下,查表法的原理。
一、原理:数据项: <BnBn-1Bn-2Bn-3,...,B3B2B1>先查表获得Bn的两字节余式,将该余式的高8位与Bn-1进行模2运算,假定B'n-1,低8位与Bn-2进行模2运算,假定结构为B'n-2,得到< B'n-1B'n-2Bn-3,...,B3B2B1 >,以此类推,最终获得两字节的CRC码.(参考字节型CRC算法实现一文)二、实现以下代码中中的查表法来自于 Linux-2.6.17,定义法是根据定义编写的,我使用随机数对两种方法进行了比对,结果一致#include <stdio.h>#include <stdlib.h>#include<math.h>typedef unsigned intu16;typedef unsigned char u8;u16 const crc16_table[256] = { 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};static inline u16 crc16_byte(u16 crc, const u8 data){ return (crc >> 8) ^crc16_table[(crc ^ data) & 0xff];}/*** crc16 - compute the CRC-16 for the data buffer* @crc: previous CRC value*@buffer: data pointer* @len: number of bytes in the buffer** Returns the updated CRC value.*/u16 crc16(u16 crc, u8 const *buffer, u16 len){ while (len--) crc = crc16_byte(crc, *buffer++); return crc;}/*** crc16 - compute the CRC-16 for the data buffer according to the definition* @crc: previous CRC value* @buffer: data pointer* @len: number of bytes in the buffer** Returns the updated CRC value.*/u16 crc16_calculate(u16 crc,u8 const *buffer,u16 len){ u16 i,j; u8 data; for ( j = 0; j < len; j++) { data= buffer[j]; for ( i = 0; i < 8; i++) { crc = ((data ^ (u8)crc) & 1) ? ((crc >> 1) ^ 0xA001) : (crc >> 1); data>>= 1; } } return crc;}int main(){ u16 crc1,crc2; u8 test[32] ; u8 i; while(1) { for(i=0;i<32;i++) test[i]=rand(); crc1=0; crc2=0; // crc=crc16(0,test,6); crc1=crc16(crc1,test,6);printf("CRC=%d/n",crc1); crc2=crc16_calculate(crc2,test,6); printf("CRC=%d/n",crc2); if(crc1!=crc2) break; } return 0;}。
CRC校验码软件CRC-16是检测数据在发送过程中发生错误的常用校验方法。
一、前言CRC的计算方式是将欲传输的数据块视为一堆连续位所构成的整个数值,将此数值除以一个特定的除数,通常以二进制表示,此除数称为生成多项式(ANSI CRC-16的生成多项式为:x16 + x15 + x2 + 1)。
目前较常用的CRC位数目有8和16以及32,在这里只讲述如何写CRC位数目为16的程序。
CRC位数目越大,数据的错误检测率则越高,但必须多花一些时间进行数据的计算。
二、CRC-16计算步骤CRC-16的计算方法有两种:查表法与计算法,在这里只讲述计算法。
在某电力仪表上的说明书中摘录下来的计算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, putting the result in the CRC register.3、Shift the CRC register one bit to the right (toward the LSB), zero-filling the MSB. Extract and Examine.4、If the LSB was 1: Exclusive OR the CRC register with polynomial value A001 hex. If the LSB was 0: 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 byte will 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寄存器。
3、CRC寄存器右移1位(朝最低位),同时最高位添零。
取出并检查最低位是否为1。
(Visual Basic 里如何做移位的运算呢?)4、如果为1,则CRC寄存器与多项式A001异或;如果为0,则重复第3步的动作。
(Visual Basic 里如何判断一个字节里某个位的值呢?)5、重复3和4直到完成了8次移位。
这样完整的8位字节将完成处理了。
6、对于下一个8位字节的处理就是重复第2步到第5步了7、把所有的欲发送或接收消息这样处理后,CRC寄存器里的值就是我们最终需要得到的CRC校验码。
如果你能正确回答我的问题,那么恭喜你,你自己可以用Visual Basic写数据采集卡的控制程序了。
三、Visual Basic程序实现以江阴长江斯菲尔电力仪表公司CD194E系列多功能电力仪表的MODBUS-RTU通讯协议的报文格式为例,该表通信报文格式使用的校验方式就是CRC-16。
通过对地址01H、命令04H、数据地址005CH和数据长度0004H的CRC-16运算后得到主机请求数据报文的CRC16的校验码为31DBH。
程序界面程序代码:Private Sub cmdGenerate_Click()Dim OutByte(7) As Byte, CRC16() As Byte, CRC16LO As Byte, CRC16HI As Byte, TempHI As Byte, TempLO As ByteDim i As Integer, j As Integer'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''OutByte(0) = Val("&H" & txtOutByte(0).Text)OutByte(1) = Val("&H" & txtOutByte(1).Text)OutByte(2) = Val("&H" & txtOutByte(2).Text)OutByte(3) = Val("&H" & txtOutByte(3).Text)OutByte(4) = Val("&H" & txtOutByte(4).Text)OutByte(5) = Val("&H" & txtOutByte(5).Text)CRC16LO = &HFF '(1)Load a 16-bit register with FFFF hex.call this the CRC register.CRC16HI = &HFFFor i = 0 To UBound (OutByte) - 2CRC16LO = CRC16LO Xor OutByte (i) '(2)Exclusive OR the first 8-bit byte of the message'with the low-order byte of the 16-bit CRC,'putting the result in the CRC registerFor j = 0 To 7TempHI = CRC16HITempLO = CRC16LOCRC16HI = CRC16HI \ 2 '(3)Shift the CRC register one bit to the right(toward the LSB),zero-filling CRC16LO = CRC16LO \ 2 'the MSB.Extract and ExamineIf ((TempHI And &H1) = &H1) ThenCRC16LO = CRC16LO Or &H80 '移位时,如果高低位是1,则低高位加1 End IfIf ((TempLO And &H1) = &H1) Then '(4)if the LSB was 1:CRC16HI = CRC16HI Xor &HA0 'Exclusive OR the CRC register with polynomial value A001 hex.CRC16LO = CRC16LO Xor &H1End If 'if the LSB was 0: Repeat step 3 (anothershift)Next j '(5)Repeat step 3 and 4 until 8 shifts have been performed.'when this is done, a complete 8-bit byte will have been processed.Next i '(6)Repeat step 2 through 5 for the next 8-bit byte of them message.OutByte(6) = CRC16LO '(7)The final contents of the CRC register is the CRC valuetxtOutByte(6) = Hex(OutByte(6))OutByte(7) = CRC16HItxtOutByte(7) = Hex(OutByte(7))End Sub四、Visual C++程序实现程序界面主要代码:#define CHECKVALUE(pt,nl) if((btData==NULL)||(nLength<=0)){AfxMessageBox("无效数组!");return -1;}BOOL CCRC_16Dlg::OnInitDialog(){……m_strCRC="01 04 00 5C 00 04";UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control}void CCRC_16Dlg::OnOK(){UpdateData(TRUE);CString strTemp;strTemp=m_strCRC;WORD CRC;BYTE btData[4096];int nLength=StrToHex(strTemp,btData);CRC=ANSI_CRC_16(btData,nLength); //ANSI-16CString str;str.Format(" %02X %02X",(BYTE)(CRC>>8),(BYTE)CRC);AfxMessageBox(str);CDialog::OnOK();}WORD CCRC_16Dlg::ANSI_CRC_16(BYTE* btData,int nLength) //ANSI CRC-16,x16 + x15 + x2 + 1{CHECKVALUE(btData,nLength);WORD CRC=0xFFFF;BYTE j,Tmp=0;int i;for(i=0;i<nLength;i++){CRC^=btData[i]; //做位异或运算for (j=0;j<8;j++){Tmp=CRC&0x0001; //位与运算CRC=CRC>>1; //位右移运算if(Tmp) CRC=(CRC^0xA001);}}return ((CRC>>8)+(CRC<<8));}int CCRC_16Dlg::StrToHex(CString str, BYTE *btData){int nLength=str.GetLength();if(nLength<2) return 0;for(int i=0;i<nLength;i+=3) _stscanf(str.Mid(i,2),"%02X",&btData[i/3]);return (i+1)/3;}五、结论1,这两个实例可以当作计算CRC-16的小工具,代码对于自己要开发CRC-16的人员也提供一些参考价值。