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 通信开发成本。感谢各位的阅读,持续关注本系列笔记,一起探索更多嵌入式通信与开源库移植的实战技巧!

相关推荐
学编程的闹钟6 小时前
98【html的php化】
学习
risc1234566 小时前
思维脚手架
笔记
林开落L6 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
risc1234566 小时前
只身走过多少的岁月,弹指一梦不过一瞬间
笔记
哎呦 你干嘛~7 小时前
MODBUS协议学习
学习
小陈phd7 小时前
多模态大模型学习笔记(一)——机器学习入门:监督/无监督学习核心任务全解析
笔记·学习·机器学习
不做无法实现的梦~7 小时前
PX4各个模块的作用(3)
linux·stm32·嵌入式硬件·机器人·自动驾驶
崎岖Qiu7 小时前
【计算机网络 | 第九篇】PPP:点对点协议
网络·笔记·计算机网络·ppp
小陈phd7 小时前
多模态大模型学习笔记(二)——机器学习十大经典算法:一张表看懂分类 / 回归 / 聚类 / 降维
学习·算法·机器学习