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

2024-05-27 12:52

本文主要是介绍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校验有其局限性,但在多数工业应用场景中,它仍然是一种非常有效的解决方案。

这篇关于CRC校验(循环冗余校验 Cyclic Redundancy Check)(以Modbus通信为例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007536

相关文章

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去