libmodbus STM32 主机实验(USB 串口版)

目录

  • 一、前言
  • [二、主机核心任务: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 软件通信,核心完成三类操作:

  1. 读取 Modbus Slave 中保持寄存器 1 的数值;
  2. 将读取到的数值显示在开发板 LCD 屏幕上;
  3. 对数值执行累加操作后,写入 Modbus Slave 的保持寄存器 2。

功能验证效果:在 PC 端 Modbus Slave 软件中手动修改保持寄存器 1 的值为 28,STM32 主机读取该值后完成累加处理,自动将寄存器 2 的值更新为 29,验证效果如下图:

四、总结

  1. STM32 主机任务代码基于从机工程精简而来,聚焦 "读取寄存器 - 数据处理 - 写入寄存器" 的主机核心逻辑;
  2. 实验验证了 STM32 作为 Modbus 主机,可通过 USB 串口与 PC 端 Modbus Slave 稳定通信;
  3. 完整实现了寄存器读写、数值累加、LCD 显示的闭环操作,验证了 libmodbus 主机侧 API 的移植有效性。

五、结尾

本次实验完成了 STM32 作为 Modbus 主机的核心功能验证,实现了与 PC 端从机软件的 USB 串口通信及数据处理,至此 libmodbus 在 STM32 平台的主从双向通信均已验证完成。这套移植与验证方案可直接落地至工业控制、智能硬件等实际项目,大幅降低 Modbus 通信开发成本。感谢各位的阅读,持续关注本系列笔记,一起探索更多嵌入式通信与开源库移植的实战技巧!

相关推荐
用户120487221612 天前
Linux驱动编译与加载
linux·嵌入式
用户805533698032 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698032 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
神奇啊龙3 天前
我的第一个 TinyGo 项目:ESP32-C3 + DHT11 + SSD1306
物联网·嵌入式
比老马还六4 天前
Bipes-Blockly项目二次开发/Coze智能体(十)
前端·嵌入式
RainCity5 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
ForTime6 天前
HAL库大雷预警!STM32 HAL库CAN启动超时解决办法
嵌入式
大辉狼_音频架构6 天前
Vol. NXP SOF Arch
嵌入式
用户805533698038 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
荣--11 天前
在 strip 二进制 + 基址随机化的栈里做崩溃去重 —— 三阶段算法与一行 Crash Flag
嵌入式·崩溃分析·栈指纹·去重算法