手动开发一个串口调试工具(二):Qt 串口类基本认识与使用

发布于:2025-07-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

在嵌入式调试和硬件通信中,串口(Serial Port)是一种非常常见的通信方式。为了帮助开发者在桌面端更高效地与设备交互,本系列文章将通过使用 Qt 开发一个完整的“串口调试工具”来展开讲解。

一、Qt 串口通信模块介绍

Qt 提供了跨平台的串口通信模块 —— QtSerialPort,它的核心类包括:

  • QSerialPort:用于打开串口、读写数据、设置参数等;
  • QSerialPortInfo:用于查询当前系统可用串口列表。

在实际使用前,你需要在项目文件(.pro)中引入模块:

QT += core serialport

二、实战:构建一个基础串口控制台工具

以下是一段基于 QCoreApplication 构建的控制台程序代码,实现了:

  • 初始化串口;
  • 以十六进制格式发送固定数据;
  • 接收串口返回的数据并格式化打印;
  • 每 100ms 自动发送一次指令。

1. 完整代码展示

#include <QCoreApplication>
#include <QSerialPort>
#include <QTimer>
#include <QDebug>

QSerialPort *com;
QTimer *timer;

// 十六进制字符串转字节数组
QByteArray hexStringToByteArray(const QString &hex) {
    QByteArray ret;
    QStringList hexList = hex.split(' ', Qt::SkipEmptyParts);
    for (const QString &byteStr : hexList) {
        bool ok;
        ret.append(static_cast<char>(byteStr.toUInt(&ok, 16)));
    }
    return ret;
}

// 发送数据函数
void sendData() {
    QByteArray datacom = hexStringToByteArray("AB BA 0F 01 09 83 00 10 00 01 00 00 00 CD DC");
    if (com->isOpen()) com->write(datacom);
}

// 接收数据函数
void readCom(QSerialPort *port, const QString &portName) {
    QByteArray data = port->readAll();
    QString hex;
    for (char byte : data)
        hex += QString("%1 ").arg(static_cast<unsigned char>(byte), 2, 16, QLatin1Char('0')).toUpper();
    qDebug() << portName << "接收:" << hex.trimmed();
}

// 主函数
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    com = new QSerialPort;
    com->setPortName("COM12");  // 串口号
    com->setBaudRate(QSerialPort::Baud115200);
    com->setDataBits(QSerialPort::Data8);
    com->setParity(QSerialPort::NoParity);
    com->setStopBits(QSerialPort::OneStop);
    com->setFlowControl(QSerialPort::NoFlowControl);

    if (!com->open(QIODevice::ReadWrite))
        qCritical() << "无法打开串口 COM12";

    // 接收信号槽
    QObject::connect(com, &QSerialPort::readyRead, [&](){
        readCom(com, "COM12");
    });

    // 定时器:周期性发送
    timer = new QTimer;
    QObject::connect(timer, &QTimer::timeout, sendData);
    timer->start(100); // 每 100ms 发送一次

    return a.exec();
}

三、功能解析

1. 串口初始化

通过 setPortNamesetBaudRatesetDataBits 等方法配置串口参数,然后使用 open() 打开串口。

2. 十六进制转换

实际调试时经常需要发送原始字节流(非 ASCII 字符串),因此我们将输入的十六进制字符串转为 QByteArray

3. 数据发送

使用 QSerialPort::write() 将数据发送到串口。此处我们使用定时器 QTimer 每 100 毫秒发送一次指令包。

4. 数据接收

连接 readyRead() 信号,当有数据到达时触发读取并格式化为十六进制输出,方便观察设备回应内容。


四、运行效果

程序启动后:

  • 自动连接串口 COM12;
  • 每隔 100ms 向串口发送一组固定指令;
  • 接收设备返回数据,并在控制台打印十六进制值,如:
"COM12 接收: 01 03 00 0A 00 0C 45 7F"

五、常见问题排查

问题 可能原因与解决方法
无法打开串口 串口号错误 / 串口被占用,请使用 QSerialPortInfo 查询
无数据接收 确认设备连接、波特率匹配、线序是否正确
接收到乱码 / 缺字节 字节对齐错误 / 设备未完全发送 / 速率不匹配

六、总结

本篇文章完成了从 0 到 1 的串口通信程序开发,包括:

  • Qt 串口模块基础;
  • 串口参数设置;
  • 十六进制收发数据;
  • 控制台输出调试。

虽然功能尚简陋,但它是开发串口调试工具的 “引擎核心”,后续我们将以此为基础构建图形化界面,增加串口管理、文本框输入输出、日志记录等功能。

七、工程代码

通过网盘分享的文件:手动开发一个串口调试工具(二):Qt 串口类基本认识与使用
链接: https://pan.baidu.com/s/1qZJRrJnYXjOj46lpiN_MZg?pwd=jkcf 提取码: jkcf

📌 下一篇预告

《手动开发一个串口调试工具(三):基于 Qt Widgets 搭建串口调试界面》



网站公告

今日签到

点亮在社区的每一天
去签到