外观
Modbus RTU 示例
2025-10-29
概述
本示例演示如何在 RC3506 开发板上实现 Modbus RTU 主机功能,通过 RS485 接口与 Modbus 从机设备(或上位机模拟从机)进行通信,实现寄存器读写操作,帮助用户掌握 Modbus RTU 通信协议的基本应用。
Modbus RTU 通信
Modbus RTU 是 Modbus 协议的二进制传输模式,采用主从式架构,由主机发起指令、从机响应,支持一对多通信,常用于工业自动化设备互联。 抗干扰能力强,数据格式包含从机地址、功能码、数据区及 CRC 校验码,通过功能码实现寄存器 / 线圈读写,典型应用于智能仪表、变频器等设备的数据交互,主机可借此高效读取从机状态或修改参数,并通过 CRC 校验确保传输准确性。
Modbus RTU 主机寄存器读写与数据一致性验证实验
本示例将使用 Modbus RTU 传输模式与 Modbus slave 上位机软件建立通信,由主机向从机寄存器 0、1、2 写入指定数据,并验证从机接收数据与主机发送数据的一致性。
硬件连接
- 首先连接开发板与 USB 转 RS485 工具

创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心示例代码
applications/modbus_rtu_master_example.c
static int modbus_rtu_master_example(void)
{
modbus_t *ctx;
uint16_t tab_reg[10];
int rc;
int i;
// 初始化 Modbus RTU 通信上下文
ctx = modbus_new_rtu("/dev/uart5", 115200, 'N', 8, 1);
if (ctx == NULL)
{
rt_kprintf("Unable to create the libmodbus context\n");
return -1;
}
// 配置从站地址
modbus_set_slave(ctx, 1);
// 配置响应超时
modbus_set_response_timeout(ctx, 1, 0);
// 配置 RS485 模式
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
// 配置 RTS 引脚方向
modbus_rtu_set_rts(ctx, RS485_RTS_PIN, MODBUS_RTU_RTS_UP);
// 打开串口并连接从站设备
if (modbus_connect(ctx) == -1)
{
rt_kprintf("Connection failed\n");
modbus_free(ctx);
return -1;
}
// 读取从站地址 0 开始的 10 个寄存器值
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1)
{
rt_kprintf("Failed to read registers\n");
modbus_close(ctx);
modbus_free(ctx);
return -1;
}
// 遍历打印读取到的寄存器值
rt_kprintf("Read %d registers:\n", rc);
for (i = 0; i < rc; i++)
{
rt_kprintf("Register %d: %d\n", i, tab_reg[i]);
}
// 向从站地址 0 开始的 3 个寄存器写入值
int write_start_address = 0;
uint16_t write_values[3] = {100, 200, 300};
rc = modbus_write_registers(ctx, write_start_address, 3, write_values);
if (rc == -1)
{
rt_kprintf("Failed to write multiple registers\n");
}
else
{
rt_kprintf("Successfully wrote multiple registers starting at address %d\n", write_start_address);
}
// 再次读取寄存器验证写入效果
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1)
{
rt_kprintf("Failed to read registers after write\n");
}
else
{
rt_kprintf("Registers after write:\n");
for (i = 0; i < rc; i++)
{
rt_kprintf("Register %d: %d\n", i, tab_reg[i]);
}
}
// 关闭连接
modbus_close(ctx);
// 释放上下文资源
modbus_free(ctx);
return 0;
}运行示例
操作步骤:
准备硬件连接:将开发板与 USB 转 RS485 工具正确连接
配置 Modbus Slave 上位机软件:
- 点击 Connection —> Connect 进行连接设置
- 点击 Setup —> Slave Definition 配置从机属性


将程序下载到开发板
打开串口终端连接开发板
输入
modbus_rtu_master_example命令
预期结果:
- 开发板成功初始化 Modbus RTU 主机
- 成功读取从机寄存器的初始值
- 向从机写入指定数据(100, 200, 300)
- 再次读取验证写入结果
- Modbus Slave 软件界面显示寄存器状态更新

