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

相关推荐
东小东博客5 小时前
STM32 WS2812 Proteus仿真 汉字显示 SPI控制
stm32·嵌入式硬件·proteus
莫逸雪6 小时前
Nodemo使用学习
学习·编辑器·vim
thisbrand7 小时前
李辉《曾国藩日记》笔记:放不下对诗的情节
笔记·曾国藩
列星随旋8 小时前
线段树和树状数组的学习
学习·算法
辰海Coding9 小时前
MiniSpring框架学习-整合 IoC 和 MVC(NPC)
学习·spring·mvc
断水客9 小时前
8个Majorana量子比特:微软的“量子晶体管”时刻
嵌入式·量子计算
摇滚侠9 小时前
Java 零基础全套教程,File 类与 IO 流,笔记 177-178
java·开发语言·笔记
观浩10 小时前
使用Obsidian和IDEA搭建个人知识库
经验分享·笔记·学习方法
知识分享小能手11 小时前
Flask入门学习教程,从入门到精通,数据库操作 — 知识点详解与案例代码(4)
数据库·学习·flask
玄米乌龙茶12311 小时前
LLM成长笔记(十三):系统设计与项目实战
笔记·unity·游戏引擎