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

Qt5实现Windows平台串口通信

一、环境配置

  1. 开发环境: Qt 5.15.2+ (MSVC 2019编译器) Windows 10/11

  2. 依赖配置

    # .pro文件配置
    QT += serialport widgets
    LIBS += -lQt5SerialPort
    

二、界面设计

1. 控件布局

<!-- mainwindow.ui -->
<widget class="QMainWindow" name="MainWindow"><layout class="QGridLayout"><!-- 串口配置区 --><item row="0" column="0"><QLabel text="串口号"/></item><item row="0" column="1"><QComboBox objectName="cmbPort"/></item><!-- 波特率设置 --><item row="1" column="0"><QLabel text="波特率"/></item><item row="1" column="1"><QComboBox objectName="cmbBaudRate"/></item><!-- 控制按钮 --><item row="2" column="0" colspan="2"><QPushButton text="打开串口" objectName="btnOpen"/></item><!-- 数据收发区 --><item row="3" column="0"><QPlainTextEdit objectName="txtSend"/></item><item row="3" column="1"><QPlainTextEdit objectName="txtRecv"/></item><!-- 发送按钮 --><item row="4" column="0" colspan="2"><QPushButton text="发送数据" objectName="btnSend"/></item></layout>
</widget>

三、核心代码实现

1. 头文件定义

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSerialPort>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_btnOpen_clicked();void on_btnSend_clicked();void serialRead();private:void initSerialPort();void populatePorts();Ui::MainWindow *ui;QSerialPort *serial;
};#endif // MAINWINDOW_H

2. 实现文件

// mainwindow.cpp
#include "mainwindow.h"
#include <QSerialPortInfo>
#include <QByteArray>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 初始化串口serial = new QSerialPort(this);initSerialPort();populatePorts();// 信号槽连接connect(ui->btnOpen, &QPushButton::clicked, this, &MainWindow::on_btnOpen_clicked);connect(ui->btnSend, &QPushButton::clicked, this, &MainWindow::on_btnSend_clicked);connect(serial, &QSerialPort::readyRead, this, &MainWindow::serialRead);
}MainWindow::~MainWindow()
{if(serial->isOpen()) serial->close();delete ui;
}void MainWindow::initSerialPort()
{// 配置默认参数serial->setBaudRate(QSerialPort::Baud9600);serial->setDataBits(QSerialPort::Data8);serial->setParity(QSerialPort::NoParity);serial->setStopBits(QSerialPort::OneStop);serial->setFlowControl(QSerialPort::NoFlowControl);
}void MainWindow::populatePorts()
{ui->cmbPort->clear();foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {ui->cmbPort->addItem(info.portName());}
}void MainWindow::on_btnOpen_clicked()
{if(serial->isOpen()) {serial->close();ui->btnOpen->setText("打开串口");} else {serial->setPortName(ui->cmbPort->currentText());if(serial->open(QIODevice::ReadWrite)) {ui->btnOpen->setText("关闭串口");} else {QMessageBox::critical(this, "错误", serial->errorString());}}
}void MainWindow::on_btnSend_clicked()
{QByteArray data = ui->txtSend->toPlainText().toUtf8();if(!data.isEmpty()) {qint64 bytes = serial->write(data);if(bytes == -1) {QMessageBox::warning(this, "发送失败", serial->errorString());}}
}void MainWindow::serialRead()
{QByteArray buffer = serial->readAll();if(!buffer.isEmpty()) {ui->txtRecv->appendPlainText(QString::fromUtf8(buffer));}
}

四、功能扩展

1. 十六进制支持

// 在发送函数中添加HEX转换
void MainWindow::on_btnSend_clicked()
{QString text = ui->txtSend->toPlainText();QByteArray data;if(ui->chkHexSend->isChecked()) {bool ok;data = QByteArray::fromHex(text.toUtf8(), &ok);if(!ok) {QMessageBox::warning(this, "错误", "无效的HEX格式");return;}} else {data = text.toUtf8();}serial->write(data);
}

2. 数据校验

// 在配置函数中添加校验位设置
void MainWindow::setParity(QSerialPort::Parity parity) {serial->setParity(parity);
}// 示例:CRC16校验
quint16 MainWindow::calculateCRC(const QByteArray &data) {quint16 crc = 0xFFFF;for(auto byte : data) {crc ^= (quint16)byte << 8;for(int i=0; i<8; i++) {if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;else crc <<= 1;}}return crc;
}

五、调试技巧

  1. 虚拟串口测试: 使用VSPD创建虚拟串口对(如COM3 <-> COM4) 在程序中选择不同端口测试双向通信

  2. 数据监控

    // 添加调试输出
    qDebug() << "Received:" << buffer.toHex(' ') << "Length:" << buffer.size();
    
  3. 流量控制

    // 启用硬件流控制
    serial->setFlowControl(QSerialPort::HardwareControl);
    

六、编译与运行

  1. 构建配置

    qmake mainwindow.pro
    make
    
  2. 运行验证: 确保COM端口未被占用 通过设备管理器确认串口参数匹配

参考代码 Qt5串口通信程序 www.youwenfan.com/contentcnl/69949.html

七、常见问题处理

现象 解决方案
无法打开串口 检查端口号是否正确,关闭占用程序
数据丢失 增加接收缓冲区,优化读取频率
显示乱码 统一使用UTF-8编码,添加校验逻辑
高波特率不稳定 降低波特率,检查线缆质量

八、工程结构

SerialDemo/
├── Src/
│   ├── main.cpp
│   ├── mainwindow.cpp
│   └── mainwindow.h
├── Res/
│   └── mainwindow.ui
└── SerialDemo.pro
http://www.gsyq.cn/news/54041.html

相关文章:

  • 2025年不容错过的十大散装物料处理系统品牌,引领工业革新潮流!
  • 如何避免Stimulsoft报表中按页汇总时出现的计算偏差?——原理解析与最佳实践
  • 山东众和新材科技联系方式:合作前需了解的基本事项
  • 深圳公司招聘电气/自动化工程师
  • linux ddos 攻击
  • 实战案例 | 斯歌 NBS 平台驱动 PTP 采购流程端到端解决方案的架构设计与落地复盘
  • 2025 最新砂磨机源头厂家推荐排行榜,纳米 / 卧式 / 实验室等全类型优质供货企业权威榜单棒销砂磨机/卧式砂磨机/立式砂磨机/涡轮式砂磨机/实验室纳米砂磨机公司推荐
  • safe system(linux)
  • C尖笔记目录
  • 2025年11月门窗密封胶条十大品牌权威榜单:筑牢家居与建筑的 “节能防线”
  • 2025年高品质的木质建筑模板厂家最新推荐排行榜
  • 2025年口碑好的成都全品类五金厂家实力及用户口碑排行榜
  • 2025年口碑好的蛇形帘系统配件厂家最新TOP排行榜
  • 2025年比较好的小型平板硫化机行业内口碑厂家排行榜
  • libcurl FTP路径规范化漏洞解析:编码%2e%2e导致目录穿越
  • 2025 最新推荐修脚加盟品牌榜单:国际协会测评认证,非遗技艺 + 成熟运营体系优选指南修脚加盟培训 / 足疗修脚加盟 / 采耳修脚加盟 / 修脚培训加盟公司推荐
  • 2025年热门的烟台包装用户口碑最好的厂家榜
  • 算一算你的一餐,为地球“减负”多少?
  • 水平高的北京海淀区婚姻律师行业观察与参考
  • 2025年比较好的设计师集成阻尼铰链厂家最新权威推荐排行榜
  • 2025 年最新推荐打印贴标机厂家权威排行榜:自动/在线/实时/条码/智能/防爆/称重/平面打印贴标机公司推荐
  • 2025年评价高的聚氨酯发泡保温管道厂家推荐及选购指南
  • 2025 最新打印贴标一体机厂家口碑推荐榜:国际测评认证,覆盖多品类精准适配企业生产需求称重打印贴标一体机/实时打印贴标一体机/标签打印贴标一体机/条码打印贴标一体机/模块化打印贴标一体机公司推荐
  • 2025年11月离婚纠纷律师推荐评价:行业榜单与详细对比解析
  • 2025年质量好的玻璃钢夹砂排污管道优质厂家推荐榜单
  • C++之类和对象(上)(多例子详解this指针以及封装特性的初步引入) - 指南
  • 2025年11月中国遗产继承律师评价榜:从资质到案例的实战能力解析
  • 错题整理
  • 2025年靠谱的孤立导体测试仪厂家最新权威实力榜
  • P5256 [JSOI2013] 编程作业 个人题解