当前位置: 首页 > news >正文

Arduino开发板作为Modbus主设备,可以读取或改写其他Modbus从设备的数据

Arduino开发板作为Modbus主设备,可以读取或改写其他Modbus从设备的数据,可作为釆集数据的中转站或显示设备用,仅提供软件代码和

用Arduino当Modbus主站,说白了就是让这块小开发板当数据指挥官——把温湿度传感器、智能电表、PLC这些从站设备的数据捞过来,要么自己接个LCD显示,要么转发给上位机当中转站,甚至还能反过来给从站发指令改参数,玩法直接拉满。

Arduino开发板作为Modbus主设备,可以读取或改写其他Modbus从设备的数据,可作为釆集数据的中转站或显示设备用,仅提供软件代码和

先上核心代码,后面碎碎念关键细节:

#include <ModbusRTU.h> // 定义Modbus主站用的串口(这里用Serial2避免占用调试用的Serial0) ModbusRTU modbusClient; // 从站配置:根据你的实际设备改! #define SLAVE_ADDR 1 // 从站地址,别和其他设备撞了 #define TEMP_REG 0 // 温度值存在从站的0号保持寄存器 #define HUMI_REG 1 // 湿度值存在1号保持寄存器 #define CONTROL_REG 10 // 用来控制从站继电器的寄存器 void setup() { // 调试串口打开,方便看数据 Serial.begin(115200); // Modbus主站串口初始化:波特率9600,8N1标准格式(必须和从站一致!) modbusClient.begin(9600, SERIAL_8N1, Serial2); delay(100); Serial.println("Arduino Modbus 主站已上线!"); } void loop() { // 第一步:读取从站的温湿度寄存器(2个寄存器:0和1) uint8_t readStatus = modbusClient.readHoldingRegisters(SLAVE_ADDR, TEMP_REG, 2); if (readStatus == modbusClient.ku8MBSuccess) { // 从返回的数据包里抠出寄存器值 float temperature = modbusClient.getResponseBuffer(0) / 10.0; // 假设从站存的是放大10倍的整数 float humidity = modbusClient.getResponseBuffer(1) / 10.0; Serial.print("读取成功 | 温度: "); Serial.print(temperature); Serial.print("℃ | 湿度: "); Serial.print(humidity); Serial.println("%"); } else { Serial.print("读取失败,错误码: "); Serial.println(readStatus); } // 第二步:每隔5秒给从站写一次控制指令(比如切换继电器状态) static unsigned long lastWriteTime = 0; if (millis() - lastWriteTime > 5000) { lastWriteTime = millis(); // 生成一个0/1的切换值,模拟开关控制 static uint16_t ctrlValue = 0; ctrlValue = !ctrlValue; uint8_t writeStatus = modbusClient.writeSingleRegister(SLAVE_ADDR, CONTROL_REG, ctrlValue); if (writeStatus == modbusClient.ku8MBSuccess) { Serial.print("写入成功!控制寄存器设为: "); Serial.println(ctrlValue); } else { Serial.print("写入失败,错误码: "); Serial.println(writeStatus); } } delay(1000); // 每秒读一次数据,别太急 }

碎碎念时间:

  1. 串口选择:为什么用Serial2而不是默认的Serial?因为Serial0要留给电脑调试打印用啊!不然你一边发Modbus指令一边打调试信息,串口数据就乱成粥了。要是你用的是Nano这种只有一组硬件串口的板子,那只能把调试信息关了,或者用软件串口库模拟一个。
  1. 指令踩坑点
    - 从站地址必须和设备一致!比如你买的温湿度模块地址设的是2,这里SLAVE_ADDR就得改成2,不然主站喊破喉咙也没人理。
    - 波特率、数据位、停止位必须和从站严丝合缝!Modbus RTU默认8N1(8数据位、无校验、1停止位),波特率常用9600/19200,瞎改的话就是鸡同鸭讲。
  1. 数据解析modbusClient.getResponseBuffer(0)这句话就是从返回的数据包里把第一个寄存器的值抠出来。为啥要除以10?因为很多传感器会把小数放大10倍存成整数(比如25.3℃存成253),防止浮点传输出问题,读回来再缩回去就行,灵活调整。
  1. 写入逻辑:这里写的是单个保持寄存器,要是想写多个,用writeMultipleRegisters就行。比如给PLC批量写参数,一次传好几个值,效率更高。

实际玩法拓展:

  • 数据中转站:把读取到的温湿度值通过WiFi模块(比如ESP8266)上传到阿里云/腾讯云,Arduino就成了现场设备和云端的桥梁。
  • 本地显示:接个I2C OLED屏,把temperaturehumidity丢到屏幕上,不用连电脑也能看数据。
  • 联动控制:比如读到温度超过30℃,就给控制寄存器写1,触发从站的继电器开风扇,完美实现闭环控制。

最后提一嘴:要是调试的时候一直读不到数据,先把主站和从站用USB转TTL接电脑,用串口助手发指令试试,排除是硬件还是代码的问题——毕竟有时候不是代码错了,是杜邦线插反了啊喂!

http://www.cnnetsun.cn/news/1636663.html

相关文章:

  • 道路病害检测数据集及YOLO模型应用
  • 2025届学术党必备的五大AI写作网站解析与推荐
  • RexUniNLU惊艳效果展示:财经新闻中‘股价’‘并购’‘监管’事件链构建
  • Gitee 2025:中国开发者首选的代码托管平台如何重塑DevOps体验
  • 不止于关联:如何用孟德尔随机化(MR)和TwoSampleMR包为你的GWAS发现寻找因果证据
  • Nunchaku-flux-1-dev项目初始化:使用IDEA进行Java客户端开发配置
  • 组学数据分析实战指南 | (七)蛋白互作界面3D动态可视化技巧
  • 在对话中生成电路图时,OpenClaw 的电子设计自动化(EDA)能力?
  • 数据库优化最佳实践:2026 实战指南
  • 缓存策略与 Spring Boot:2026 实战指南
  • 工业上位机开发避坑:用Modsim32模拟从站,快速验证你的C#/Python Modbus TCP客户端代码
  • C++ STL 核心容器速查表
  • Elixir Plug中间件深度解析:Logger、Parser、Static等核心插件的使用技巧
  • Hunyuan-MT-7B模型实战:Pixel Language Portal与RabbitMQ集成构建异步高可靠翻译任务队列
  • 测试数据治理:一个让所有测试人员头疼的“脏活”
  • Hitboxer:专业级键盘映射与SOCD清洁工具,让你的游戏操作告别方向冲突
  • 如何用Botty实现暗黑破坏神2智能自动化:零基础玩家的高效刷宝指南
  • 一键捕获完整网页:Full Page Screen Capture 高效解决方案
  • 避坑指南:QTableWidget增删行时,currentRow()返回-1怎么办?
  • 新手零基础指南:在快马平台用ai生成你的第一个openclaw千问配置项目
  • 新手福音:在快马平台动手实践,轻松掌握openclaw启动命令
  • 霸王茶姬海外业务持续高增长,GMV超315亿该咋看?
  • COLMAP去畸变踩坑实录:从分辨率报错到完美修复的完整流程
  • 新手福音:免去Copaw安装烦恼,在快马平台边学边练掌握Web自动化
  • 论文降AI率:花100元和花300元有什么区别?价格效果对比
  • 保姆级教程:在OpenEuler 22.03 LTS-SP4上,用cephadm搞定Ceph Pacific集群部署
  • Qwen3.5-2B轻量化优势展示:相同GPU下并发数提升300%实测数据
  • 别再手动CRUD了!用这个SpringBoot+AI的脚手架,5分钟搞定一个智能管理后台
  • Apache Flink 核心面试题深度剖析:从入门到源码级理解
  • 【数据结构与算法】二叉树遍历 集合