目录
- 一、前言
- [二、主机核心任务:LibmodbusClientTask 实现](#二、主机核心任务:LibmodbusClientTask 实现)
- [三、功能验证:寄存器读写与 LCD 显示实操](#三、功能验证:寄存器读写与 LCD 显示实操)
- 四、总结
- 五、结尾
一、前言
在上一篇笔记中,我们完成了 STM32 开发板作为 Modbus 从机、与 PC 端 Modbus Poll 主站软件的 USB 串口通信验证。本次实验将角色互换,把 STM32 开发板作为 Modbus 主机,通过 USB 串口与 PC 端 Modbus Slave 从机软件建立通信,实现寄存器读写、数据累加处理与 LCD 显示的核心功能,完整验证 libmodbus 主机侧逻辑在 STM32+USB 串口环境下的可行性。
二、主机核心任务:LibmodbusClientTask 实现
STM32 作为 Modbus 主机的核心逻辑封装在LibmodbusClientTask FreeRTOS 任务函数中,代码基于上一篇从机实验的工程精简而来,去除了从机特有的请求接收、响应逻辑,聚焦主机侧的寄存器读写与数据处理,完整代码及注释如下:
c
static void LibmodbusClientTask( void *pvParameters )
{
modbus_t *ctx; // Modbus主机上下文
int rc; // 函数返回值,判断读写操作是否成功
uint16_t val; // 存储寄存器读写的数值
int nb = 1; // 单次读写的寄存器数量(本次为1个)
// 创建STM32 USB串口版RTU上下文:指定USB设备、波特率115200、无校验、8数据位、1停止位
ctx = modbus_new_st_rtu("usb", 115200, 'N', 8, 1);
// 设置目标从机地址(对应PC端Modbus Slave的从机地址1)
modbus_set_slave(ctx, 1);
// 建立USB串口与Modbus从机的连接
rc = modbus_connect(ctx);
if (rc == -1) {
//fprintf(stderr, "Unable to connect %s\n", modbus_strerror(errno));
modbus_free(ctx);
vTaskDelete(NULL);; // 连接失败则删除任务
}
// 无限循环执行主机读写操作
for (;;) {
/* read hoding register 1 */
// 读取从机保持寄存器1的值,存储至val变量
rc = modbus_read_registers(ctx, 1, nb, &val);
if (rc != nb)
continue; // 读取失败则跳过本次循环,重新读取
/* display on lcd */
// 将读取到的寄存器值显示在开发板LCD屏幕上
Draw_Number(0, 0, val, 0xff0000);
/* val ++ */
// 对读取到的数值执行累加操作
val++;
/* write val to hoding register 2 */
// 将累加后的值写入从机保持寄存器2
rc = modbus_write_registers(ctx, 2, nb, &val);
}
/* For RTU */
// 释放资源(实际循环不会执行到此处,仅作资源释放示范)
modbus_close(ctx);
modbus_free(ctx);
vTaskDelete(NULL);
}
补充:主机任务代码相比从机大幅精简,核心是去除了从机的请求接收、响应解析逻辑,仅保留主机必备的 "建立连接 - 循环读写寄存器 - 数据处理" 流程,符合 Modbus 主机的核心操作范式。
三、功能验证:寄存器读写与 LCD 显示实操
STM32 主机通过 USB 串口与 PC 端 Modbus Slave 软件通信,核心完成三类操作:
- 读取 Modbus Slave 中保持寄存器 1 的数值;
- 将读取到的数值显示在开发板 LCD 屏幕上;
- 对数值执行累加操作后,写入 Modbus Slave 的保持寄存器 2。
功能验证效果:在 PC 端 Modbus Slave 软件中手动修改保持寄存器 1 的值为 28,STM32 主机读取该值后完成累加处理,自动将寄存器 2 的值更新为 29,验证效果如下图:

四、总结
- STM32 主机任务代码基于从机工程精简而来,聚焦 "读取寄存器 - 数据处理 - 写入寄存器" 的主机核心逻辑;
- 实验验证了 STM32 作为 Modbus 主机,可通过 USB 串口与 PC 端 Modbus Slave 稳定通信;
- 完整实现了寄存器读写、数值累加、LCD 显示的闭环操作,验证了 libmodbus 主机侧 API 的移植有效性。
五、结尾
本次实验完成了 STM32 作为 Modbus 主机的核心功能验证,实现了与 PC 端从机软件的 USB 串口通信及数据处理,至此 libmodbus 在 STM32 平台的主从双向通信均已验证完成。这套移植与验证方案可直接落地至工业控制、智能硬件等实际项目,大幅降低 Modbus 通信开发成本。感谢各位的阅读,持续关注本系列笔记,一起探索更多嵌入式通信与开源库移植的实战技巧!