【MODBUS】搞懂 Modbus RTU/TCP 与 FreeModbus
搞懂 Modbus RTU 与 FreeModbus
在工业嵌入式通信领域,Modbus RTU 和 FreeModbus 是最常用的组合方案,很多新手容易混淆两者的概念、用途及使用要点,今天就用大白话+干货,一次性讲明白,适合刚接触工控通信的小伙伴参考。
一、核心概念:FreeModbus 是什么?
FreeModbus 是嵌入式领域主流的 开源、轻量级、跨平台 Modbus 协议栈,完全遵循 Modbus 标准,支持 RTU/ASCII/TCP 三种传输模式,可在裸机或 RTOS 上快速移植,无需授权费,是工业通信的成熟开源方案。
FreeModbus 核心优势
-
开源免费:遵循 BSD 许可证,可商用、可修改,无任何授权成本;
-
轻量高效:代码精简,适配 STM32、51 单片机等资源受限的 MCU;
-
高度可移植:采用分层架构(协议层+移植层),只需适配串口、定时器等底层接口即可使用;
-
功能完整:支持 Modbus 全核心功能,涵盖主站、从站模式,以及异常处理和错误码机制。
二、重点解析:Modbus RTU 是什么?
很多人会把 RTU 和 FreeModbus 搞混,其实 RTU 是 Modbus 协议的一种传输模式,也是工业现场最常用的模式,核心是“用二进制/十六进制直接传输数据”,高效且抗干扰。
1. RTU 核心特点(大白话版)
-
通信架构:主从模式(只有主站能发起请求,从站被动响应);
-
物理层:主要用 RS485(工业首选,差分信号抗干扰强,最远可传 1200m),也支持 RS232(短距离点对点);
-
数据格式:直接传输二进制/十六进制字节,不转成 ASCII 字符,紧凑高效、省流量;
-
关键校验:采用 CRC16 校验,保证数据传输的完整性;
-
帧间隔:帧内字符间隔<1.5 字符时间,帧间间隔≥3.5 字符时间(用来识别帧的边界,很关键)。
2. RTU 标准通信参数(必须全网一致)
所有设备通信前,必须统一以下参数,否则无法正常通信:
-
波特率:常用 9600 bps(默认),也可选择 4800/19200/38400/115200;
-
数据位:固定 8 位;
-
校验位:偶校验(Even)、奇校验(Odd)或无校验(None);
-
标准配置:9600 8 E 1(9600 波特、8 数据位、偶校验、1 停止位)。
3. RTU 帧结构(核心,必看)
完整的 RTU 帧由 5 部分组成,总长度≥4 字节,格式如下:
| 字段 | 长度 | 说明 |
|---|---|---|
| 从站地址 | 1 字节 | 目标设备地址,范围 1–247(0 为广播地址,从站不响应) |
| 功能码 | 1 字节 | 操作类型(读/写寄存器等) |
| 数据区 | N 字节 | 寄存器地址、数量、写入值等具体业务数据 |
| CRC 校验 | 2 字节 | 低字节在前,高字节在后,用于校验数据完整性 |
4. RTU 常用功能码(最实用,记这几个就够)
| 功能码 | 功能 | 对应寄存器 | 典型用途 |
|---|---|---|---|
| 0x01 | 读线圈 | 0xxxx | 读开关量输出(如继电器、LED) |
| 0x02 | 读离散输入 | 1xxxx | 读开关量输入(如按钮、传感器) |
| 0x03 | 读保持寄存器 | 4xxxx | 读参数、模拟量输出(最常用) |
| 0x04 | 读输入寄存器 | 3xxxx | 读模拟量输入、传感器数据 |
| 0x06 | 写单个保持寄存器 | 4xxxx | 配置单个设备参数 |
| 0x10 | 写多个保持寄存器 | 4xxxx | 批量配置设备参数 |
三、FreeModbus 支持的三种传输模式(含RTU、TCP、ASCII)
很多新手会混淆 FreeModbus 与 Modbus 各传输模式的关系,核心结论:FreeModbus 是实现 Modbus 协议的开源工具(协议栈),而 RTU、TCP、ASCII 是它支持的三种不同传输模式,可根据实际场景灵活选择。
三种模式的核心区别的如下,重点掌握 RTU(工业常用)和 TCP(远程组网常用):
| 传输模式 | 核心传输载体 | 核心特点 | 适用场景 |
|---|---|---|---|
| Modbus RTU | 串口(UART/RS485/RS232) | 二进制/十六进制传输,CRC16校验,帧间隔3.5字符,高效抗干扰 | 工业现场近距离设备通信(最常用) |
| Modbus TCP | 以太网(TCP/IP协议) | 基于MBAP报文头,无CRC校验(依赖TCP层可靠传输),传输速率高 | 远程、高速、多节点组网(如跨区域监控) |
| Modbus ASCII | 串口(UART/RS485/RS232) | ASCII字符传输,LRC校验,调试直观,效率低、冗余大 | 调试场景(工业现场极少使用) |
| 在FreeModbus中,只需修改初始化代码的模式参数,即可切换三种传输模式,代码示例如下: |
// 1. 初始化 RTU 模式(工业常用)
eMBErrorCode eStatus_RTU = eMBInit(MB_RTU, 0x01, MB_PORT_1, 9600, MB_PAR_EVEN);
// 2. 初始化 TCP 模式(远程组网常用)
eMBErrorCode eStatus_TCP = eMBInit(MB_TCP, 0x01, MB_PORT_1, 9600, MB_PAR_EVEN);
// 3. 初始化 ASCII 模式(调试用)
eMBErrorCode eStatus_ASCII = eMBInit(MB_ASCII, 0x01, MB_PORT_1, 9600, MB_PAR_EVEN);
补充说明:Modbus TCP 无需关注帧间隔和CRC校验,核心依赖以太网的TCP/IP协议保证传输可靠,其报文结构比RTU多了MBAP报文头(用于标识TCP通信的设备和报文信息),其余数据部分与RTU格式一致,降低了开发难度。
简单来说:FreeModbus 是实现 Modbus 协议的工具(协议栈),而 RTU 是 FreeModbus 支持的一种传输模式。
FreeModbus 不仅支持 RTU 模式,还支持 ASCII(调试友好但效率低)和 TCP(以太网传输,适合远程高速组网)两种模式,在代码中只需简单配置,即可切换模式:
// 代码示例:初始化 FreeModbus,选择 RTU 模式
eMBErrorCode eStatus = eMBInit(MB_RTU, 0x01, MB_PORT_1, 9600, MB_PAR_EVEN);
四、RTU 与 ASCII 模式对比(快速区分)
| 特性 | Modbus RTU | Modbus ASCII |
|---|---|---|
| 编码格式 | 二进制/十六进制 | ASCII 字符 |
| 传输效率 | 高(数据紧凑,无冗余) | 低(字符冗余,占用带宽) |
| 校验方式 | CRC16 | LRC |
| 帧边界识别 | 3.5 字符间隔 | 冒号(:)开头、回车换行结尾 |
| 调试难度 | 稍难(需解析十六进制) | 直观(可读字符,易调试) |
| 工业应用 | 主流首选 | 极少使用 |
五、总结(小白必记)
-
FreeModbus:开源免费的 Modbus 协议栈,支持 RTU(串口)、TCP(以太网)、ASCII(调试)三种模式,嵌入式工控通信首选;
-
Modbus RTU:串口传输模式,十六进制/二进制格式,高效抗干扰,工业现场最常用;
-
Modbus TCP:以太网传输模式,基于TCP/IP,速率高、适合远程组网,无需CRC校验;
-
核心区别:RTU、TCP、ASCII是“传输方式”,FreeModbus是“实现协议的工具”,可根据场景灵活切换模式。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)