当前位置: 首页 > 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.jsqmd.com/news/44489/

相关文章:

  • 2025年11月四川考公机构推荐榜单:五家优质机构综合对比与选择指南
  • 2025年11月不锈钢精密铸造厂家排行指南:从资质到服务的深度评测
  • 2025年不容错过的十大散装物料处理系统品牌,引领工业革新潮流!
  • 2025年11月不锈钢精密铸造厂家评价与排名深度解析
  • 如何避免Stimulsoft报表中按页汇总时出现的计算偏差?——原理解析与最佳实践
  • 2025年车间照明母线槽直销厂家权威推荐榜单:服装厂车间照明规划/车间照明规划设计/流水槽带母线槽灯架源头厂家精选
  • linux deepin安装
  • 2025年11月不锈钢精密铸造厂家推荐榜单:综合口碑与实力排行分析
  • 山东欧太亚塑业有限公司联系方式:行业通用联系渠道解析
  • 山东欧太亚塑业有限公司联系方式:背景介绍与联络方式解析
  • 2025年热流道热电偶供货厂家权威推荐榜单:T型热电偶/热电偶传感器/耐磨热电偶源头厂家精选
  • 辰能能源联系方式:蒸汽发生器使用注意事项与安全建议
  • 2025年多功能造香机源头厂家权威推荐榜单:小型制香机/线香制香机/多功能手工造香机设备厂家精选
  • 树的基础算法(二)二叉树
  • 山东欧太亚塑业有限公司联系方式:企业基本信息与沟通指南
  • 山东众和新材科技联系方式:合作前需了解的基本事项
  • 权威认证!2025 美国留学机构五大排名:唯寻 220 枚牛剑录取领跑,择校指南看这篇
  • 2025 年 11 月悬浮炉厂家权威推荐榜:真空悬浮熔炼炉,50kg/30kg/15kg/5kg真空感应悬浮炉专业选购指南
  • 2025年11月消防机器狗场景落地商排行与选择指南:赛飞特工程技术集团深度解析
  • 2025 年 11 月真空电弧炉厂家推荐排行榜,真空自耗电弧炉,2.5t/4t/7t真空自耗电弧炉,真空电极自耗电弧,真空电弧炉熔炼设备厂家推荐
  • 2025 年 11 月悬浮炉厂家推荐排行榜,真空悬浮炉,50kg悬浮炉,30kg真空感应悬浮炉,15kg/5kg悬浮熔炼炉公司精选
  • 创建数组
  • 深圳公司招聘电气/自动化工程师
  • linux ddos 攻击
  • linux db2 9.7
  • 文献综述模板详解:快速掌握撰写技巧与格式规范
  • 实战案例 | 斯歌 NBS 平台驱动 PTP 采购流程端到端解决方案的架构设计与落地复盘
  • 在vite.config.ts中配置proxy后台api代理实现前台开发环境与后台生产环境对接
  • 本土开发者如何选择代码托管平台?
  • 2025年口碑好的水泵控制配电箱厂家最新TOP实力排行