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

深入解析:Qt串口通信学习

深入解析:Qt串口通信学习

Qt串口通信学习

一、项目概述

本项目基于Qt框架实现了串口通信功能,支持串口参数配置、数据收发、串口状态管理等,适合初学者学习Qt串口模块的实际应用。

二、项目结构

  • 61.pro:Qt工程文件,配置模块与源码文件
  • main.cpp:程序入口,初始化应用与主窗口
  • widget.h / widget.cpp:主窗口类,包含UI与核心逻辑
  • widget.ui:界面文件(未展示,需在Qt Designer中查看)

三、环境配置

四、核心代码详解

1. main.cpp

#include "widget.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}

2. widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include
#include  // 串口类
#include  // 串口信息类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked(bool checked);
private:
Ui::Widget *ui;           // UI指针
QSerialPort *serialPort;  // 串口对象
private slots:
void readData();          // 读取数据槽
void on_pushButton_2_clicked(); // 发送数据按钮槽
void on_pushButton_3_clicked(); // 清空发送区按钮槽
};
#endif // WIDGET_H

3. widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
serialPort = new QSerialPort(this);
// 扫描本机的串口,并且添加到下拉框里
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
ui->comboBox->addItem(info.portName());
}
// 读取数据
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked(bool checked)
{
if (checked) {
serialPort->setPortName(ui->comboBox->currentText());
serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_3->currentText().toInt()));
serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_4->currentText().toInt()));
switch (ui->comboBox_5->currentIndex()) {
case 0:
serialPort->setParity(QSerialPort::NoParity);
break;
case 1:
serialPort->setParity(QSerialPort::EvenParity);
break;
case 2:
serialPort->setParity(QSerialPort::OddParity);
break;
case 3:
serialPort->setParity(QSerialPort::SpaceParity);
break;
case 4:
serialPort->setParity(QSerialPort::MarkParity);
break;
default:
break;
}
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if (!serialPort->open(QIODevice::ReadWrite)) {
QMessageBox::about(this, "错误", "串口打开失败可能被占用了");
return;
}
ui->comboBox->setEnabled(false);
ui->comboBox_2->setEnabled(false);
ui->comboBox_3->setEnabled(false);
ui->comboBox_4->setEnabled(false);
ui->comboBox_5->setEnabled(false);
ui->pushButton->setText("关闭串口");
} else {
serialPort->close();
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
ui->comboBox_3->setEnabled(true);
ui->comboBox_4->setEnabled(true);
ui->comboBox_5->setEnabled(true);
ui->pushButton->setText("打开串口");
}
}
void Widget::readData()
{
ui->textBrowser->insertPlainText(serialPort->readAll());
}
void Widget::on_pushButton_2_clicked()
{
serialPort->write(ui->textEdit->toPlainText().toUtf8());
}
void Widget::on_pushButton_3_clicked()
{
ui->textEdit->clear();
}
http://www.wxhsa.cn/company.asp?id=3514

相关文章:

  • 字符串算法笔记
  • 【光照】Unity[经验模型]和[物理模型]
  • 实用指南:浅聊一下Redisson分布式锁
  • JavaScript起源
  • 9.14做题随记
  • 树-学习笔记
  • centos 安装 postgresql 数据库
  • 个人问题反省--致命问题(急需解决)
  • STM32 HAL学习笔记:EC11的使用和定时器中编码器模式的中断
  • 题解:P12546 [UOI 2025] Convex Array
  • Java并发编程(1)
  • 玩转 hostnamectl set-hostname:Linux 主机名管理的优雅方式 - 实践
  • DES原理与举例说明
  • Spring八股文 - 实践
  • Morpheus 审计报告分享2:ChianLink 数据源有着不同的“心跳”
  • 「嘶吼」第一章:吃饭睡觉打豆豆
  • Clion 基础设置
  • 《Vuejs设计与实现》第 16 章(解析器) 上 - 教程
  • go代码(1)
  • 7种常见的入侵检测系统规避技术解析
  • js的引用
  • P3957 [NOIP 2017 普及组] 跳房子
  • C++中常用的STL容器
  • 我的数据科学探索之旅:从兴趣到公考与学习计划
  • MySQL 核心记录解析:从配置到存储的 “说明书 + 记录仪” 系统
  • JavaScript Array 对象
  • 代码规范
  • mac远程连接windows
  • 子类不依赖泛型,重写父类方法,通过强制类型转换父类方法参数出现的问题。——— 一个例子引发的思考
  • WebStorm代码一键美化