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

手动开发一个串口调试工具(二):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.xdnf.cn/news/16439.html

相关文章:

  • 系统性提升大模型回复准确率:从 RAG 到多层 Chunk 策略
  • 人工智能论文辅导:Prompt Engineering(特征工程)
  • C++学习之深入学习模板(进阶)
  • 力扣 hot100 Day56
  • 深度学习入门(2)
  • J2EE模式---数据访问对象模式
  • JavaWeb项目(纯Servlet+JSP+前端三大件)入门(从0开始)
  • 传统框架与减震楼盖框架地震动力响应分析与有限元模拟
  • HashMap的线程安全性 vs ConcurrentHashMap
  • cacti漏洞CVE-2022-46169复现
  • JavaScript 中 let 在循环中的作用域机制解析
  • 智慧校园(智能出入口控制系统,考勤,消费机,电子班牌等)标准化学校建设,加速业务规模发展,满足学校、家长及学生对智能化、便捷化校园管理的需求清单如下
  • MyBatis-Plus极速开发指南
  • Ⅹ—6.计算机二级综合题11---14套
  • Spring 生态创新应用:现代架构与前沿技术实践
  • 2025年-ClickHouse 高性能实时分析数据库(大纲版)
  • GaussDB 数据库架构师修炼(九) 逻辑备份实操
  • 学习笔记《区块链技术与应用》第二天 共识机制
  • ESP32学习笔记_Peripherals(4)——MCPWM基础使用
  • cha的操作
  • LP-MSPM0G3507学习--11ADC之二双通道高速DMA采样
  • 人工智能——插值方法、边缘填充、图像矫正、图像掩膜、ROI切割、图像添加水印、图像噪点消除
  • 九联UNT413AS_晶晨S905L3S芯片_2+8G_安卓9.0_线刷固件包
  • 蓝光中的愧疚
  • MySQL索引背后的B+树奥秘
  • Power Compiler:漏电功耗、内部功耗、切换功耗及其计算方式(NLPM)
  • 网络安全-机遇与挑战
  • 【内网穿透】使用FRP实现内网与公网Linux/Ubuntu服务器穿透项目部署多项目穿透方案
  • 在幸狐RV1106板子上用gcc14.2本地编译安装ssh客户端/服务器、vim编辑器、sl和vsftpd服务器
  • Apache Ranger 权限管理