Qt串口通信工具开发与数据可视化实践

1. MainWindow 类概述

MainWindow 是一个基于 Qt 框架的串口通信工具主窗口类,集成了串口通信、数据可视化、日志记录等功能。这个类继承自 QMainWindow,是 Qt 应用程序的主窗口实现。

1.1 核心功能解析

MainWindow 主要提供以下功能模块:

  1. 串口通信功能

    • 串口打开/关闭
    • 数据发送/接收
    • 波特率、数据位等参数配置
    • 自动重连机制
  2. 数据可视化

    • 实时波形绘制
    • FFT 频谱分析
    • 交互式十字光标
  3. 辅助功能

    • 日志记录
    • 主题切换(深色/浅色)
    • 字体大小调整
    • 窗口置顶

1.2 类成员变量解析

cpp复制private:
    Ui::MainWindow *ui;  // UI 界面指针
    
    // 串口相关
    QSerialPort *serialPort;  // 串口对象指针
    long sendNum, recvNum, old_recvNum;  // 发送/接收字节计数
    QString status;  // 串口状态字符串
    
    // 状态栏标签
    QLabel *lblSendNum;
    QLabel *lblRecvNum;
    QLabel *lblPortState;
    
    // 日志相关
    QFile logFile;
    bool isFileMode = false;
    QTimer updateTimer;
    
    // 绘图相关
    QCPItemStraightLine *hLine = nullptr;  // 水平十字线
    QCPItemStraightLine *vLine = nullptr;  // 垂直十字线
    QCPItemText *dataLabel = nullptr;  // 数据标签
    bool isMouseInPlot = false;
    
    // 颜色列表(支持最多16个波形)
    QVector<QColor> colors = {
        Qt::blue, Qt::red, Qt::green, /*...省略其他颜色...*/
    };

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 串口通信实现详解

2.1 串口初始化与配置

串口初始化主要在构造函数中完成:

cpp复制MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    // ...其他初始化代码...
    
    serialPort = new QSerialPort(this);
    serialPort->setReadBufferSize(512);  // 设置512字节的接收缓冲区
    
    // 连接信号槽
    connect(serialPort, SIGNAL(readyRead()), 
            this, SLOT(manual_serialPortReadyRead()));
    
    // 错误处理
    connect(serialPort, &QSerialPort::errorOccurred, this, 
        [this](QSerialPort::SerialPortError error){
            if (error == QSerialPort::ResourceError || 
                error == QSerialPort::PermissionError) {
                open_uart = 2;  // 标记需要重连
                serialPort->close();
            }
        });
}

2.2 串口打开与关闭

on_openBt_clicked() 槽函数处理串口的打开/关闭:

cpp复制void MainWindow::on_openBt_clicked()
{
    if(ui->openBt->text() == "打开串口") {
        // 获取串口参数
        QString portName = /*从UI获取串口名称*/;
        int baudRate = /*从UI获取波特率*/;
        // ...其他参数获取...
        
        // 配置串口
        serialPort->setPortName(portName);

内容推荐

已经到底了哦
已经到底了哦