基于Qt的串口通信工具

发布于:2025-04-11 ⋅ 阅读:(32) ⋅ 点赞:(0)

 

程序介绍

该程序是一个基于Qt的串口通信工具,专用于ESP8266 WiFi模块的AT指令配置与调试。主要功能包括:

1. 核心功能

  • 串口通信:支持串口开关、参数配置(波特率、数据位、停止位、校验位)及数据收发。

  • AT指令操作:通过GUI按钮发送预设AT指令,控制WiFi模块(如模块测试、重启、连接路由器、设置TCP服务器等)。

  • 数据透传:支持进入/退出透传模式,实现与服务器的直接数据交互。

  • 配置持久化:通过注册表保存界面配置(如串口参数、WiFi名称、密码、服务器IP等),重启后自动加载。

  • 自定义交互:通过点击标签(TMyLabel)快速发送关联的AT指令。


2. 程序结构

文件组成
  • main.cpp:程序入口,初始化主窗口。

  • mainwindow.h/cpp:主窗口逻辑,实现串口操作、AT指令发送、数据接收、配置保存等功能。

  • mainwindow.ui:Qt Designer生成的界面布局文件,定义控件及布局。

  • tmylabel.h/cpp:自定义标签控件,支持点击事件触发信号。

  • samp17_1.pro:Qt项目配置,包含依赖模块(如serialport)及资源文件。

界面模块
  • 串口配置区:选择串口号、波特率、数据位等参数,支持打开/关闭串口。

  • AT指令操作区

    • 基本操作:模块测试、重启、恢复出厂设置。

    • WiFi参数配置:设置UART参数、连接路由器、查询状态。

    • TCP服务器设置:配置IP和端口,支持自动连接。

    • 透传模式:进入/退出透传,实现数据直传。

  • 数据记录区:显示串口收发数据,支持清空操作。

  • 快捷指令区:通过TMyLabel标签快速发送预设AT指令。

3. 关键功能实现代码

(1) 串口开关与配置
  • 打开串口on_actCom_Open_triggered):

    
    
    void MainWindow::on_actCom_Open_triggered() {
        if (comport.isOpen()) {
            QMessageBox::critical(this, "警告", "串口已打开:" + comport.portName());
            return;
        }
        // 配置串口参数(波特率、数据位等)
        comport.setPort(seriallist.at(ui->comboCom_Port->currentIndex()));
        comport.setBaudRate(ui->comboWiFi_UartBuad->currentText().toInt());
        // ...其他参数设置
        if (comport.open(QIODevice::ReadWrite)) {
            // 启用相关控件
            ui->toolBox->setEnabled(true);
            ui->actCom_Open->setEnabled(false);
        }
    }

(2) AT指令发送
  • 通用发送函数uartsend):

    
    void MainWindow::uartsend(QString cmd) {
        ui->textCOM->appendPlainText(cmd);   // 显示发送内容
        comport.write(cmd.toLocal8Bit());    // 写入串口
    }

  • 示例:设置路由器on_btnWF_SetAP_clicked):

    
    void MainWindow::on_btnWF_SetAP_clicked() {
        QString wifiname = ui->editAP_Name->text();
        QString wifipass = ui->editAP_PWD->text();
        uartsend("AT+CWJAP=\"" + wifiname + "\",\"" + wifipass + "\"\r\n");
    }

(3) 数据接收与显示
  • 接收槽函数do_readyRead):

    
    void MainWindow::do_readyRead() {
        QByteArray data = comport.readAll();
        ui->textCOM->appendPlainText(QString::fromLocal8Bit(data)); // 显示接收内容
    }

(4) 配置持久化
  • 保存配置closeEvent):

    void MainWindow::closeEvent(QCloseEvent *event) {
        QSettings setting;
        setting.setValue("AP_Name", ui->editAP_Name->text());
        setting.setValue("AP_PWD", ui->editAP_PWD->text());
        // ...保存其他参数
        event->accept();
    }

  • 加载配置(构造函数):

    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
        // ...初始化代码
        QSettings setting;
        ui->editAP_Name->setText(setting.value("AP_Name").toString());
        // ...加载其他参数
    }

(5) 自定义标签点击事件
  • TMyLabel实现

    
    void TMyLabel::mousePressEvent(QMouseEvent *event) {
        if (event->button() == Qt::LeftButton) {
            emit clicked(); // 触发点击信号
        }
        event->accept();
    }

  • 关联信号与槽(MainWindow构造函数):

    
    QList<TMyLabel*> lab = ui->frame_CmdA->findChildren<TMyLabel*>();
    for (const auto &item : lab) {
        connect(item, &TMyLabel::clicked, this, &MainWindow::do_clicked);
    }

4. 改进建议

  • 错误处理:增加串口打开失败、指令响应超时的提示。

  • 实时反馈:显示串口状态(如连接状态、数据收发速率)。

  • 代码优化:提取重复的配置保存/加载逻辑为独立函数。

  • 国际化:支持多语言切换。

该程序通过模块化设计实现了ESP8266的便捷调试,适合嵌入式开发中的快速验证场景。