news 2026/5/23 23:42:27

qt开发的modbus-tcp远程控制主机上位机和stm32从机源码,实现了modbus 01...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
qt开发的modbus-tcp远程控制主机上位机和stm32从机源码,实现了modbus 01...

qt开发的modbus-tcp远程控制主机上位机和stm32从机源码,实现了modbus 01 02 03 04 05 06 10 F功能码(modbus不是使用第三方库包括qmodbus,都是是自己写的),并在此基础上结合stm32从机实现了四遥功能:遥测遥控遥信遥调 stm32端采用野火指南者开发板和w5500以太网模块。 从机程序不限于野火板子只是四遥功能采用了板子的led灯按键和adc引脚,如换其他板子改一下引脚就可以。 后面有资料提供,四遥功能包括:远程采集adc数据实时刷新标准浮点数转换,感知远程按键信号,按键按上位机信号灯点亮,按键关闭信号灯关闭,点击三个自定义按钮控制三路led灯点亮(实时),遥调下发保持寄存器数值,通过自定义仪表盘读取设定值。

手搓Modbus-TCP协议的实战记录来咯!这次用Qt5撸了个上位机,搭配STM32F103+W5500搞定了工业控制领域常用的四遥功能。不用qmodbus库不靠现成轮子,从TCP报文解析到功能码实现全流程硬核开发,摸鱼时间都搭进去了(笑)


上位机核心:暴力拆解Modbus报文

自己实现协议栈最爽的就是完全掌控数据流。举个读取保持寄存器的03功能码处理:

QByteArray ModbusRequest::buildReadHoldingRegisters(int slaveID, int startAddr, int count) { QByteArray frame; QDataStream stream(&frame, QIODevice::WriteOnly); stream.setByteOrder(QDataStream::BigEndian); stream << quint8(slaveID) << quint8(0x03) // 功能码 << quint16(startAddr) << quint16(count); appendCRC16(frame); return frame; }

这段代码生成的报文结构绝对标准:设备地址+功能码+起始地址+寄存器数量+CRC校验。注意字节序必须用Big-Endian,否则设备端会直接丢包。当年在这里踩坑导致三天没收到正确响应...


从机端骚操作:寄存器映射黑科技

STM32端采用寄存器地址映射策略,把硬件状态直接挂到modbus地址空间:

// 保持寄存器映射表 __IO uint16_t holdingRegs[HOLDING_REG_NUM] = { 0x0000, // 设备状态 0x1388, // 初始阈值 //...其他寄存器 }; // ADC值自动更新 void UpdateHoldingRegisters(void) { holdingRegs[REG_ADC1_VAL] = (uint16_t)(get_adc_value(ADC1) * 100); // 浮点转定点 }

这里把ADC原始值放大100倍转为整数存储,上位机收到后除以100还原浮点数。实测比直接传浮点更稳定,尤其在一些老版本PLC上兼容性更好。


四遥功能落地实操

  1. 遥测:ADC采集线程500ms轮询
// Qt端定时拉取数据 connect(&timer, &QTimer::timeout, [=](){ sendReadRequest(SLAVE_ID, REG_ADC_BASE, 3); }); // 收到响应后更新UI仪表盘 void updateDashBoard(const ModbusResponse& resp) { double voltage = resp.getRegister(0) / 100.0; ui->voltageGauge->setValue(voltage); }
  1. 遥控:LED控制直接挂钩线圈状态
// STM32端线圈状态监听 if(coils[COIL_LED1] != led1_status){ HAL_GPIO_WritePin(LED1_GPIO, coils[COIL_LED1]); led1_status = coils[COIL_LED1]; }
  1. 遥信:按键状态通过离散输入上报
// 按键中断服务函数里置位标志 void EXTI0_IRQHandler(){ discreteInputs[DI_KEY1] = 1; __HAL_GPIO_EXTI_CLEAR_IT(KEY1_PIN); }
  1. 遥调:写保持寄存器实现参数下发
// 上位机下发设定值 void sendAdjustment(float value) { uint16_t raw = static_cast<uint16_t>(value * 100); sendWriteRequest(SLAVE_ID, REG_SET_VALUE, raw); }

避坑指南

  1. W5500硬件流控必须使能,否则大数据量会丢包
  2. STM32的HAL库ETH驱动需要调整RxBuffer数量,默认值太小
  3. Qt的TCP粘包处理要加超时机制,推荐使用状态机解析
  4. 寄存器地址记得做越界检查,防止设备跑飞

源码里还有自定义仪表盘控件和工业风UI设计,需要完整工程的老铁可以私信。下期准备分享如何用这套框架对接西门子PLC,想看的评论区扣个1~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 12:03:44

Qwen3-4B-Base终极进化:40亿参数解锁119种语言理解

Qwen3-4B-Base终极进化&#xff1a;40亿参数解锁119种语言理解 【免费下载链接】Qwen3-4B-Base 探索语言极限&#xff0c;Qwen3-4B-Base引领大模型新篇章。集成多元训练数据与前沿技术&#xff0c;实现更高质的预训练与扩展的语言理解能力&#xff0c;助您开启智能文本处理新境…

作者头像 李华
网站建设 2026/5/12 7:40:09

7B小模型大能力:Granite-4.0-H-Tiny工具调用指南

7B小模型大能力&#xff1a;Granite-4.0-H-Tiny工具调用指南 【免费下载链接】granite-4.0-h-tiny-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/granite-4.0-h-tiny-GGUF 导语 IBM最新发布的70亿参数模型Granite-4.0-H-Tiny以其卓越的工具调用能力和多…

作者头像 李华
网站建设 2026/5/20 6:58:49

CapRL-3B:30亿参数实现高效图像理解的AI神器

CapRL-3B&#xff1a;30亿参数实现高效图像理解的AI神器 【免费下载链接】CapRL-3B 项目地址: https://ai.gitcode.com/InternLM/CapRL-3B 导语&#xff1a; InternLM团队推出的CapRL-3B模型以仅30亿参数规模&#xff0c;实现了与720亿参数大模型相媲美的图像理解能力&…

作者头像 李华
网站建设 2026/5/13 13:12:08

BFS-Prover:7B模型实现72.95%定理证明新突破

BFS-Prover&#xff1a;7B模型实现72.95%定理证明新突破 【免费下载链接】BFS-Prover-V1-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/BFS-Prover-V1-7B 导语&#xff1a;字节跳动最新发布的BFS-Prover-V1-7B模型在MiniF2F定理证明基准测试中以72.…

作者头像 李华
网站建设 2026/5/12 13:10:34

前后端分离星之语明星周边产品销售网站系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着互联网技术的快速发展&#xff0c;电子商务已成为现代消费的重要形式之一。明星周边产品因其独特的粉丝经济属性&#xff0c;市场需求持续增长&#xff0c;但传统销售模式存在信息更新滞后、用户体验单一等问题。基于前后端分离架构的星之语明星周边产品销售网站系统应…

作者头像 李华
网站建设 2026/5/23 6:46:41

企业级飘香水果购物网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着电子商务的快速发展&#xff0c;水果生鲜行业对线上购物平台的需求日益增长。传统的线下水果销售模式受限于地域和时间&#xff0c;难以满足消费者对便捷、高效购物体验的需求。企业级飘香水果购物网站管理系统旨在解决这一问题&#xff0c;通过构建一个功能完善、用户…

作者头像 李华