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

如果使用MODBUS通用类进行通信

1. 初始化串口

在使用 ModbusRTU 类之前,需要先初始化串口。以下是一个示例代码:

cpp复制

// 初始化 ModbusRTU 对象
ModbusRTU modbus;

// 配置串口参数
modbus.initializePort("COM5", 115200); // 使用 COM5 和波特率 115200
modbus.setDeviceAddress(0x01);         // 设置设备地址为 0x01

2. 写入单个寄存器

如果你想写入一个单个寄存器,可以使用以下方法:

cpp复制

// 发送设定压力值(330 kPa)
uint16_t setPressure = 330; // 设定压力值
bool success = modbus.writeSingleRegister(0x0002, setPressure); // 写入寄存器地址 0x0002,值为 330

if (success) {
    qDebug() << "Pressure set successfully to:" << setPressure << "kPa";
} else {
    qDebug() << "Failed to set pressure.";
}

3. 读取保持寄存器

如果你需要读取保持寄存器的值,可以使用以下方法:

cpp复制

// 读取当前压力值(假设位于寄存器地址 0x0003)
uint16_t currentPressure;
std::vector<uint16_t> values;

if (modbus.readHoldingRegisters(0x0003, 1, values)) {
    currentPressure = values[0];
    qDebug() << "Current pressure:" << currentPressure << "kPa";
} else {
    qDebug() << "Failed to read pressure.";
}

4. 写入多个寄存器

如果需要写入多个寄存器,可以使用以下方法:

cpp复制

// 构造要写入的寄存器值
std::vector<uint16_t> values = {100, 200, 300};

// 写入多个寄存器
bool success = modbus.writeMultipleRegisters(0x0004, values); // 写入寄存器地址 0x0004,值为 100、200、300

if (success) {
    qDebug() << "Multiple registers written successfully.";
} else {
    qDebug() << "Failed to write multiple registers.";
}

5. 关闭串口

在程序结束时,确保关闭串口以释放资源:

cpp复制

// 关闭串口
modbus.serialPort->close();

6. 错误处理

ModbusRTU 类通过信号 errorOccurredportOpened 发送串口操作的结果。你可以在连接这些信号后进行相应的处理:

cpp复制

// 连接误差信号
connect(&modbus, &ModbusRTU::errorOccurred, [](const QString &error) {
    qDebug() << "Error occurred:" << error;
});

// 连接串口打开信号
connect(&modbus, &ModbusRTU::portOpened, [](bool opened) {
    qDebug() << "Serial port opened:" << opened;
});

7. 示例代码

以下是一个完整的示例代码,展示了如何使用 ModbusRTU 类进行 Modbus 通信:

cpp复制

#include "modbusrtu.h"
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 初始化 ModbusRTU
    ModbusRTU modbus;
    modbus.initializePort("COM5", 115200); // 连接 COM5 端口,波特率为 115200
    modbus.setDeviceAddress(0x01);         // 设置设备地址为 0x01

    // 发送设定压力值(330 kPa)
    uint16_t setPressure = 330;
    bool writeSuccess = modbus.writeSingleRegister(0x0002, setPressure);
    if (writeSuccess) {
        qDebug() << "Pressure set successfully to:" << setPressure << "kPa";
    } else {
        qDebug() << "Failed to set pressure.";
    }

    // 读取当前压力值
    std::vector<uint16_t> values;
    bool readSuccess = modbus.readHoldingRegisters(0x0003, 1, values);
    if (readSuccess) {
        qDebug() << "Current pressure:" << values[0] << "kPa";
    } else {
        qDebug() << "Failed to read pressure.";
    }

    // 关闭串口
    modbus.serialPort->close();

    return app.exec();
}

总结

  • 初始化:使用 initializePort 方法配置串口参数。

  • 通信:使用 writeSingleRegisterreadHoldingRegisterswriteMultipleRegisters 方法进行 Modbus 通信。

  • 错误处理:通过连接 errorOccurredportOpened 信号来处理串口操作的结果。

  • 资源管理:在程序结束时,确保关闭串口以释放资源。

http://www.dtcms.com/a/43554.html

相关文章:

  • 【无标题】Ubuntu22.04编译视觉十四讲slambook2 ch4时fmt库的报错
  • 【Nodejs】用pm2管理nodejs服务
  • PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下
  • 3 算法1-3 回文质数
  • 使用esp32接入大模型(http请求)
  • AI关于SHAP分析与列线图(算法)解释线性模型矛盾之处的解释
  • 网络流算法: Edmonds-Karp算法
  • PostgreSQL的基本使用
  • PCEP介绍
  • C++ ++++++++++
  • 上海市计算机学会竞赛平台2024年4月月赛丙组排序分数
  • HTML元素,标签到底指的哪块部分?单双标签何时使用?
  • MySQL Connector/J下载
  • 【学习笔记】三维点云空洞修复介绍(二)Grids-based
  • 20250225-代码笔记03-class CVRPModel AND other class
  • 每日十个计算机专有名词 (7)
  • 三个小时学完vue3(一)
  • L2-043 龙龙送外卖(dfs)
  • Java中的ArrayDeque
  • 安全运营的“黄金4小时“:如何突破告警疲劳困局
  • WSDM24-因果推荐|因果去偏的可解释推荐系统
  • leetcode-442.数组中重复的数据
  • 用Java编写sql
  • 51单片机中reg52.h与regx52.h在进行位操作时的不同
  • 大语言模型:从诞生到未来的探索
  • 015--基于STM32F103ZET6的智能风扇设计
  • 字符串反转
  • docker使用代理的简单配置
  • IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)
  • TPA张量成绩注意力详解及代码复现