目录

用 QT 打造串口调试助手:实现自收发功能全解析

一、QT 简介

二、开发环境准备

三、创建 QT 项目

四、设计串口调试助手界面

五、实现串口自收发功能代码解析

六、总结


在嵌入式开发和硬件调试领域,串口调试助手是开发人员必不可少的工具。它能够帮助我们与各种串口设备进行通信,查看和分析数据。本文将带你一步步使用 QT 框架实现一个具备自收发功能的串口调试助手,同时深入探讨相关代码逻辑。

一、QT 简介

QT 是一个跨平台的 C++ 应用程序开发框架,由奇趣科技公司开发,现在由 QT Company 维护。它提供了丰富的 API 函数库,让开发者能够轻松地创建图形用户界面(GUI)和实现各种功能。QT 有商业版和免费开源版,对于学习者和个人开发者而言,免费开源版足以满足学习和实践需求。目前,QT 已经广泛应用于多个领域,像汽车仪表盘、相机显示界面、安防设备等,支持超过 10 亿台设备和应用程序。

二、开发环境准备

在开始编写代码之前,需要确保已经安装好 QT 开发环境。可以从 QT 官网下载并安装 QT Creator,它集成了编译器、调试器和可视化设计工具,方便我们进行开发。

三、创建 QT 项目

  1. 打开 QT Creator,选择 “新建项目”。
  2. 在项目模板中选择 “Qt Widgets Application”,点击 “Choose”。
  3. 输入项目名称和路径,然后点击 “下一步”。
  4. 根据需求选择 Kits(开发套件),一般选择默认推荐的即可,点击 “下一步”,直到完成项目创建。

四、设计串口调试助手界面

  1. 在 QT Creator 的设计模式下,打开 “mainwindow.ui” 文件。
  2. 从左侧的部件栏中拖曳所需的部件到主窗口。比如,添加两个文本框用于显示接收和发送的数据,添加按钮用于打开串口、关闭串口和发送数据,添加组合框用于选择串口号和波特率等参数。
  3. 调整部件的布局和样式,使界面美观且易于操作。可以使用布局管理器(如水平布局、垂直布局)来自动排列部件,也可以通过设置部件的属性来修改外观。

五、实现串口自收发功能代码解析

  1. 添加串口库引用:在项目的 “*.pro” 文件中添加QT += serialport,这样就可以在代码中使用串口相关的类。
  2. mainwindow.h文件中声明变量和函数

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onOpenButtonClicked();
    void onCloseButtonClicked();
    void onSendButtonClicked();
    void readData();

private:
    Ui::MainWindow *ui;
    QSerialPort *serialPort;
};

#endif // MAINWINDOW_H

  • 这里声明了一个QSerialPort指针serialPort用于操作串口。
  • 定义了几个槽函数:onOpenButtonClicked用于打开串口,onCloseButtonClicked用于关闭串口,onSendButtonClicked用于发送数据,readData用于接收数据。

  1. mainwindow.cpp文件中实现函数

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    // 初始化串口参数选择
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        ui->comboBoxPort->addItem(info.portName());
    }
    QStringList baudRates = {"9600", "115200", "230400"};
    ui->comboBoxBaudRate->addItems(baudRates);
}

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

void MainWindow::onOpenButtonClicked()
{
    QString portName = ui->comboBoxPort->currentText();
    QString baudRateStr = ui->comboBoxBaudRate->currentText();
    qint32 baudRate = baudRateStr.toInt();

    serialPort->setPortName(portName);
    serialPort->setBaudRate(baudRate);

    if (serialPort->open(QIODevice::ReadWrite)) {
        QMessageBox::information(this, "提示", "串口打开成功");
        connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData);
    } else {
        QMessageBox::warning(this, "错误", "串口打开失败");
    }
}

void MainWindow::onCloseButtonClicked()
{
    if (serialPort->isOpen()) {
        serialPort->close();
        QMessageBox::information(this, "提示", "串口已关闭");
    }
}

void MainWindow::onSendButtonClicked()
{
    QString sendData = ui->lineEditSend->text();
    if (!sendData.isEmpty()) {
        QByteArray data = sendData.toUtf8();
        serialPort->write(data);
        serialPort->flush();
    }
}

void MainWindow::readData()
{
    QByteArray data = serialPort->readAll();
    QString receivedData = QString::fromUtf8(data);
    ui->textEditReceive->append(receivedData);
}

  • 在构造函数中,初始化了串口对象,并将系统中可用的串口号添加到组合框中,同时设置了默认的波特率选项。
  • onOpenButtonClicked函数负责根据用户选择的串口号和波特率打开串口,如果打开成功,连接串口的readyRead信号到readData槽函数,以便接收数据。
  • onCloseButtonClicked函数用于关闭已打开的串口。
  • onSendButtonClicked函数获取用户在发送文本框中输入的数据,将其转换为QByteArray类型并发送出去。
  • readData函数在串口有数据可读时被调用,读取数据并显示在接收文本框中。

六、总结

通过以上步骤,我们成功使用 QT 框架实现了一个具备自收发功能的串口调试助手。在实际开发中,可以根据具体需求进一步扩展功能,如添加数据解析、日志记录等。希望本文能够帮助你快速上手 QT 串口开发,为你的项目开发提供有力支持。如果你在开发过程中遇到问题,欢迎在评论区留言交流。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐