STM32:Modbus通信协议核心解析:关键通信技术

news2025/5/30 20:43:25

知识点1【 Modbus通信】

1、Modbus的概述

Modbus是OSI模型第七层的应用层报文传输协议

协议:说明有组包和解包的过程

2、通信机制

Modelbus是一个请求/应答协议

通信机制:主机轮询,从机应答的机制。每个从设备有唯一的地址主设备通过地址指定通信对象

轮询:在通信或控制系统中,由主设备主动发送,周期性地向从设备发起请求并获取数据的机制。

特点

(1)系统中只有一个主机:主机通信

(2)系统中的从机不可以主动向主机发送数据

(3)系统上电后,所有的主从设备都应该处于监听总线的状态,也就是接收状态

(4)如果要发起一次通信,必须从主机的主动发起

通信流程

(1)主机首先切换成发送模式,发送数据包

(2)马上转成接收模式

3、Modbus报文格式

缩略语

报文介绍(重点

地址域:从设备的ID号 1Byte

功能码:执行的具体操作 1Byte

数据域:发送或者接收的有效数据 252Byte

差错校验:判断数据传输是否正确 2Byte

异常响应

这段话,中我们可以看到异常响应,那什么是异常响应,如何区分异常响应和正确响应呢?

异常响应概述

服务器(从设备)客户端(主设备) 返回的错误通知,用于指示请求无法撑场处理

异常响应的辨别

功能码为原功能码 + 0x80(即最高位置1),范围为128-255(十进制)

通信的架构图

(1)正确的响应

(2)错误的相应

知识点2【功能码】

功能码分为三类

1、公共功能码

2、用户定义功能码:

3、保留功能吗:

其中最常用的也就是公共功能码

常用功能码介绍

1、0x01:可读可写 按照bit操作

  • 请求格式

    从站地址 | 0x01 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC

  • 响应格式

    从站地址 | 0x01 | 数据字节数 | 线圈状态(按位打包) | CRC

  • 示例

    读取地址0x0000开始的5个线圈状态,返回值为0x15(二进制00010101,表示线圈0-4的状态为ON、OFF、ON、OFF、ON)。

2、0x02:只读 按照bit操作

  • 请求格式

    从站地址 | 0x02 | 起始地址高位 | 起始地址低位 | 输入数量高位 | 输入数量低位 | CRC

  • 响应格式

    从站地址 | 0x02 | 数据字节数 | 离散输入状态(按位打包) | CRC

  • 示例

    读取地址0x0002开始的3个离散输入,返回0x05(二进制00000101,表示输入2-4的状态为ON、OFF、ON)。

3、0x03:读保持寄存器,按照寄存器读取

  • 请求格式

    从站地址 | 0x03 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC

  • 响应格式

    从站地址 | 0x03 | 数据字节数 | 寄存器值(每寄存器2字节) | CRC

  • 示例

    读取地址0x000A开始的2个保持寄存器,返回值为0x00FF0x1234

4、0x06: 按照寄存器操作

  • 请求格式

    从站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 写入值高位 | 写入值低位 | CRC

  • 响应格式

    从站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 写入值高位 | 写入值低位 | CRC(与请求相同,表示操作成功)

  • 示例

    向地址0x0001写入值0xABCD,请求与响应报文一致。

5、0x16:写入多个寄存器

  • 请求格式

    从站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | 字节数 | 寄存器值列表(每值2字节) | CRC

  • 响应格式

    从站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC

  • 示例

    向地址0x0000写入两个寄存器值0x12340x5678,请求中包含字节数0x04和值列表。

注意

请求和响应部分 手册中的图如下,我这里来说一下分析时候的注意事项

无论是请求还是响应都是 PDU部分,即 功能码和数据 部分

并且Modbus是大端存储,我们存数据的时候先存入 高地址

知识点3【Modbus在数据链路层的实现】

1、请求方式

(1)单播模式

(2)广播模式

2、地址的规则

寻址地址共256个

主节点没有地址,每个子节点必须有一个地址

3、传输过程中的注意事项

(1)间隔时间

由于没有起始位和停止位,Modbus使用的是以3.5个字符作为 两个报文 之间的最短间隔时间。

(2)相邻字符最大间隔

同一帧数据中相邻字符间隔时间大于1.5个字符

上面的时间单位都是字符,哪一个字符是多久呢?请看下面介绍

(3)RTU模式每个字节(11位)格式

奇偶校验位 是可以没有的,收发端保持一致即可

是不是很熟悉,和串口一摸一样。

因为Modbus是应用层协议,而串口 是物理层和数据链路层 的标准,因此到达数据链路层,他们的格式都是一样的。

串口是一个广义概念,泛指异步串行通信接口。并不只局限于USART。RS485,RS232也都是串口。

因此这里的一个字符时间就是:

字符时间

以波特率9600为例

总结

  • 帧间空闲时间(Inter-Frame Delay)必须 ≥ 3.5个字符时间,以区分连续的数据帧。
  • 帧内字符间隔(Inter-Character Timeout)必须 ≤ 1.5个字符时间,否则视为帧结束。

4、RS485和Modbus 的关系

通信:硬件层,软件层组成

硬件层:

RS485——解决的是数据的传输问题,也就是如何将一个“0“或”1”传输到另外一端。

软件层:

Modbus——在硬件的基础上,解决数据传输的含义,传的数据代表什么。

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

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

相关文章

线程封装与互斥

目录 线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量有两种方法: 销毁互斥量 互斥量加锁和解锁 改进售票系统 互斥量实现原理探究 互斥量的封装 线程互斥 进程线程间的互斥相关背景概念 临界资源:多线程执行流共…

Spring AI 系列之一个很棒的 Spring AI 功能——Advisors

1. 概述 由AI驱动的应用程序已成为我们的现实。我们正在广泛地实现各种RAG应用程序、提示API,并利用大型语言模型(LLM)创建项目。借助 Spring AI,我们可以更快速地完成这些任务。 在本文中,我们将介绍一个非常有价值…

Vue3 + TypeScript + el-input 实现人民币金额的输入和显示

输入人民币金额的参数要求: 输入要求: 通过键盘,只允许输入负号、小数点、数字、退格键、删除键、方向左键、方向右键、Home键、End键、Tab键;负号只能在开头;只保留第一个小数点;替换全角输入的小数点&a…

2.1 C++之条件语句

学习目标: 理解程序的分支逻辑(根据不同条件执行不同代码)。掌握 if-else 和 switch 语句的用法。能编写简单的条件判断程序(如成绩评级、游戏选项等)。 1 条件语句的基本概念 什么是条件语句? 程序在执…

Linux `ls` 命令深度解析与高阶应用指南

Linux `ls` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似命令对比二、选项系统详解1. 常用基础选项2. 进阶筛选选项三、高阶应用技巧1. 组合过滤查询2. 格式化输出控制3. 元数据深度分析四、企业级应用场景1. 存储空间监控2. 安全审计3. 自动化运维五、特…

【MPC控制 - 从ACC到自动驾驶】5. 融会贯通:MPC在ACC中的优势总结与知识体系构建

【MPC控制 - 从ACC到自动驾驶】融会贯通:MPC在ACC中的优势总结与知识体系构建 在过去的四天里,我们一起经历了一段奇妙的旅程: Day 1: 我们认识了自适应巡航ACC这位“智能领航员”,并初见了模型预测控制MPC这位“深谋远虑的棋手…

初等数论--Garner‘s 算法

0. 介绍 主要通过混合积的表示来逐步求得同余方程的解。 对于同余方程 { x ≡ v 0 ( m o d m 0 ) x ≡ v 1 ( m o d m 1 ) ⋯ x ≡ v k − 1 ( m o d m k − 1 ) \begin{equation*} \begin{cases} x \equiv v_0 \quad (\ \bmod \ m_0)\\ x \equiv v_1 \quad (\ \bmod \ m_1)…

NV211NV212美光科技颗粒NV219NV220

NV211NV212美光科技颗粒NV219NV220 技术架构解析:从颗粒到存储系统 近期美光科技发布的NV211、NV212、NV219、NV220系列固态颗粒,凭借其技术突破引发行业关注。这些颗粒基于176层QLC堆叠工艺,单Die容量预计在2026年可达1Tb,相当…

SQL解析工具JSQLParser

目录 一、引言二、JSQLParser常见类2.1 Class Diagram2.2 Statement2.3 Expression2.4 Select2.5 Update2.6 Delete2.7 Insert2.8 PlainSelect2.9 SetOperationList2.10 ParenthesedSelect2.11 FromItem2.12 Table2.13 ParenthesedFromItem2.14 SelectItem2.15 BinaryExpressio…

Wave Terminal + Cpolar:SSH远程访问的跨平台实战+内网穿透配置全解析

文章目录 前言1. Wave Terminal安装2. 简单使用演示3. 连接本地Linux服务器3.1 Ubuntu系统安装ssh服务3.2 远程ssh连接Ubuntu 4. 安装内网穿透工具4.1 创建公网地址4.2 使用公网地址远程ssh连接 5. 配置固定公网地址 前言 各位开发者朋友,今天为您介绍一款颠覆性操…

html使用JS实现账号密码登录的简单案例

目录 案例需求 思路 错误案例及问题 修改思路 案例提供 所需要的组件 <input>标签&#xff0c;<button>标签&#xff0c;<script>标签 详情使用参考&#xff1a;HTML 教程 | 菜鸟教程 案例需求 编写一个程序&#xff0c;最多允许用户尝试登录 3 次。…

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

目录 数据概述一、输入数据与处理二、融合算法1. ESTARFM(Enhanced STARFM)2. ubESTARFM(Unbiased ESTARFM)代码实现数据下载参考根据论文《Generating daily 100 m resolution land surface temperature estimates continentally using an unbiased spatiotemporal fusion…

51c自动驾驶~合集55

我自己的原文哦~ https://blog.51cto.com/whaosoft/13935858 #Challenger 端到端碰撞率暴增&#xff01;清华&吉利,框架&#xff1a;低成本自动生成复杂对抗性驾驶场景~ 自动驾驶系统在对抗性场景&#xff08;Adversarial Scenarios&#xff09;中的可靠性是安全落…

【前端基础】Promise 详解

文章目录 什么是 Promise&#xff1f;为什么要使用 Promise&#xff1f;创建 Promise消费 Promise (使用 Promise)1. .then(onFulfilled, onRejected)2. .catch(onRejected)3. .finally(onFinally) Promise 链 (Promise Chaining)Promise 的静态方法1. Promise.resolve(value)2…

高性能管线式HTTP请求

高性能管线式HTTP请求:原理、实现与实践 目录 高性能管线式HTTP请求:原理、实现与实践 1. HTTP管线化的原理与优势 1.1 HTTP管线化的基本概念 关键特性: 1.2 管线化的优势 1.3 管线化的挑战 2. 高性能管线式HTTP请求的实现方案 2.1 技术选型与工具 2.2 Java实现:…

【CSS】九宫格布局

CSS Grid布局&#xff08;推荐&#xff09; 实现代码&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Python用Transformer、Prophet、RNN、LSTM、SARIMAX时间序列预测分析用电量、销售、交通事故数据

原文链接&#xff1a; tecdat.cn/?p42219 在数据驱动决策的时代&#xff0c;时间序列预测作为揭示数据时序规律的核心技术&#xff0c;已成为各行业解决预测需求的关键工具。从能源消耗趋势分析到公共安全事件预测&#xff0c;不同领域的数据特征对预测模型的适应性提出了差异…

java基础(面向对象进阶高级)泛型(API一)

认识泛型 泛型就等于一个标签(比如男厕所和女厕) 泛型类 只能加字符串&#xff1a; 把别人写好的东西&#xff0c;自己封装。 泛型接口 泛型方法、泛型通配符、上下限 怎么解决下面的问题&#xff1f; API object类 toString: equals: objects类 包装类 为什么上面的Integer爆红…

学习心得(17--18)Flask表单

一. 认识表单&#xff1a;定义表单类 password2中末端的EqualTo&#xff08;password&#xff09;是将密码2与密码1进行验证&#xff0c;看是否相同 二.使用表单&#xff1a; 运行 如果遇到这个报错&#xff0c;就在该页面去添加 下面是举例&#xff1a; 这就是在前端的展示效…

微信小程序进阶第2篇__事件类型_冒泡_非冒泡

在小程序中&#xff0c; 事件分为两种类型&#xff1a; 冒泡事件&#xff0c; 当一个组件上的事件被触发后&#xff0c;该事件会向父节点传递非冒泡事件&#xff0c; 当一个组件上的事件被触发后&#xff0c; 该事件不会向父节点传递。 一 冒泡事件 tap&#xff0c; touchst…