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

当前 Qt 应用程序中无法打开串口,并且没有使用通用的 Modbus 类,可在应用程序添加一个专门的“打开串口”按钮

如果你在当前的 Qt 应用程序中无法打开串口,并且没有使用通用的 Modbus 类,那么你可以考虑为你的应用程序添加一个专门的“打开串口”按钮。以下是如何实现这一点的建议:

### **1. 添加“打开串口”按钮**
在你的 UI 文件(`mainwindow.ui`)中,添加一个按钮(`QPushButton`),并将其命名为 `btnOpenPort`。

### **2. 连接按钮信号与槽函数**
在生成的 UI 头文件中(`ui_mainwindow.h`),确保按钮对象是可见的。然后在 `mainwindow.cpp` 中,连接按钮的 `clicked` 信号到一个槽函数,例如 `on_btnOpenPort_clicked`。

```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 连接按钮信号与槽函数
    connect(ui->btnOpenPort, &QPushButton::clicked, this, &MainWindow::on_btnOpenPort_clicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}
```

### **3. 实现槽函数**
在槽函数中,使用 `ModbusRTU` 类来打开串口。

```cpp
#include "modbusrtu.h"

void MainWindow::on_btnOpenPort_clicked()
{
    // 配置串口参数
    QString portName = "COM3";
    uint32_t baudRate = 115200;
    uint8_t deviceAddress = 0x01;

    // 创建 ModbusRTU 对象
    modbusRTU = new ModbusRTU(this);
    if (modbusRTU->initializePort(portName, baudRate)) {
        modbusRTU->setDeviceAddress(deviceAddress);
        QMessageBox::information(this, "Success", "Serial port opened successfully.");
    } else {
        QMessageBox::critical(this, "Error", "Failed to open serial port.");
        delete modbusRTU;
        modbusRTU = nullptr;
    }
}
```

### **4. 修改现有按钮功能**
在现有的 `on_btnSend_clicked` 和 `on_btnRead_clicked` 函数中,确保只有在串口成功打开时才执行操作。

```cpp
void MainWindow::on_btnSend_clicked()
{
    if (!modbusRTU || !modbusRTU->isOpen()) {
        QMessageBox::critical(this, "Error", "Serial port is not open.");
        return;
    }

    bool ok;
    QString input = ui->txtSend->toPlainText();
    uint16_t pressure = input.toUInt(&ok);

    if (!ok || input.isEmpty()) {
        QMessageBox::critical(this, "Error", "Invalid pressure value. Please enter a valid number.");
        return;
    }

    if (modbusRTU->writeSingleRegister(0x0002, pressure)) {
        ui->txtRead->append(QString("Set pressure to: %1 kPa").arg(pressure));
    } else {
        ui->txtRead->append("Failed to set pressure.");
    }
}

void MainWindow::on_btnRead_clicked()
{
    if (!modbusRTU || !modbusRTU->isOpen()) {
        QMessageBox::critical(this, "Error", "Serial port is not open.");
        return;
    }

    uint16_t pressure = 0;
    if (modbusRTU->readHoldingRegisters(0x0003, 1, pressure)) {
        QMessageBox::information(this, "Success", QString("Current pressure: %1 kPa").arg(pressure));
        ui->txtRead->append(QString("Read pressure: %1 kPa").arg(pressure));
    } else {
        QMessageBox::critical(this, "Error", "Failed to read pressure.");
    }
}
```

### **5. 确保串口资源释放**
在 `MainWindow` 的析构函数中,确保释放 `ModbusRTU` 对象。

```cpp
MainWindow::~MainWindow()
{
    delete ui;
    delete modbusRTU; // 确保释放 ModbusRTU 对象
}
```

### **6. 测试程序**
运行程序并测试以下功能:
1. 点击“打开串口”按钮,确保串口成功打开。
2. 点击“发送”按钮,设置压力值。
3. 点击“读取”按钮,读取当前压力值。

### **总结**
通过添加一个“打开串口”按钮,你可以更好地管理串口的打开和关闭操作。同时,确保在其他功能按钮(如“发送”和“读取”)中检查串口是否处于打开状态,以避免操作失败。


http://www.kler.cn/a/569291.html

相关文章:

  • 【Python 数据结构 2.时间复杂度和空间复杂度】
  • 机器学习数学基础:32.复本信度
  • 计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)
  • 前端面试题---在vue中为什么要用路由
  • 谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理
  • 【Redis】持久化
  • leetcode459 重复的子字符串 周期性字符串问题 KMP算法
  • 20250228下载MOOC课程的视频【单集】
  • 1-21 GIT关联本地仓库到远程
  • 配置后端验证功能之validation
  • 如何成为一名专业的程序员,准备一本《AI辅助编程:Python实战》
  • 在AI中,tokens是自然语言处理(NLP)的基本单位,用于文本的分割和处理。
  • easyExcel使用案例有代码
  • 三、数据提取
  • AI视频监控的技术架构
  • 基于大数据的招聘系统可视化及推荐系统
  • 【年度总结】回顾2024,起起落落,收获了很多,也经历了很多,都有那些好玩有趣的经历呢不妨一起来看看
  • 自媒体多账号如何切换不同定位才能做得更好
  • SHA-3(Keccak)算法5比特S盒的双射性质证明
  • [ComfyUI][AI生图]如何在Comfyui中安装插件管理器