用 QT 打造串口调试助手:实现自收发功能全解析
QT 是一个跨平台的 C++ 应用程序开发框架,由奇趣科技公司开发,现在由 QT Company 维护。它提供了丰富的 API 函数库,让开发者能够轻松地创建图形用户界面(GUI)和实现各种功能。QT 有商业版和免费开源版,对于学习者和个人开发者而言,免费开源版足以满足学习和实践需求。目前,QT 已经广泛应用于多个领域,像汽车仪表盘、相机显示界面、安防设备等,支持超过 10 亿台设备和应用程序。通
目录
在嵌入式开发和硬件调试领域,串口调试助手是开发人员必不可少的工具。它能够帮助我们与各种串口设备进行通信,查看和分析数据。本文将带你一步步使用 QT 框架实现一个具备自收发功能的串口调试助手,同时深入探讨相关代码逻辑。
一、QT 简介
QT 是一个跨平台的 C++ 应用程序开发框架,由奇趣科技公司开发,现在由 QT Company 维护。它提供了丰富的 API 函数库,让开发者能够轻松地创建图形用户界面(GUI)和实现各种功能。QT 有商业版和免费开源版,对于学习者和个人开发者而言,免费开源版足以满足学习和实践需求。目前,QT 已经广泛应用于多个领域,像汽车仪表盘、相机显示界面、安防设备等,支持超过 10 亿台设备和应用程序。
二、开发环境准备
在开始编写代码之前,需要确保已经安装好 QT 开发环境。可以从 QT 官网下载并安装 QT Creator,它集成了编译器、调试器和可视化设计工具,方便我们进行开发。
三、创建 QT 项目
- 打开 QT Creator,选择 “新建项目”。
- 在项目模板中选择 “Qt Widgets Application”,点击 “Choose”。
- 输入项目名称和路径,然后点击 “下一步”。
- 根据需求选择 Kits(开发套件),一般选择默认推荐的即可,点击 “下一步”,直到完成项目创建。
四、设计串口调试助手界面
- 在 QT Creator 的设计模式下,打开 “mainwindow.ui” 文件。
- 从左侧的部件栏中拖曳所需的部件到主窗口。比如,添加两个文本框用于显示接收和发送的数据,添加按钮用于打开串口、关闭串口和发送数据,添加组合框用于选择串口号和波特率等参数。
- 调整部件的布局和样式,使界面美观且易于操作。可以使用布局管理器(如水平布局、垂直布局)来自动排列部件,也可以通过设置部件的属性来修改外观。
五、实现串口自收发功能代码解析
- 添加串口库引用:在项目的 “*.pro” 文件中添加
QT += serialport,这样就可以在代码中使用串口相关的类。 - 在
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用于接收数据。
- 在
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 串口开发,为你的项目开发提供有力支持。如果你在开发过程中遇到问题,欢迎在评论区留言交流。
更多推荐



所有评论(0)