【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,一经查实,立即删除!

相关文章

登录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. 回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数…

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

混淆矩阵 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的资源。广泛应用于汽车、嵌…

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对象…

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

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

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

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

js实现一个数据结构——栈

栈的概念就不再赘述&#xff0c;无可厚非的先进后出&#xff0c;而JS又是高级语言&#xff0c;数组中的方法十分丰富&#xff0c;已经自带了push pop方法进行入栈出栈的操作。 1.基本实现 class Stack {constructor() {this.items [];}// 入栈push(item) {this.items.push(i…

List 列表

文章目录 一、什么是 List 列表1.1 创建 List 列表的方式1.2 列表的新增函数方法1.3 列表的删除函数方法1.4 修改列表数据的方法1.5 列表的查询函数方法1.6 列表的排序和反序1.7 列表的复制 一、什么是 List 列表 List 列表&#xff1a;该数据类型定义的变量可以理解为是一个数…

【Java】已解决java.lang.NoClassDefFoundError异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.lang.NoClassDefFoundError异常 一、问题背景 java.lang.NoClassDefFoundError 是 Java 运行时环境&#xff08;JRE&#xff09;在尝试加载某个类时&#xff0c;但没有找到…

基于51单片机贪吃蛇小游戏

基于51单片机贪吃蛇小游戏 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用74HC573驱动点阵显示游戏画面&#xff1b; 2.上电后贪吃蛇会自动寻食&#xff1b; 3.按下四个按键中的任何一个就手动寻食了&#xff1b; ​演示视频&#xf…

库的制作 与 使用 (Linux下)

目录 动静态库的制作 前置知识 库的基本构造 问题 分析 要给什么文件 如何更好的让别人使用 库的生成 静态库的生成 makefile参考 动态库的生成 makefile参考&#xff08;包含动态库和静态库生成&#xff09; 库的使用 法一&#xff1a;放入系统路径 弊端 法二…

半导体芯片结构以及译码驱动

一.半导体芯片结构 可能并不是只有一个芯片&#xff0c;有多个芯片就需要片选线了。 二.半导体存储芯片的译码驱动 主要有两种方式&#xff1a;线选法和重合法 线选法&#xff1a;每一个存储单元都用一根字选择线选中&#xff0c;直接选中存储单元的各位。&#xff08;一维…

《人生海海》读后感

麦家是写谍战的高手&#xff0c;《暗算》《风声》等等作品被搬上荧屏后&#xff0c;掀起了一阵一阵的收视狂潮。麦家声名远扬我自然是知道的&#xff0c;然而我对谍战似乎总是提不起兴趣&#xff0c;因此从来没有拜读过他的作品。这几天无聊时在网上找找看看&#xff0c;发现了…

C++11完美转发(引用折叠、万能引用)

完美转发是指在函数模板中&#xff0c;完全依照模板的参数的类型&#xff0c;将参数传递给函数模板中调用的另外一个函数。 函数模板在向其他函数传递自身形参时&#xff0c;如果相应实参是左值&#xff0c;它就应该被转发为左值&#xff1b;如果相 应实参是右值&#xff0c;它…

大数据入门实践一:mac安装Hadoop,Hbase,FLume

一、安装Hadoop 安装hadoop参考此文&#xff0c;关键点是安装JDK和Hadoop的配置&#xff0c;为避免引用文章变收费&#xff0c;我把关键信息摘录如下&#xff1a; jdk安装和配置就不说了(我本机安装了1.8/15/17/21&#xff0c;以17为主&#xff09;&#xff0c;hadoop安装过程…

技巧解析,如何向Kimi提问才能写出更好的论文?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 今天为大家整理、分享的Kimi提问技巧&#xff0c;将对论文写作的各个阶段提供帮助&#xff0c;可以以此来辅助学术论文撰写。 在此之前&#xff0c;先为大家科普一个概念——信息熵&am…

Python学习笔记11:入门终结篇

前言 入门知识到这里基本结束了&#xff0c;这里主要讲一下input和range。这两个讲完&#xff0c;讲讲后面进阶学些啥。 range函数 之前将循环的时候讲过一点&#xff0c;这个函数是Python内置的函数&#xff0c;主要用来生成一系列数字&#xff0c;简单方便。 这里重新&…