CRC校验(循环冗余校验 Cyclic Redundancy Check)(以Modbus通信为例)

文章目录

  • CRC校验在Modbus通信中的应用
    • 介绍
    • CRC校验的基本原理
      • 校验原理
      • 核心多项式
    • CRC在Modbus通信中的实际应用
      • 数据格式
      • 校验流程
        • 1. 发送方:计算数据包(不包括CRC校验码)的CRC校验码,然后将校验码附加到数据包的末尾。
        • 2. 接收方:收到数据包后,提取出CRC校验码,并对包括校验码在内的整个数据包进行CRC校验。如果计算结果为零,说明数据在传输过程中未被篡改或损坏。
    • CRC校验的编程实现
      • CRC计算函数
      • 数据包的构造与解析
    • CRC校验的优势与局限
      • 优势
      • 局限
        • 1. 非修复性:CRC校验只能用于错误检测,无法修复错误。
        • 2. 有限的保护:在极端情况下,如数据遭到复杂篡改,CRC校验可能会失效。
        • 3. CRC校验码并不是与数据唯一对应的
    • 结论

CRC校验在Modbus通信中的应用

介绍

循环冗余校验(Cyclic Redundancy Check,CRC)是一种在数据通讯领域广泛使用的技术,用于检测数据传输或存储过程中的错误。在工业通信协议中,特别是Modbus协议中,CRC校验起到了非常关键的作用,它保证了数据从一个设备传输到另一个设备时的完整性和准确性。

CRC校验的基本原理

校验原理

CRC校验是基于二进制数据进行的。它通过将数据视为一个长的二进制数,并通过特定的多项式进行除法运算,从而得到一个固定长度的余数,即CRC值。这个余数就作为校验码附加到原始数据后面。接收方在接收到数据后,将包括CRC在内的完整数据再次通过同一个多项式进行除法运算,如果余数为零,则认为数据在传输过程中未发生错误。

核心多项式

在Modbus协议中,通常使用的CRC多项式是0xA001(反向多项式),这是根据CRC-16标准的多项式0x8005进行位序反转得到的。

CRC在Modbus通信中的实际应用

数据格式

在Modbus协议中,数据包的格式通常包括设备地址、功能码、数据和CRC校验码。CRC校验码是整个数据包的最后两个字节,用于验证数据包的完整性。

校验流程

1. 发送方:计算数据包(不包括CRC校验码)的CRC校验码,然后将校验码附加到数据包的末尾。
2. 接收方:收到数据包后,提取出CRC校验码,并对包括校验码在内的整个数据包进行CRC校验。如果计算结果为零,说明数据在传输过程中未被篡改或损坏。

CRC校验的编程实现

CRC计算函数

下面是一个在Python中实现Modbus CRC16校验的示例代码:

def crc16(data: bytes):crc = 0xFFFFfor pos in data:crc ^= posfor i in range(8):if (crc & 1) != 0:crc >>= 1crc ^= 0xA001else:crc >>= 1return crc# 示例数据
data = b'\x01\x03\x00\x00\x00\x01'  # 设备地址为1, 功能码为3, 请求读取寄存器地址为0x0000, 长度为1
crc_value = crc16(data)
print(f"CRC Value: {crc_value:04X}")

数据包的构造与解析

在实际的Modbus通信中,发送方需要将计算得到的CRC校验码附加到数据包末尾,并发送到网络中。接收方需要从接收到的数据包中提取出CRC校验码,并验证整个数据包的完整性。

CRC校验的优势与局限

优势

  1. 高效性:CRC校验的计算效率高,适用于实时数据传输环境。
  2. 检错能力强:CRC校验对常见的错误如位错误有很高的检测率。

局限

1. 非修复性:CRC校验只能用于错误检测,无法修复错误。
2. 有限的保护:在极端情况下,如数据遭到复杂篡改,CRC校验可能会失效。

在某些极端情况下,如果数据被有意识地、复杂地篡改,并且篡改者也计算出新的CRC校验码来替换原始的CRC校验码,那么接收方在检验数据时可能无法察觉到这种篡改。因为从技术上讲,新的数据和其对应的CRC校验码仍然是匹配的,CRC校验会认为数据是没有错误的。

CRC校验主要是用来检测数据在传输或存储过程中由于错误而产生的无意的改动,如噪声干扰所导致的位错误。它并不是设计来防御有意的数据篡改,这类攻击通常需要更复杂的安全措施,如使用加密和数字签名等方法来保证数据的完整性和真实性。

3. CRC校验码并不是与数据唯一对应的

CRC校验码并不是与数据唯一对应的。虽然CRC校验码是根据数据内容计算得出的,使得它在很大程度上反映了原始数据的特征,但它不是一个完全唯一的指纹。理论上,不同的数据可以产生相同的CRC校验码,这种情况称为“碰撞”。

CRC校验码的长度通常较短(如16位或32位),这意味着只有有限的可能的CRC值。因此,随着处理的数据量增加,不同数据产生相同CRC校验码的可能性也随之增加。尽管如此,对于大多数实际应用来说,CRC提供了足够的错误检测能力,特别是在偶发错误或非有意篡改的环境中。

如果应用对冲突的敏感度非常高,可能需要考虑使用更复杂的校验算法或结合其他形式的校验和安全措施来减少冲突的可能性和提高数据的安全性。

结论

CRC校验在Modbus通信中扮演着至关重要的角色,通过提供一种高效且可靠的错误检测机制,它帮助确保了工业通信的稳定性和数据的完整性。尽管CRC校验有其局限性,但在多数工业应用场景中,它仍然是一种非常有效的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合的概述

java集合框架(Java Collections Framework)为开发者提供了一系列通用容器,所谓容器就是可以容纳其他对象的对象,在jdk1.2开始,就提供了通用容器。 1.Java集合框架的概述 容器是用于容纳其他对象的对象,因此基本数据类型无法直接使…

聚数力 以数兴 | 与“闽”同行,共话数字未来

闽江之畔,数智腾飞。5月24日,第七届数字中国建设峰会在海峡国际会展中心盛大举办。本届展会的主题是“释放数据要素价值,发展新质生产力”,由国家发展改革委、国家数据局、福建省人民政府等单位共同主办,福州市人民政府…

SVD求解Ax=0

源于计算机视觉life的LiDAR视觉IMU多传感器融合SLAM:原理推导源码逐行详解项目实战 SVD求解Ax0 首先,我们需要了解四元数的基本概念。四元数是由三个虚部和一个实部组成的复数扩展,可以用来表示三维空间中的旋转。四元数的乘法规则如下&…

数据恢复的救星!快速恢复手机数据的2个秘籍!

当我们的照片、视频、联系人、短信和应用程序丢失时,许多人可能会感到束手无策,无论是珍贵的照片、重要的工作文件还是个人的联系方式,一旦丢失,都可能带来极大的不便和困扰。但随着数据恢复技术的发展,我们有了更多的…

锐捷网络与您相约第七届数字中国建设峰会 共话数字未来

第七届数字中国建设峰会将于5月24日至25日在福建福州举办,本届峰会是国家数据工作体系优化调整后首次举办的数字中国建设峰会,主题是“释放数据要素价值,发展新质生产力”。作为行业领先的ICT基础设施及解决方案提供商,锐捷网络与福建省电子信息集团、星网锐捷,围绕“发展新质生…

2024中青杯数学建模竞赛A题人工智能视域下养老辅助系统的构建思路代码论文分析

2024中青杯数学建模A题论文和代码已完成,代码为A题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解)、模型的评价…

java练习2

题目要求 创建一个Color枚举类有RED,BLUE,BLACK,YELLOW,GREEN这五个枚举值/对象Color有三个属性redValue,greenValue,blueValue创建构造方法,参数包括这三个属性每个枚举值都要给这三个属性赋值,三个属性对应的值分别是red&#…

Windows批处理命令和概念

Windows中的BAT文件是一种批处理文件,它允许用户执行一系列命令和脚本。这些命令可以是简单的,如复制文件或删除文件,也可以是更复杂的,如运行程序或调用其他批处理文件。以下是一些常用的Windows批处理指令: ECHO - 显…

用go语言实现一个有界协程池

写在文章开头 本篇文章算是对go语言系列的一个收尾,通过go语言实现一个实现一个简单的有界协程池。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护…

HDR视频相关标准-HDR vivid(二)

上文介绍了HDRvivid的一些技术。今天从全局角度来看看HDR视频的处理流程,HDR视频系统,即建立一个比SDR视频更大的色彩/亮度坐标体系,并改变系统的传输函数,以再现更大的色域(WCG)和更高的亮度动态范围。 菁彩 HDR技术的专业术语 …

【ROSUbuntu】常用工具合集

1. 源 ADM64 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror arm64 ubuntu-ports | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2. FileZilla sudo apt-get install filezilla 3. Nomachine8 AMD64

操作系统实战(四)(linux+C语言)

目录 实验目的 前提知识 实验题目 题目分析 实验程序 头文件 头文件实现 核心代码文件 (各类进程) 生产者 抽烟者A 抽烟者B 抽烟者C makefile文件 实验运行 运行结果分析 总结 实验目的 加深对并发协作进程同步与互斥概念的理解&…

【DNS】linux 中让系统 NetworkManager 不自动生成无效的 DNS

1. 问题背景 一些系统安装之后会自动覆盖/添加无效 DNS 设置,导致反而无法上网。 2. 解决方法 修改 /etc/NetworkManager/NetworkManager.conf 文件,在 [main] 部分下添加或修改如下: [main] dnsnone然后用以下命令重启 NetworkManager …

C# 类(Class)

1. 类的基本概念 在C#中,类是一种引用类型,用于定义对象的模板。类可以包含字段(Field)、属性(Property)、方法(Method)、事件(Event)等成员。对象是类的实例,通过类的构造函数创建。 2. 类的声明和使用 你可以使用class关键字来声明一个类: public class Pers…

简述Vue初始化过程中都做了什么?

在Vue的初始化过程中(new Vue(options)),主要执行了以下几个步骤: 创建Vue实例: 使用new Vue(options)来创建一个新的Vue实例。这里的options是一个包含Vue实例初始化所需选项的对象。 合并配置: Vue会将传…

代码随想录算法训练营day34 | 455.分发饼干、376. 摆动序列、53. 最大子序和

理论基础 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。 455.分发饼干 result和j变化一致,可以去除一…

Jenkins配置(插件/角色/凭证)

目录 传送门前言一、Jenkins插件管理1、更换为国内下载源2、中文汉化插件下载(不推荐)3、低版本Jenkins爆红插件安装4、低版本Jenkins插件持续报错解决办法 二、Jenkins用户角色三、Jenkins凭证管理(svn/git)1、Username with pas…

Qt hide()和setVisible(false)区别

前言 在一些场景下,我们需要控制控件的显示与隐藏,QWidget 类提供了两种方法来隐藏控件hide() 和 setVisible(false)。那么他们有何区别呢? widget->hide(); // ? widget->setVisible(false);hide() 和 setVisible(false…

【本周面试问题总结】

01.如何判断链表中是否有环 ①穷举遍历:从头节点开始,依次遍历单链表中的每一个节点。每遍历到一个新节点,将新节点和此前节点进行比较,若已经存在则说明已被遍历过,链表有环。 ②快慢指针:创建两个指针&am…

NIO流(多路复用技术)

目录 什么是NIO使用场景 NIO(new IO)相关包路径NIO的实现基础NIO的核心组件Buffer缓冲区详解数据如何从磁盘读到用户进程 ChannelChannel的使用 其他组件字符集和Charset文件锁NIO工具类使用Files的FileVisitor遍历文件和目录使用WatchService监控文件变化访问文件属性 什么是N…