Modbus协议详解3:数据帧格式 - RTU帧 ASCII帧的区别
Modbus既然是一种通信协议,那它就应该有规定的通信格式用于在设备之间的指令接收与识别。
本文就着重讲讲Modbus协议的RTU帧和ASCII帧。
Modbus帧在串行链路上的格式如下:

在上图的格式中:
1)地址域:指代的是子节点地址。合法的子节点地址为 0 – 247。 每个子设备被赋予 1 – 247 范围中的地址。主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时, 它将自己的地
址放到应答报文的地址域以让主节点知道哪个子节点在回答。
2)功能码:指明服务器要执行的动作。
3)数据域:功能码后面的有表示含有请求和响应参数的数据。
4)错误检验:是对报文内容执行 "冗余校验" 的计算结果。根据不同的传输模式 (RTU or ASCII)使用两种不同的计算方法。
上面说明了Modbus的帧格式,是一种规定的数据打包的规约。
Modbus中有两种串行传输模式: RTU 模式 和 ASCII 模式。它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。
所有设备必须现 必须实现 RTU 模式,ASCII 模式是备选项。
1、Modbus RTU帧模式
RTU帧指的是什么呢?简单而言就是报文中的每个字节都是用十六进制表示的。
RTU帧中的每个字节数据的格式定义如下:
每个字节为8bit
报文中每个 8 位字节含有两个 4 位十六进制字符(0–9, A–F)Bits per Byte:
1 起始位
8 数据位,首先发送最低有效位
1 位作为奇偶校验
1 停止位注 : 使用无校验要求 2 个停止位。
字符的传送流是LSB先发送,最后才是MSB,如下: 有奇偶校验的:

无奇偶校验的:

重点来了,RTU的报文帧格式: 
Modbus RTU帧的最大长度为256个字节。
2、Modbus ASCII帧模式
Modbus ASCII帧中规定报文的每个字节数据以两个ASCII字符进行发送。
怎么理解呢?
例 : 有一个数据字节为 0X5B,它会被编码为两个字符 : 0x35 和 0x42 (ASCII 编码 0x35 ="5", 0x42 ="B" )。
ASCII 模式节每个字节 (10 位 ) 为的格式为 :
报文中每个 ASCII 字符含有 1 个十六进制字符
Bits per Byte:
1 起始位
7 数据位, 首先发送最低有效位
1 位作为奇偶校验
1 停止位注 : 使用无校验要求 2 个停止位。
字符是如何串行传送的: 有奇偶校验的:

无奇偶校验的:

Modbus ASCII的报文帧格式:

ASCII报文帧与RTU报文帧有很大的不同,ASCII报文帧中是带有开头和结束标识符的,这对设备接收报文帧很方便。设备可以很方便的知道一个新报文帧的开头,并且知道报文什么时候结束了。
RTU报文帧中并没有这样的标识符,所以在接收报文帧的时候就需要做些处理,方能判断报文是否完成了一帧数据的接收。
ASCII报文帧中用冒号(:)(ASCII的十六进制为0x3A)作为起始,用回车换行(CR LF)(ASCII的十六进制为0x0D 0x0A)作为结束。
由于ASCII模式下每个字符字节需要用两个字符编码,所以为了确保 ASCII 模式 和 RTU 模式在 Modbus 应用级兼容,ASCII数据域最大数据长度为 (2x252) 是 RTU 数据域 (252) 的两倍。因此,ModbusASCII 帧的最大尺寸为 513 个字符。
3、RTU帧与ASCII帧的传输区别
前面已经分析了RTU报文帧和ASCII报文帧的区别,RTU报文帧是不带开始和结束标识符的,而ASCII报文帧中带有开始和结束标识符。所以在设备接收RTU帧和ASCII帧的时候处理方式就会有所不同。
(1)RTU帧的报文传输
现在思考一个问题:RTU帧中因为没有开始和结束的标识符,设备要怎么知道已经接收完成了一帧报文了呢?
为了能够确认报文被完整接收,不至于接收到不完整的报文就进行报文解析和处理,所以必须要想办法去确认一帧报文已经完成接收,然后再去处理。
在RTU模式中,为了标识不同的报文帧,在报文帧之间插入一个空闲时间间隔,在两帧报文之间用至少3.5个字符的空闲时间来区分不同的帧,同时标识一帧是否已经完成接收。这个时间也称为t3.5时间间隔。
这样的操作方式看下图进行理解:

如果前面开始了一次报文帧的传输,接收设备从空闲状态中被唤起,就需要多接收进行一个超时计时机制,用以确认报文帧是否已经接收完成。就如上图中的帧1和帧2之间如果间隔的时间等于或者超过了t3.5所设定的空闲等待时间,就可以认为前面的帧1已经接收完成,后面再过来的数据就属于帧2的数据。
在RTU帧中还有一个讲究的地方:因为报文帧本质是用字符流进行发送的,所谓为了区分不同的报文帧就需要用到t3.5的字符间隔。但是报文帧中的每个字符要怎么确认是连续的呢?
所以为了确认字符流的发送连续,就要使用到t1.5字符时间。看下图理解:

从上图中可以清晰看到:如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。小于或者等于1.5个字符的时间则认为正常。
上面说的t1.5和t3.5这两个时间,其实并不是一定应用的。为什么呢?
因为时间项目应用中,很多时候多报文帧的接收都会涉及到中断,特别是在通信速率很高的情况下,会频繁的快速中断,对cpu的负担是很重的,这个时候这t1.5和t3.5的时间就会变得很短暂,并不是很好处理。
所以,t1.5和t3.5这两个时间一般是在通信速率在19200Bps或以下的时候才需要去严格约定。
(2)ASCII帧的报文传输
由于ASCII报文帧与RTU报文帧有着很大的不同,ASCII报文帧是有起始和结束标识符的,而RTU帧没有这样的标识。所以ASCII报文帧的接收就简单方便多了,也不需要什么t3.5的帧间隔时间。
但是呢,为了保证接收的报文帧连续,还是可以约定字符间的传输时间的。一般认为,报文中的字符时间间隔可以达到一秒,如果超过了这个时间间隔,就认为发生了错误,要废弃掉这一帧报文数据,重新开始接收。
4、RTU帧和ASCII帧的传输状态分析
(1)RTU帧的传输状态:

上面状态图可以获取的信息:
1)从 "初始" 态到 “空闲” 态转换需要 t 3.5 定时超时,用以保证帧间延迟。
2)“空闲” 态是没有发送和接收报文要处理的正常状态。
3)在 RTU 模式, 当没有活动的传输的时间间隔达 3.5 个字符长时,通信链路被认为在 “空闲”态。
4)当链路空闲时, 在链路上检测到的任何传输的字符被识别为 帧起始。 链路变为 "活动" 状态。然后, 当链路上没有字符传输的时间间个达到 t3.5 后,被识别为 帧结束。
5)检测到帧结束后,完成 CRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。这样,CRC 计算只需要在帧寻址到该节点 (包括广播帧) 时进行。
(2)ASCII帧的传输状态

上面状态图可以得到的信息:
1)“空闲” 态是没有发送和接收报文要处理的正常状态。
2)每次接收到 ":" 字符表示新的报文的开始。如果在一个报文的接收过程中收到该字符,则当前地报文被认为不完整并被丢弃。而一个新的接收缓冲区被重新分配。
3)检测到帧结束后,完成 LRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。

相关文章:
Modbus协议详解3:数据帧格式 - RTU帧 ASCII帧的区别
Modbus既然是一种通信协议,那它就应该有规定的通信格式用于在设备之间的指令接收与识别。 本文就着重讲讲Modbus协议的RTU帧和ASCII帧。 Modbus帧在串行链路上的格式如下: 在上图的格式中: 1)地址域:指代的是子节点地址…...
认识数据分析
文章目录 1. 认识数据分析1.1 数据自身的三大属性1.2 建数仓 数据分析的工程技术1.3 数据分析解决问题的原理1.4 数据分析的具体流程1.5 数据的中心化和智能化1.6 数据分析的四种类型和六个方向 1. 认识数据分析 1.1 数据自身的三大属性 客观:用数字衡量和表现一件…...
Learn Prompt-ChatGPT 精选案例:写作博客
在 ChatGPT 的帮助下,文本内容的产出,尤其是撰写博客文章的过程得到了进一步的简化。你可以让 ChatGPT 激发你的灵感,也可以让它美化你的文章内容。 这里我们希望能通过prompt写出一篇以“ChatGPT对社会各行各业的影响”为主题的博客。 本页…...
《确保安全:PostgreSQL安全配置与最佳实践》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...
Unity中Shader抓取屏幕并实现扭曲效果
文章目录 前言一、屏幕抓取,在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路:1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处,传入一个 float2 uv : TEXCOORD,用于之后对扭曲贴图进行采样3、…...
深浅拷贝详解
深浅拷贝 经典真题 深拷贝和浅拷贝的区别?如何实现 深拷贝和浅拷贝概念 首先,我们需要明确深拷贝和浅拷贝的概念。 浅拷贝:只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷…...
@Scheduled 定时任务
Scheduled(cron"30 * * * * ?") 1.cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 2.cron表达式各占位符解释: {秒数}{分钟} > 允许值范围: 0~59 ,不允许为空值,若值不合法,调度器将…...
丙烯酸共聚聚氯乙烯树脂
声明 本文是学习GB-T 42790-2023 丙烯酸共聚聚氯乙烯树脂. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了丙烯酸共聚聚氯乙烯树脂的外观、物化性能等技术要求,描述了相应的采样、试验方 法、检验规则、标志、包装、…...
Navicat导入Excel数据顺序变了
项目场景: Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中。但是,在导入的过程中,我们常会发现数据顺序出现了问题,导致数据错位,给数据的处理带来了极大的麻烦。 原因分析: 这个问题的…...
uni-app的生命周期
uni-app的生命周期包括应用生命周期和页面生命周期。 应用生命周期涵盖了整个uni-app应用的启动、运行和销毁过程,主要包括以下几个生命周期函数: onLaunch:应用初始化时触发,只触发一次。onShow:应用启动或从后台进…...
Vulnhub实战-DC9
前言 本次的实验靶场是Vulnhub上面的DC-9,其中的渗透测试过程比较多,最终的目的是要找到其中的flag。 一、信息收集 对目标网络进行扫描 arp-scan -l 对目标进行端口扫描 nmap -sC -sV -oA dc-9 192.168.1.131 扫描出目标开放了22和80两个端口&a…...
软件设计模式系列之七——原型模式
1 模式的定义 原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新…...
PMP考试注意事项有哪些?
1. PMI明确规定:不允许考生使用自带文具,包括自带的笔、削笔刀、橡皮、笔袋、计算器和草稿纸等。 2. 本次考试考场内为每位考生配备2B铅笔、橡皮、计算器(若有需要)和草稿纸。如文具有缺损或考试过程中如需更换铅芯等,请向监考老师举手示意。…...
chartgpt+midjourney
chatGPT程序化生成故事 英文版脚本步骤 步骤一:在chatgpt中输入以下脚本,,标红为可变的文字,输入你想要的,目前是科幻,即科幻故事,你可以改为 fairy-tale,则写的是童话故事&#x…...
【SpringMVC】自定义注解
【SpringMVC】自定义注解 前言1. 什么是注解?2. 注解的用处3. 注解的原理1.1. Override1.2. SuppressWarnings 2. JDK元注解2.1. Retention2.2. Target2.3. Inherited2.4. Documented 3. 自定义注解3.1. 自定义注解的分类注解类 结语 自定义注解及其应用 前言 在J…...
【李沐深度学习笔记】数据操作实现
课程地址 数据操作实现p2 数据操作 首先导入PyTorch包(import torch),虽然叫PyTorch,但实际上要导入torch。 import torch张量 张量表示的是一个数值组成的数组,这个数组可以有很多个维度。 # 生成0-11的顺序序列构成的一维…...
【深度学习-注意力机制attention 在seq2seq中应用】
注意力机制 为什么需要注意力机制attention机制的架构总体设计一、attention本身实现评分函数 attention在网络模型的应用-Bahdanau 注意力加性注意力代码实现 为什么需要注意力机制 这是一个普通的seq2seq结构,用以实现机器对话,Encoder需要把一个输入的…...
详解混合类型文件(Polyglot文件)的应用生成与检测
1. 引入 混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。 比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件&…...
QT之QTableView的简介
QT之QTableView的简介 QTableView 是 Qt 框架中的一个类,用于显示和编辑表格数据。它提供了一个灵活的模型/视图架构,允许用户以不同的方式显示和编辑数据。 以下是 QTableView 的一些常用函数及其用法: 1)QTableView(QWidget *pa…...
学习记忆——宫殿篇——记忆宫殿——记忆桩——知识讲解
类比 假设这些桩子好比不同的交通工具,每一种交通工具都可以助我们到达目的地,那举现在就根据你的时间以及现实情况,选择最合适自己的交通工具即可,重点在于你要熟悉每种交通工具的用途不区别。桩子也是如此,把所有的桩…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
