【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/news/853910.shtml

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

相关文章

常见的中间件都在解决什么问题?

常见的中间件都在解决什么问题 RocketMQ RocketMQ 是一款功能强大的分布式消息系统。 RocketMQ 源码地址&#xff1a;https://github.com/apache/rocketmq(opens new window) RocketMQ 官方网站&#xff1a;https://rocketmq.apache.org 什么场景下用 RocketMQ&#xff1f…

线程安全的解决方案(概念版本)

线程安全其实本质 讲的是内存的安全。 多个线程对统一资源的操作可能导致这个资源的数据不一致性。 举例说明&#xff1a;比如 张三有100块钱&#xff0c;现在线程A是要花50元&#xff0c;线程二是要存300元&#xff0c;当线程A花50元后&#xff0c;还没有内存值修改&#xff0…

19.channel相关方法

channel close()可以用来关闭channel closeFuture()用来处理channel的关闭 sync方法作用是同步等待channel关闭 addListener方法是异步等待channel关闭 pipeline() 方法添加处理器 write() 方法将数据写入 writeAndFlush() 方法将数据写入并刷出 write()方法,将数据写入到…

Optional详解和常用API

目录 一、Optional简介 二、构建Optional对象三种方式 2.1 Optional.of(value) 2.1.1 使用案例 2.2 Optional.ofNullable(value) 2.2.1 使用案例 2.3 Optional.empty() 2.3.1 使用案例 三、Optional常用的api解析和使用案例 3.1 isPresent 3.1.1 使用案例 3.2 ifPrese…

登录MySQL方式

登录MySQL方式 方式一&#xff1a;通过MySQL自带的客户端 MySQL 客户端输入命令即可 方式二&#xff1a;通过window自带的客户端 从命令端&#xff08;cmd&#xff09;进入 mysql -h localhost -P 3306 -u root -p Enter password:密码登录方式&#xff1a; mysql -h 主…

深入理解指针(四)

目录 1. 回调函数是什么? ​2. qsort使用举例 2.1冒泡排序 2.2使用qsort函数排序整型数据 ​2.3 使用qsort排序结构数据(名字) 2.4 使用qsort排序结构数据(年龄) 3. qsort函数的模拟实现 1. 回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数…

VMware各版本镜像下载站

CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop/ws 参考&#xff1a; VMware各版本下载的镜像站(含windows和linux)_vm win7映像文件下载-CSDN博客

混淆矩阵-召回率、精确率、准确率

混淆矩阵 1 混淆矩阵2 混淆矩阵指标2.1 准确率2.2 精确率2.3 召回率2.4 特异度2.4 假正率2.5 假负率2.6 F1 分数 3 总结 1 混淆矩阵 混淆矩阵是一种用于评估分类模型性能的重要工具。它通过矩阵形式清晰地展示了模型对样本进行分类的结果&#xff0c;帮助我们理解模型在不同类…

【嵌入式】CAN总线详解

【嵌入式】CAN总线详解 一、CAN总线简介 CAN总线是一种控制器局域网总线&#xff0c;每一个挂载在CAN局域网的设备&#xff0c;都可以利用CAN去发送信息&#xff0c;也可以接收局域网的各种信息&#xff0c;每个设备都是平等的&#xff0c;共享CAN的资源。广泛应用于汽车、嵌…

从0开发一个Chrome插件:项目实战——翻译插件(附带申请谷歌翻译、百度翻译教程)

前言 这是《从0开发一个Chrome插件》系列的第十八篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…

LabVIEW程序的常见加密方式

LabVIEW程序的加密对于保护知识产权和敏感数据至关重要。本文将详细介绍LabVIEW程序常用的加密方式&#xff0c;包括VI加密、代码保护、文件加密和通信加密等&#xff0c;帮助开发者选择合适的加密方法来确保程序的安全性和完整性。 LabVIEW程序的常见加密方式 VI加密&#xf…

【宠粉赠书】科研绘图神器:MATLAB科技绘图与数据分析

小智送书第二期~ 为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套科研绘图的必备书籍——MATLAB科技绘图与数据分析。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《MATLAB科技绘图与数据分析》是一本综合性强、内容丰富的书籍&#x…

Mybatis做批量操作

动态标签foreach&#xff0c;做过批量操作&#xff0c;但是foreach只能处理记录数不多的批量操作&#xff0c;数据量大了后&#xff0c;先不说效率&#xff0c;能不能成功操作都是问题&#xff0c;所以这里讲一讲Mybatis正确的批量操作方法&#xff1a; 在获取opensession对象…

动态规划解题步骤

状态规划题一般要列一个dp表 1、状态表示(重要) 什么是状态表示&#xff1f; 简单来说就是dp表里的值的含义 怎么得到状态表示&#xff1f; 1.题目要求 2.经验题目要求 3&#xff0c;分析问题的过程中发现重复子问题&#xff0c;找到状态表示 2、状态转移方程(重要) d…

Flutter学习(一)

1.Dart环境安装 官网&#xff1a;Get the Dart SDK | Dart Mac环境&#xff1a; Install Homebrew if needed. https://brew.sh/ Add the official tap. $ brew tap dart-lang/dart Install the Dart SDK. $ brew install dart 2.vscode配置 安装dart插件 安装code r…

哈喽GPT-4o——对GPT-4o 提示词的思考与看法

目录 一、提示词二、常用的提示词案例1、写作助理2、改写为小红书风格3、英语翻译和改写4、论文式回答5、主题解构6、提问助手7、Nature风格润色8、结构总结9、编程助手10、充当终端/解释器 大家好&#xff0c;我是哪吒。 最近&#xff0c;ChatGPT在网络上广受欢迎&#xff0c…

Nodejs--构建web应用

构建web应用 将从http模块中的服务器端中的request使劲按开始分析&#xff0c;request时间发生于网络连接建立&#xff0c;客户端想服务器发送报文&#xff0c;服务器解析报文&#xff0c;发现http请求的报文的时候&#xff0c;在出发request事件之前&#xff0c;已经准备好Se…

PDFFactoryFinePrint软件安装包下载+详细安装教程

简介&#xff1a; pdfFactory Pro(虚拟打印机)是一个无须 Acrobat 创建 Adobe PDF 文件的打印机驱动程序。 pdffactory pro虚拟打印机提供了比其他程序提供得更简单、更有效率和更少的花费的创建 PDF 文件的解决方案。用于需要安全的 PDF(法律文档、公司信息等)和其他高级功能…

vmware挂载本地目录到虚拟机

场景 本地环境一直在用vagrant,现在要安装指定版本的centos做k8s集群&#xff0c;vagrant 安装起来不是很方便&#xff0c;改用vmware 现在需要将本地目录挂载到虚拟机 解决 mount -t fuse.vmhgfs-fuse .host:/project /mnt/project/ -o allow_other.host:/project windows的…

C++回溯算法

迷宫的所有路径 ​ #include<bits/stdc.h> using namespace std; void f(int,int),print(); int n,m; int dx[]{0,1,0,-1}; int dy[]{1,0,-1,0}; char a[100][100]; bool flagfalse; struct point{int x,y; }; point r[10000]; int lr0; int main() {system("color…