【QT5】<知识点> QT串口编程

目录

前言

一、串口编程步骤

0. 添加串口模块

1. 自动搜索已连接的串口

2. 创建串口对象

3. 初始化串口

4. 打开串口

5. 关闭串口

6. 发送数据

7. 接收数据

二、简易串口助手

1. 实现效果

2. 程序源码

3. 实现效果二


前言

本篇记录QT串口编程相关内容,并制作一个串口助手来巩固理论知识。


一、串口编程步骤

0. 添加串口模块

pro文件中QT += serialport

1. 自动搜索已连接的串口

假设我们已经在ui设计器里添加了一个QComboBox的对象cbSerialPort。接下来,我们通过以下代码将所有已连接的串口名称加入cbSerialPort中,方便用户选择。

//QSerialPortInfo::availablePorts()能够自动搜索已连接的串口
//需要添加头文件<QSerialPortInfo>
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {ui->cbSerialPort->addItem(info.portName());
}

2. 创建串口对象

//需要添加头文件<QSerialPort>
QSerialPort * serialport = new QSerialPort(this);

3. 初始化串口

【1】初始化串口名:

serialPort->setPortName(ui->cbSerialPort->currentText());

【2】初始化波特率:

QSerialPort::BaudRate baudRate;
if (ui->cbBaudRate->currentText() == "4800") {baudRate = QSerialPort::Baud4800;
} else if (ui->cbBaudRate->currentText() == "9600") {baudRate = QSerialPort::Baud9600;
} else if (ui->cbBaudRate->currentText() == "115200") {baudRate = QSerialPort::Baud115200;
}
serialPort->setBaudRate(baudRate);

【3】初始化数据位:

QSerialPort::DataBits dataBits;
if (ui->cbDataBit->currentText() == "5") {dataBits = QSerialPort::Data5;
} else if (ui->cbDataBit->currentText() == "6") {dataBits = QSerialPort::Data6;
} else if (ui->cbDataBit->currentText() == "7") {dataBits = QSerialPort::Data7;
} else if (ui->cbDataBit->currentText() == "8") {dataBits = QSerialPort::Data8;
}
serialPort->setDataBits(dataBits);

【4】初始化停止位:

QSerialPort::StopBits stopBits;
if (ui->cbStopBit->currentText() == "1") {stopBits = QSerialPort::OneStop;
} else if (ui->cbStopBit->currentText() == "1.5") {stopBits = QSerialPort::OneAndHalfStop;
} else if (ui->cbStopBit->currentText() == "2") {stopBits = QSerialPort::TwoStop;
}
serialPort->setStopBits(stopBits);

【5】初始化校验位:

QSerialPort::Parity parity;
if (ui->cbCheckBit->currentText() == "none") {parity = QSerialPort::NoParity;
}
serialPort->setParity(parity);

4. 打开串口

//弹出一个窗口告知用户初始化结果
if (serialPort->open(QIODevice::ReadWrite)) {QMessageBox::information(this, "提示", "成功");
} else {QMessageBox::critical(this, "提示", "失败");
}

5. 关闭串口

serialPort->close();

6. 发送数据

serialPort->write(ui->sendEdit->text().toUtf8());

7. 接收数据

【1】建立信号槽,当有数据发送过来时,调用自定义的槽函数receiveMessage()

connect(serialPort, SIGNAL(readyRead()), this, SLOT(receiveMessage()));

【2】实现槽函数receiveMessage()

void Widget::receiveMessage()
{QString buf = serialPort->readAll();ui->recvEdit->appendPlainText(buf);
}

二、简易串口助手

1. 实现效果

此QT程序在Windows环境下编译运行,且连接IMX6ULL开发板(串口号为12)。IMX6ULL开发板收到信息后会自动发回接收到的信息。因此,本程序的实现效果如下图所示:

2. 程序源码

【1】widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_btnOpenSerial_clicked();void on_btnCloseSerial_clicked();void receiveMessage();void on_btnSendMesg_clicked();void on_btnClearRecv_clicked();void on_btnClearSend_clicked();private:Ui::Widget *ui;QSerialPort *serialPort;
};
#endif // WIDGET_H

【2】widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>/************************************************************ @函数: Widget* @功能: 构造函数* @参数: parent---父对象* @返回: 无*********************************************************/
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//搜索连接的串口,将名称加入cbSerialPort中foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {ui->cbSerialPort->addItem(info.portName());}//创建串口对象serialPort = new QSerialPort(this);//信号槽:串口接收数据connect(serialPort, SIGNAL(readyRead()), this, SLOT(receiveMessage()));//设置"打开串口"与"关闭串口"按钮互斥ui->btnOpenSerial->setEnabled(true);ui->btnCloseSerial->setEnabled(false);
}/************************************************************ @函数: ~Widget* @功能: 析构函数* @参数: 无* @返回: 无*********************************************************/
Widget::~Widget()
{delete ui;
}/************************************************************ @函数: on_btnOpenSerial_clicked* @功能: “打开串口”按钮的槽函数,初始化串口* @参数: 无* @返回: 无*********************************************************/
void Widget::on_btnOpenSerial_clicked()
{//初始化串口名serialPort->setPortName(ui->cbSerialPort->currentText());//初始化波特率QSerialPort::BaudRate baudRate;if (ui->cbBaudRate->currentText() == "4800") {baudRate = QSerialPort::Baud4800;} else if (ui->cbBaudRate->currentText() == "9600") {baudRate = QSerialPort::Baud9600;} else {baudRate = QSerialPort::Baud115200;}serialPort->setBaudRate(baudRate);//初始化数据位QSerialPort::DataBits dataBits;if (ui->cbDataBit->currentText() == "5") {dataBits = QSerialPort::Data5;} else if (ui->cbDataBit->currentText() == "6") {dataBits = QSerialPort::Data6;} else if (ui->cbDataBit->currentText() == "7") {dataBits = QSerialPort::Data7;} else {dataBits = QSerialPort::Data8;}serialPort->setDataBits(dataBits);//初始化停止位QSerialPort::StopBits stopBits;if (ui->cbStopBit->currentText() == "1") {stopBits = QSerialPort::OneStop;} else if (ui->cbStopBit->currentText() == "1.5") {stopBits = QSerialPort::OneAndHalfStop;} else {stopBits = QSerialPort::TwoStop;}serialPort->setStopBits(stopBits);//初始化校验位QSerialPort::Parity parity;if (ui->cbCheckBit->currentText() == "none") {parity = QSerialPort::NoParity;}serialPort->setParity(parity);//弹出一个窗口告知用户初始化结果if (serialPort->open(QIODevice::ReadWrite)) {QMessageBox::information(this, "提示", "串口打开成功");//设置"打开串口"与"关闭串口"按钮互斥ui->btnOpenSerial->setEnabled(false);ui->btnCloseSerial->setEnabled(true);} else {QMessageBox::critical(this, "提示", "串口打开失败");}
}/************************************************************ @函数: on_btnCloseSerial_clicked* @功能: “关闭串口”按钮的槽函数* @参数: 无* @返回: 无*********************************************************/
void Widget::on_btnCloseSerial_clicked()
{serialPort->close();//设置"打开串口"与"关闭串口"按钮互斥ui->btnOpenSerial->setEnabled(true);ui->btnCloseSerial->setEnabled(false);
}/************************************************************ @函数: receiveMessage* @功能: 槽函数:接收信息* @参数: 无* @返回: 无*********************************************************/
void Widget::receiveMessage()
{QString buf = serialPort->readAll();ui->recvEdit->appendPlainText(buf);
}/************************************************************ @函数: on_btnSendMesg_clicked* @功能: “发送信息”按钮的槽函数* @参数: 无* @返回: 无*********************************************************/
void Widget::on_btnSendMesg_clicked()
{serialPort->write(ui->sendEdit->text().toUtf8());
}/************************************************************ @函数: on_btnClearRecv_clicked* @功能: “清除接收框”按钮的槽函数* @参数: 无* @返回: 无*********************************************************/
void Widget::on_btnClearRecv_clicked()
{ui->recvEdit->clear();
}/************************************************************ @函数: on_btnClearSend_clicked* @功能: “清除输入框”按钮的槽函数* @参数: 无* @返回: 无*********************************************************/
void Widget::on_btnClearSend_clicked()
{ui->sendEdit->clear();
}

3. 实现效果二

【1】为了进一步验证简易串口助手的功能,我们进行了如下的实验。

【2】首先,根据视频【虚拟串口创建工具】虚拟串口软件安装教程_哔哩哔哩_bilibili,我们安装了虚拟串口软件,并且产生了两个虚拟串口,如下图所示:

【3】其次,我们开发的串口助手连接com2,另一个串口工具连接com1。如下图所示,它们能够正常地收发数据,这再一次说明了我们开发的串口助手功能是正常的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iText7画发票PDF——小tips

itext7教程&#xff1a; 1、https://blog.csdn.net/allway2/article/details/124295097 2、https://max.book118.com/html/2017/0720/123235195.shtm 3、https://www.cnblogs.com/fonks/p/15090635.html 4、https://www.cnblogs.com/sky-chen/p/13026203.html 5、官方&#xff…

React基础教程(06):Ref的应用

7、Ref的应用 7.1 给标签设置ref"username" 通过这个获取this.refs.username&#xff0c;ref可以获取到应用的真实dom <input style{{width:300}}ref{"text"}/> {/*非常推荐*/} <Button style{{backgroundColor:#2ba471, border:"none&qu…

探索 HNSW:分层导航小世界算法的深度解析

近年来&#xff0c;随着大规模数据和高维数据的广泛应用&#xff0c;高效的近似最近邻&#xff08;Approximate Nearest Neighbor, ANN&#xff09;搜索变得越来越重要。HNSW&#xff08;Hierarchical Navigable Small World&#xff09;算法因其出色的性能和高效的查询速度&am…

JAVAEE认证题库

1、&#xff08;2分&#xff09;下列哪个命令用于在Tomcat服务器上启动一个特定的Web应用程序&#xff1f; A、catalina.bat start B、catalina.bat deploy C、catalina.bat stop D、catalina.bat run 你的答案&#xff1a;D正确答案&#xff1a;A 2、&#xff08;2分&am…

毕业了!给学计算机朋友的 10 条血泪建议

大家好&#xff0c;我是程序员鱼皮。最近高考结束了&#xff0c;也有很多同学毕业了&#xff0c;首先祝福这些朋友在人生的新阶段一帆风顺。 刚参加完高考的朋友&#xff0c;面临的最大问题就是选专业&#xff0c;这段时间也有一些家长向我咨询&#xff1a;还能不能选计算机啦…

人脸匹配——OpenCV

人脸匹配 导入所需的库加载dlib的人脸识别模型和面部检测器读取图片并转换为灰度图比较两张人脸选择图片并显示结果比较图片创建GUI界面运行GUI主循环运行显示全部代码 导入所需的库 cv2&#xff1a;OpenCV库&#xff0c;用于图像处理。 dlib&#xff1a;一个机器学习库&#x…

爬山算法(Hill Climbing Algorithm)详细介绍

爬山算法&#xff08;Hill Climbing Algorithm&#xff09;详细介绍 1. 概述 爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种基于启发式的搜索算法&#xff0c;广泛应用于人工智能、运筹学和优化问题。该算法以当前状态为起点&#xff0c;不断选择邻域中能够…

基于深度学习视觉算法的多模型文件融合检测系统设计与实现及优化(工人姿态检测+安全帽佩戴检测系统)

1&#xff0c;融合pose.pt(姿态检测)(安全帽佩戴检测)效果图 实时检测优化后FPS可达20 2,原理介绍 YOLOv5是目前应用广泛的目标检测算法之一&#xff0c;其主要结构分为两个部分&#xff1a;骨干网络和检测头。 输入&#xff08;Input&#xff09;: YOLOv5的输入是一张RGB图像…

定档6.20,创邻科技图数据库先锋版发布会来了!

6月20日 14:00 &#xff0c;创邻科技将重磅召开 2024 Galaxybase银河图数据库先锋版发布会&#xff0c;戳此预约&#xff01; 书于竹帛&#xff0c;镂于金石&#xff0c;琢于盘盂。历史长河中&#xff0c;数据通过不同形态承载着人类文明&#xff0c;人们在数千年中始终保持着…

微信小程序:实现音乐播放器的功能

在编写微信小程序时&#xff0c;也许会用到播放背景音乐的功能&#xff0c;那么如果是自动播放背景音乐&#xff0c;可以在加载页面时就运行播放音乐的函数&#xff0c;若是希望简单实现音乐播放器的功能&#xff0c;那么设计几个按钮&#xff0c;并且设计按钮点击的事件。 接…

使用Python和Matplotlib绘制复杂数学函数图像

本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…

找不到xinput1_3.dll文件要怎么修复?有哪些有效修复xinput1_3.dll文件的方法

要解决xinput1_3.dll文件缺失的问题&#xff0c;首先我们需要对这个文件有所了解。理解了这个文件的性质和作用后&#xff0c;才能更科学、有效地解决因其丢失而导致的问题。那么接下来&#xff0c;让我们不浪费时间&#xff0c;直接深入研究如何修复xinput1_3.dll文件的最佳方…

震坤行亮相2024成都工博会,赋能产业新发

为期3天的成都工博会于2024年4月23日在成都国际会展中心完美落幕。震坤行再次紧跟西部智能制造产业发展步伐&#xff0c;亮相现场&#xff0c;实力“圈粉”&#xff0c;为西部地区的制造企业带来打造了一场工业互联网盛宴。 本届成都工博会成功举办&#xff0c;展会聚集了各个国…

在ubuntu中恢复误删除的文件

1、安装 TestDisk 在 Ubuntu 上&#xff0c;可以使用以下命令安装 TestDisk&#xff1a; sudo apt-get install testdisk2、查询你删除的文件所在那个分区 #查询分区 df -h #我这里是/dev/sda2 #也可以使用下面命令查看具体哪个分区 lsblk3、查询该分区是什么系统类型 sudo …

java:【@ComponentScan】和【@SpringBootApplication】扫包范围的冲突

# 代码结构如下&#xff1a; 注意【com.chz.myBean.branch】和【com.chz.myBean.main】这两个包是没有生重叠的。 主程序【MyBeanTest1、MyBeanTest2、MyBeanTest3】这两个类是在包【com.chz.myBean.main】下 # 示例代码 【pom.xml】 org.springframework.boot spring-boot-…

spark mllib 特征学习笔记 (二)

当然&#xff0c;请继续介绍其他特征处理方法的公式、适用场景和案例&#xff1a; 10. StringIndexer 公式&#xff1a; 将字符串类型的标签转换为数值索引&#xff1a; StringIndexer ( x ) { 0 , 1 , 2 , … , N − 1 } \text{StringIndexer}(x) \{0, 1, 2, \ldots, N-1…

java采集微信公众号数据

需求背景: 最新需要调用微信公众号api 去微信公众号采集 发布文章数据。 &#xff08;本片文章的意义&#xff1a;根据自己开发的方案来提供思路&#xff0c;当然那不会提供代码。代码是最没有 含金量的东西。&#xff09; 1:遇到的坑:首先 想到的是调用 https://api.weixin…

科技项目验收测试必须进行吗?软件测试公司推荐

科技项目验收测试是指在科技项目开发周期中&#xff0c;对项目完成后进行的一种测试和评估工作。它的目的是验证项目是否达到预期的要求&#xff0c;并确保项目交付给客户前达到预期的质量标准。 一、科技项目验收测试的必要性   科技项目验收测试是项目管理中不可或缺的一个…

Maven认识与学习

1. Maven介绍 1.2 初识Maven 1.2.1 什么是Maven Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 官网&#xff1a;Maven – Welcome to Apache Maven Apache 软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受…

Linux C语言:变量的作用域和生命周期(auto、register、static和extern)

一、变量存储类型-auto 1、auto变量的说明 变量在程序中使用时,必须预先说明它们的存储类型和数据类型。 变量说明的一般形式是&#xff1a; <存储类型> <数据类型 > <变量名> &#xff1b; <存储类型>是关键词auto、register、static和extern<…