当前位置: 首页 > news >正文

手动开发一个串口调试工具(二):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. 串口初始化

通过 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 搭建串口调试界面》


http://www.lryc.cn/news/600608.html

相关文章:

  • ClickHouse高性能实时分析数据库-消费实时数据流(消费kafka)
  • 【Linux系统】理解硬件 | 引入文件系统
  • Kotlin线程同步
  • 高并发微服务限流算法方案对比与实践指南
  • 告别Vite脚手架局限!MixOne Beta测试招募:你的需求,我们来实现
  • 基于 ThinkPHP 开发的垂直化网址导航
  • 深入解析Hadoop如何实现数据可靠性:三副本策略、校验和验证与Pipeline复制
  • 使用Spring Boot创建Web项目
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶(365)
  • 【工程化】浅谈前端构建工具
  • nginx一个域名下部署多套前端项目
  • 机器学习特征工程详解:特征选择与降维(PCA)
  • NLua和C#交互
  • Flask input 和datalist结合
  • VTK交互——ImageClip
  • xLua和C#交互
  • 高性能网络DPDK、RDMA、XDP初探
  • 电子电气架构 --- 高阶智能驾驶对E/E架构的新要求
  • 工具 | 解决 VSCode 中的 Delete CR 问题
  • uniapp+vue3——通知栏标题纵向滚动切换
  • 全球化2.0 | 云轴科技ZStack亮相阿里云印尼国有企业CXO专家活动
  • 以太坊下一阶段的关键——隐私
  • DSP在CCS中实现双核在线仿真调试及下载的方法(以TMS320F28x为例)
  • 生产环境使用云服务器(centOS)部署和使用MongoDB
  • (React入门上手——指北指南学习(第一节)
  • docker 从主机复制文件到容器外进行编辑
  • MongoDB数据模型
  • vulhub Web Machine(N7)靶场攻略
  • AutoDL 数据盘清理指南:彻底删除 .Trash-0 内文件释放空间
  • “Datawhale AI夏令营”「结构化数据的用户意图理解和知识问答挑战赛」1