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算法研究及代码实现 的相关文章

  • CRC原理介绍及STM32 CRC外设的使用

    1 CRC简介 循环冗余校验 英语 Cyclic redundancy check 简称CRC 由 W Wesley Peterson 于 1961 年首次提出的一种纠错码理论 CRC是一种数据纠错方法 主要应用于数据通信或者数据存储的场合
  • Modbus常用功能码协议详解

    Modbus常用功能码协议详解 01H 读线圈状态 1 描述 读从机线圈寄存器 位操作 可读单个或者多个 2 发送指令 假设从机地址位0x01 寄存器开始地址0x0023 寄存器结束抵制0x0038 总共读取21个线圈 协议图如下 3 响应
  • LRC算法的Java实现

    项目中要用到 本来想拿来主义 结果没有找到合适的 所有自己写了一个 LRC具体算法如下 1 对需要校验的数据 2n个字符 两两组成一个16进制的数值求和 2 将模值按位取反 3 加1 Java代码实现 输入byte data 返回LRC校验
  • CRC算法并行运算Verilog实现

    因为CRC循环冗余校验码的算法和硬件电路结构比较简单 所以CRC是一种在工程中常用的数据校验方法 尽管CRC简单 但在工程应用中还是有些问题会对工程师产生困惑 这篇文章将介绍一下CRC 希望对大家有所帮助 一 CRC算法介绍 CRC校验原理
  • C语言中协程(coroutine)实现

    C语言协程库实现说明 代码实现 1 当前支持的功能概览 1 1 创建任意数量协程并在协程中yield include
  • 【Modbus】 RTU CRC校验码计算方法

    Modbus是美国Modicon公司 即现在的Schneider Electric公司 于1979年开发的一种通信协议 其目的是采用一根双绞线实现多个设备之间的通信 Modbus 协议采用问答式的通信方式 具有简单 硬件便宜 通用性强 使用
  • STM32菜鸟成长记录——移植FreeModbusRTU

    本文章用于记录学习RS485及配置Modbus协议 参考博文 FreeModbus移植文章1 FreeModbus移植文章2
  • modbus总线协议(一)modbus rtu

    一 介绍 Modbus协议由Modicon公司开发出来 现在Modbus是工业领域全球最流行的协议 硬件支持RS 232 RS 422 RS 485和以太网设备 应用在PLC DCS 智能仪表等工控领域 图片来源于网络 二 modbus协议
  • CRC校验关键点说明(内附C语言CRC校验库)

    文章目录 目的 CRC校验关键点 参数模型 计算方式 CRC校验库 源文件 使用测试 总结 目的 CRC即循环冗余校验码 Cyclic Redundancy Check 是数据通信领域中最常用的一种查错校验码 其特征是信息字段和校验字段的长
  • CRC16 校验和:HCS08 与 Kermit 与 XMODEM

    我正在尝试将 CRC16 错误检测添加到 Motorola HCS08 微控制器应用程序 但我的校验和不匹配 一在线CRC计算器提供了我在 PC 程序中看到的结果和我在微型计算机上看到的结果 它将微处理器的结果称为 XModem 将 PC
  • XAPK 文件验证显示正确的数据信息

    在运行 APK 扩展文件示例时 我只是跳过了检查 CRC32 以避免 crc bug 算法 并且它工作得非常好 但是 虽然 XAPK 文件验证显示正确的下载数据信息为 99 如何避免这种情况并通过硬编码查看完整的 100 这不是最好的解决方
  • 什么是“必须处理用户手势才能显示权限请求”。 Chrome Web Serial API 中出现错误消息?

    在编程方面 我是一个真正的初学者 我的目的是通过 COM 端口 RS485 控制具有 Google Chrome 中集成的 API 的设备 我尝试重现以下教程 https web dev serial 控制台中出现以下错误消息 未捕获 承诺
  • CRC-CCITT 到 CRC16 Modbus 实施

    我在使用 PHP 生成 modbus CRC16 代码时遇到很多麻烦 我在互联网上找到了很多不同的代码 但我尝试过它们 但由于某种原因我没有得到正确的结果 我找到了用于生成 CRC16 CCITT 的 PHP 代码 我已经将查找表更改为mo
  • 验证 CRC 校验和是否为零

    我过去接触过 CRC 16 校验和 习惯于通过对我要验证的文件重新计算 CRC 16 校验和 加上 CRC 16 本身的 2 个字节来验证它 如果结果为零 则文件完整性有效 否则无效 这可以非常有效地编码 就像下面的伪 C 一样 if re
  • 计算 Modbus RTU CRC 16

    我正在实现一个软件 可以通过串行方式读取和写入 Modbus RTU 协议中的数据 为此 我需要计算字节字符串末尾的两个 CRC 字节 但我无法执行此操作 在网上搜索 我发现两个函数似乎可以正确计算 CRC WORD CRC16 const
  • 计算 CRC 初始值而不是将 CRC 附加到有效负载

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

    我正在尝试写一个PCLMULQDQ 优化的 CRC 32 https www intel com content dam www public us en documents white papers fast crc computatio
  • 棘手的 CRC 算法

    我正在尝试找到适用于以下结果的 crc 字节串由 2 个字节组成 即 0xCE1E crc 是单个字节 即 0x03 byte crc CE1E 03 CE20 45 CE22 6F 0000 C0 0001 D4 FFFF 95 有人可以
  • ruby: `read': File.read 处的参数无效 -(Errno::EINVAL)

    我正在做一个简单的脚本来检查所有文件的 crc require zlib exit if Object const defined Ocra files Dir glob File open dir txt a do file file p
  • CRC 16 程序计算校验和

    我目前正在编写一个 CRC16 程序 它使用 CRC 16 多项式计算字符的 CRCX 16 X 15 X 2 1 程序应从标准输入读取数据并以十六进制输出 16 位 CRC 尽管如此 当我执行该程序时 我得到了错误的输出值 这是我的代码

随机推荐

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

    图论当中的术语 假设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