手动开发一个串口调试工具(二):Qt 串口类基本认识与使用
在嵌入式调试和硬件通信中,串口(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. 串口初始化
通过 setPortName
、setBaudRate
、setDataBits
等方法配置串口参数,然后使用 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 搭建串口调试界面》