Modbus CRC和LRC算法研究及代码实现

2023-10-29

一、CRC(循环冗余校验)

1 CRC16实现流程
CRC16 计算算法
XOR = 异或
N = 字节的信息位
POLY = CRC16 多项式计算 = 1010 0000 0000 0001
(生成多项式 = 1 + x2 + x15 + x16)
在CRC16中,发送的第一个字节位低字节

2 CRC16实例推导
CRC16 实例推导
CRC16 实例推导
3 CRC16代码实现

unsigned short CRC16(unsigned char *auchMsg, unsigned short usDataLen)
{
	unsigned short ushCRC = 0xFFFF;
	char chLSB = 0;	//最低有效位

	while (usDataLen--)
	{
		ushCRC ^= *auchMsg++;

		for (int i = 0; i < 8; i++)
		{
			chLSB = (ushCRC & 0x1);	//在右移之前求进位
			ushCRC = ushCRC >> 1; 

			if (1 == chLSB)
			{
				ushCRC ^= 0xA001;
			}
		}
	}

	return ushCRC;
}

怀疑自己写得不好,若有其他更好的实现,请务必留言告诉我。

二、LRC(纵向冗余校验)

1 LRC原理
将报文中的所有字节相加,忽略任何进位,然后将累加值取反加1。

2 LRC代码实现

unsigned char LRC(unsigned char* auchMsg, unsigned short usDataLen)
{
	unsigned char uchLRC = 0;

	while (usDataLen--)
	{
		uchLRC += *auchMsg++;
	}

	return (~uchLRC) + 1;
}

怀疑自己写得不好,若有其他更好的实现,请务必留言告诉我。

三、验证

1 CRC在线计算工具
CRC在线计算工具
CRC在线计算工具
这里有个疑问。文档中建议的 POLY 值为 0xA001,而在线工具中的为 0x8005。代码是按照文档流程写的,但是测试结果与工具一致。
两者 POLY 值不一样啊,结果确一致。难道各自算法不同?

2 LRC在线计算工具
LRC在线计算工具
在这里插入图片描述

四、参考文档《Modbus协议中文版》

参考内容
2.5.1.2 CRC 校验 第55页
6.2.2 CRC 的生成 第81页
2.5.2.2 LRC 校验 第58页
6.2.1 LRC 的生成 第80页
及网上其他资料(大多不权威)

文档下载地址
Modbus协议中文版
文档没有编辑书签,建议阅读时逐一添加。
就像这样,是我自己编辑的,很简单。
书签
同时,文档中也有一些误导人的地方。请阅读时多思考,多验证。(毕竟是翻译文)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Modbus CRC和LRC算法研究及代码实现 的相关文章

  • C# Modbus Rtu实现

    Modbus Rtu的实现与Modbus Tcp的实现类似 C ModBus Tcp的学习及Master的实现 我们还是需要借用一个开源库NModbus4 在vs中 打开NuGet管理器 安装NModbus4 具体实现 具体实现与之前的Mo
  • STM32-modbus rtu 之主机程序

    一 STM32串口的发送与接收 考虑到modbus的使用场合大多为半双工而非全双工 所以 串口接收采用DMA 空闲中断 发送则直接发送 include serial h include string h serialbuf st seria
  • CRC的基本原理详解

    CRC Cyclic Redundancy Check 被广泛用于数据通信过程中的差错检测 具有很强的 检错能力 本文详细介绍了CRC的基本原理 并且按照解释通行的查表算法的由来的思路介绍 了各种具体的实现方法 1 差错检测 数据通信中 接
  • CRC16 ISO 13239 实施

    我正在尝试在 C 中实现 Crc16 我已经尝试了许多不同的实现 但大多数都给了我不同的值 这是我已经使用过的一些代码 private static int POLYNOMIAL 0x8408 private static int PRES
  • _mm_crc32_u64 定义不明确

    为什么世界上有 mm crc32 u64 像这样定义 unsigned int64 mm crc32 u64 unsigned int64 crc unsigned int64 v crc32 指令always累积 32 位 CRC nev
  • 检查 CRC 多项式的错误检测能力

    我试图找出如何计算任意 CRC 多项式的错误检测能力 我知道有多种错误检测功能可能 或可能不适用于 任意多项式 检测单个比特错误 所有 CRC 都可以执行此操作 因为这只需要 CRC 宽度 gt 1 突发错误检测 所有 CRC 都可以检测大
  • 如何使用Python计算这个CRC?

    我需要使用 Python 计算此 CRC 以便与 Aurora ABB 太阳能逆变器进行通信 这是文件 http www drhack it images PDF AuroraCommunicationProtocol 4 2 pdf在最后
  • 是否可以使用 CRC 进行基本的纠错?

    我知道使用 CRC 的全部目的是进行错误检测 但我听到有人说它除了错误检测之外还可以用于进行基本的错误纠正 我很好奇是否是这样 如果是的话 它的威力有多大 我的意思是 我们通常将 CRC 称为能够执行 x 位检测 但我很好奇它是否能够执行
  • 为对象图生成安全哈希码

    我正在从文件 xls csv xml 导入一些数据 这将产生一个复杂的内存中对象图 现在我需要知道该图自导出以来是否已被修改 检查这个的安全方法是什么 我想我会导出文件的哈希码 如果是这样的话生成对象哈希码的标准方法 https stack
  • CRC4 在 C 中的实现

    我修改了发现的实现here https stackoverflow com questions 28656471 how to confgure calculation of crc table 为 CRC4 构建表生成函数 如下所示 de
  • Python 中的 CRC16

    如何在Python中计算CRC16 在 Perl 中我会写这样的东西 use Digest CRC crc16 result crc16 str 我如何在Python中做同样的事情 这里有一个计算CRC16的库http pypi pytho
  • 如何在 C#.net 中计算文件的 CRC 值?

    我想在 C net 中使用 32 位算法计算文件的 CRC 值 Algorithm is straightforward rewritten from c class Crc32 public static uint CountCrc by
  • 需要 modbus Java 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要带有源代码的简单 modbus Java 库 我在谷歌上找到了 但有 jar 文件 并且没有强大的
  • 计算 CRC 初始值而不是将 CRC 附加到有效负载

    我实现的大部分 CRC 都是追加计算出的 CRC 值到消息 有效负载 并在所有字节 包括 之后在接收器处检查零结果 CRC 值通过 CRC 寄存器输入 显然这是一个相当标准的方法 现在我想使用不同的方法 根据有效负载计算一个值 使用该值作为
  • 计算 HDLC 帧的 FCS(CRC)

    我有以下框架 7e 01 00 00 01 00 18 ef 00 00 00 b5 20 c1 05 10 02 71 2e 1a c2 05 10 01 71 00 6e 87 02 00 01 42 71 2e 1a 01 96 27
  • 将两个原始值转换为 32 位 IEEE 浮点数

    我正在尝试通过 TCP modbus 解码来自 Shark 100 功率计的一些数据 我已经成功地拉下了我需要的寄存器 并从寄存器中留下了两个原始值 如下所示 17138 59381 从手册中 我知道我需要将这两个数字转换为32位IEEE浮
  • 带 Spring Boot 项目的 Modbus 脉冲线圈

    必须实施呼叫数字IO with Modbus协议 on 春季启动项目构建者Maven 它应该是在身体上有一定持续时间的脉冲呼叫 例如 5 秒等 以下是规范中的一个片段 关于响应和错误的更多信息 看来这个呼叫应用程序应该表现得像一个大师 在这
  • 将 CRC 值保存在文件中,而不更改实际的 CRC 校验和?

    我正在将我从自己的类中定义的一些对象保存到文件中 保存流数据 这一切都很好 但我希望能够在文件中存储该文件的 CRC 校验和 然后 每当我的应用程序尝试打开文件时 它都可以读取内部存储的 CRC 值 然后对实际文件进行检查 如果文件的 CR
  • 无法访问超过 255 个的 Modbus 寄存器 SimpleModbus

    我是法国学生 我已经使用 SimpleModbus 1 周了 它工作得很好 直到我尝试实现一个具有大量寄存器 1000needed 使用从站 1 无法访问超过 255 个的寄存器 无论我做什么 一旦寄存器读数超过 255 我就会收到超时错误
  • 二元除法问题:互联网上的坏例子或者我错过了什么?

    我想创建一个 16 位 CRC 实际上我已经完全准备好了 所以几个小时前我测试了它 但没有正常工作 但我发现互联网上的例子在涉及二进制除法时可能是错误的 我只链接其中两个 来自很多 http www ross net crc downloa

随机推荐

  • 图论----同构图(详解)

    图论当中的术语 假设G V E 和G1 V1 E1 是两个图 如果存在一个双射m V V1 使得对所有的x y V均有xy E等价于m x m y E1 则称G和G1是同构的 这样的一个映射m称之为一个同构 如果G G1 则称他为一个自同构
  • JS:各种遍历方式总结

    js的遍历方式真的是有很多 有用于遍历数组的 也有用于遍历对象的 各种方式有什么样的应用场景 如何选择恰当的遍历方式 很容易就让人迷糊 所以做一下总结吧 第一种 普通for循环 直接遍历出的是索引 注意每次遍历都需要获取一次arr的长度 f
  • c#运算符

    一运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号 C 有丰富的内置运算符 分类如下 1 算术运算符 下表显示了 C 支持的所有算术运算符 假设变量 A 的值为 10 变量 B 的值为 20 则 例如 假如A 21 B 10 i
  • 网址与域名的区别

    目录 一 网址与域名的区别 二 主域名与子域名 一 网址与域名的区别 以网址https www baidu com为例 网址由协议加域名组成所以协议是https 域名 www baidu com 区别 1 包含与被包含的关系 网址包含域名
  • 如何判断某个值更改就让按钮可用_【教程】 如何创建自己的 NFT? 这里有份教程, 请收下!...

    AtomicHub 提供了 NFT 创建工具 让任何人都可以创建自己的 NFT 非同质代币 喜欢 NFT 的小伙伴们 一起搞起来吧 除了 WAX 之外 目前 AtomicAssets 也支持了 EOS 区块链 所以 两条链上的朋友都可以参考
  • pandas的定义以及pandas的DataFrame的初步使用(二)

    补充 Series自动对齐 当多个series对象之间进行运算的时候 如果不同series之间具有不同的索引值 那么运算会自动对齐不同索引值的数据 如果某个series没有某个索引值 那么最终结果会赋值为NaN 示例 DataFrame对象
  • 计算机网络c类网络划分子网介绍,IP地址的子网划分详解

    原标题 IP地址的子网划分详解 来源 今日头条北京炫亿时代 一 子网划分基础 1 子网划分的若干个好处 减少网络流量 提高网络性能 简化管理 可以更为灵活的形成大覆盖范围的网络 2 你最好遵循以下步骤来进行子网划分 确认所需要的网络ID数
  • 文件分片上传demo

    知识点 File File 接口也继承了 Blob 接口的属性 File 接口没有定义任何方法 但是它从 Blob 接口继承了以下方法 Blob slice start end contentType new File 字符串数组 file
  • 【C语言】错题本(4)

    一 题目及选项 答案解析 知识点 字符型在内存中的数据存储 char类型数据在内存中的图示 unsigned char类型数据在内存中的图示 二 题目及选项 答案解析 A B C D 三 题目及选项 答案解析 数据在计算机中是先转换成补码
  • @ApiImplicitParam注解使用说明

    ApiImplicitParam注解使用说明 ApiImplicitParam是Swagger框架中的一个注解 用于描述请求参数的详细信息 它可以帮助开发人员生成API文档 并提供给用户更清晰的接口信息 以下是对 ApiImplicitPa
  • 别再乱写了,Controller 层代码这样写才足够规范!

    前言 本篇主要要介绍的就是controller层的处理 一个完整的后端请求由4部分组成 接口地址 也就是URL地址 请求方式 一般就是get set 当然还有put delete 请求数据 request 有head跟body 响应数据 r
  • Deep learning:四十一(Dropout简单理解)

    前言 训练神经网络模型时 如果训练样本较少 为了防止模型过拟合 Dropout可以作为一种trikc供选择 Dropout是hintion最近2年提出的 源于其文章Improving neural networks by preventin
  • 马哥:linux云计算从入门到精通笔记

    前言 Linux可安装在各种计算机硬件设备中 比如手机 平板电脑 路由器 视频游戏控制台 台式计算机 大型机和超级计算机 互联网Linux运维工作 以服务为中心 以稳定 安全 高效为三个基本点 确保公司的互联网业务能够7 24小时为用户提供
  • 密码复杂度(四选三)

    密码复杂度 四选三 数字 大写字母 小写字母 特殊字符 四种里边任选其三 0 9 lt gt A Z W a z W 0 9a z A Z0 9 0 9 lt gt a zA Z a zA Z0 9 lt gt 8 32
  • java 有序列表_Java 中的 List —— 有序序列

    List 在 java 中是个有序序列 一 容量 ArrayList 中有一个容量概念 表示基础数组的大小 无参时默认为 10 在需要的时候 比如 add操作 会自动增加其容量 LinkedList 没有这个概念 TreeMap 也有容量
  • SpringBoot忽略HTTPS请求的SSL证书

    报错如下 java security cert CertificateException No subject alternative names present 解决方案 1 创建SslUtil工具类 import java securi
  • FreeRTOS移植到STM32F103

    1 下载FreeRTOS源码 官网 FreeRTOS官网 下载第一个带有示例的 2 在基础工程文件中创建文件夹FreeRTOS 3 打开下载好的源码 将FreeRTOSv202212 01 FreeRTOS Source 里面的两个文件夹和
  • 软中断 简介

    前言 中断服务程序往往实在CPU关中断的条件下执行的 以避免中断嵌套而使控制复杂化 但是CPU关中断的时间不能太长 否则会丢失中断信号 因此Linux将中断服务程序分为 上半部 和 下半部 前者对时间要求比较严格 必须在中断请求发生后立即
  • linux底线模式,linux编辑命令vi

    vi vim 的使用 基本上 vi vim 共分为三种模式 分别是命令模式 Command mode 输入模式 Insert mode 和底线命令模式 Last line mode 命令模式 以vi打开一个文件就直接进入一般模式了 这是默认
  • Modbus CRC和LRC算法研究及代码实现

    一 CRC 循环冗余校验 1 CRC16实现流程 XOR 异或 N 字节的信息位 POLY CRC16 多项式计算 1010 0000 0000 0001 生成多项式 1 x2 x15 x16 在CRC16中 发送的第一个字节位低字节 2