QT 使用串口

news2024/9/19 11:56:36

目录

1.1.1  添加库,添加类

1.1.2 定义串口

1.1.3  搜索串口

1.1.4 设置和打开串口

1.1.5 读取数据

1.1.6 发送数据

1.1.7 关闭串口 

 

1.1.1  添加库,添加类

首先,QT5 是自带 QSerialPort(Qt5 封装的串口类)这个类的,使用时需要在 pro 文件里面添加一行:

QT += serialport

加入下面两个文件:

#include <QSerialPort>
#include <QSerialPortInfo>

QT5 中,串口通信是借助一个 QSerialPort 的对象来实现的,在设置 QSerialPort 对象对串口的名称、波特率、 数据位、校验位、停止位等参数后,方能对串口进行读写。下面,我总结了一下借助 QSerailPort 对串口进行设 置、打开、读、写和关闭的过程。

1.1.2 定义串口

QSerialPort *uart;
uart = new QSerialPort(this);

1.1.3  搜索串口

//availablePorts 是返回当前系统所有能用的串口,返回值是一个容器
 //QList 是容器类,在此的容器里边装的是 QSerialPortInfo
 QList<QSerialPortInfo> info = QSerialPortInfo::availablePorts();
 for(int i=0; i<info.size(); i++){
 ui->uartNameCombo->addItem(info[i].portName()); //addItem 加入数据到下拉
菜单里
 }

1.1.4 设置和打开串口

void UiMain::on_openBtn_clicked()
{
 QString uartName;
 QSerialPort::BaudRate baudRate;
 QSerialPort::DataBits dataBit;
 QSerialPort::StopBits stopBit;
 QSerialPort::Parity parityBit;
 //currentText 是获取当前选中的名字
 uartName = ui->uartNameCombo->currentText();
 //波特率
 if(ui->baudrateCombo->currentText() == "9600"){
 baudRate = QSerialPort::Baud9600;
}else if(ui->baudrateCombo->currentText() == "115200"){
 baudRate = QSerialPort::Baud115200;
 }
 //数据位
 if(ui->databitCombo->currentText() == "5"){
 dataBit = QSerialPort::Data5;
 }else if(ui->databitCombo->currentText() == "6"){
 dataBit = QSerialPort::Data6;
 }else if(ui->databitCombo->currentText() == "7"){
 dataBit = QSerialPort::Data7;
 }else if(ui->databitCombo->currentText() == "8"){
 dataBit = QSerialPort::Data8;
 }
 //停止位
 if(ui->stopbitCombo->currentText() == "1"){
 stopBit = QSerialPort::OneStop;
 }else if(ui->stopbitCombo->currentText() == "1.5"){
 stopBit = QSerialPort::OneAndHalfStop;
 }else if(ui->stopbitCombo->currentText() == "2"){
 stopBit = QSerialPort::TwoStop;
 }
 //校验位
 if(ui->parityCombo->currentIndex() == 0){
 parityBit = QSerialPort::OddParity;
 }else if(ui->parityCombo->currentIndex() == 1){
 parityBit = QSerialPort::EvenParity;
 }else if(ui->parityCombo->currentIndex() == 2){
 parityBit = QSerialPort::NoParity;
 }
 //把参数设置到 uart 里
 uart->setPortName(uartName);
 uart->setBaudRate(baudRate);
 uart->setDataBits(dataBit);
 uart->setStopBits(stopBit);
 uart->setParity(parityBit);
 if(!uart->open(QIODevice::ReadWrite)){
 QMessageBox::critical(this, "fbi warnning", "打开失败");
 }else{
 QMessageBox::information(this, "提示", "打开成功");
 }

1.1.5 读取数据

串口在收到数据后,会将数据存入接收缓冲区。此时,我们可以通过 readAll()函数将接收缓冲区的数据读出 来。当串口的接收缓冲区有数据时,QSerilaPort 对象会发出一个 readyRead()的信号。因此,我们可以编写一个槽 函数来读数据。

connect(uart, SIGNAL(readyRead()), this, SLOT(slotUartReadyRead()));

 QString uartBuf;
//假如没收完断截的数据,就会一直触发槽函数,定时器会被一直重置,不会超时
//当断截数据发完了,定时器就没人重启了,就会超时,这个时候收到的数据就是完整的数据
//也就是说收到一个字节后,20ms 内没有再次收到数据,默认为一帧数据接收完成
void UiMain::slotUartReadyRead()
{
 timer->start(20); //重启定时器 20ms
uartBuf.append(uart->readAll()); //追加写入到 uartBuf 里
}

//超时了,说明数据完成一帧数据
void UiMain::slotTimeout()
{
 timer->stop();
 QByteArray ba;
 ba = uartBuf.toUtf8();
 //QString(nRecv)不是强制转换
 //QString(nRecv)是会触发 QString 的构造函数,当然 QString(int)这种构造函数是没有
的,会报错
ui->recvEdit->appendPlainText(ba);
}

1.1.6 发送数据

使用write函数便可以把字节数组中的字节发送出去。

uart->write(buf.toUtf8()); //QString 转 char *的方法: buf.toLocal8Bit().data()

1.1.7 关闭串口 

串口不用时,可通过 close()函数将其关闭。

uart->close();

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

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

相关文章

单相锁相环原理与代码实战解释

单相锁相环程序原理如下图所示 单相锁相环原理 锁相环&#xff08;PLL&#xff09;是一种常用于同步、解调和信号处理等领域的电路或数字算法&#xff0c;其主要作用是将一个输入信号的相位与频率与参考信号进行精确的匹配。这里我们来简单解释一下单相锁相环的原理和分析。 …

自媒体行业下滑的5个标志

我是卢松松&#xff0c;洞察草根行业趋势&#xff01;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 未来大量的自媒体人将面临失业&#xff0c;80%的自媒体人收益没办法养活自己。前两天卢克文说自媒体的发展其实已经到达巅峰期&#xff0c;慢慢开始走下坡路了。我认…

Java集合框架的全面分析和性能增强

Java集合框架的全面分析和性能增强 &#x1f497;摘要&#xff1a;&#x1f497; 1. Java集合框架概述&#x1f497;1.1 Collection接口1.1.1 List接口1.1.2 Set接口1.1.3 Queue接口 &#x1f497;1.2 Map接口 &#x1f497;2. Java集合框架性能优化&#x1f497;2.1 选择合适的…

vue新学习 02 vue命令v-model,数据代理(作用域和作用域链),事件,监听,条件渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

戴琼海院士——人工智能正深刻地改变这个时代

原创 | 文 BFT机器人 2023世界人工智能大会将继续发挥“科技风向标、应用展示台、产业加速器、治理议事厅”的重要作用&#xff0c;打造“会议论坛、展览展示、评奖赛事、应用体验”四大核心内容&#xff0c;汇聚世界顶级科学家、企业家、政府官员、专家学者、国际组织、投资人…

Ssm+Mysql实现的Java Web酒店管理项目源码附带视频指导运行教程及需求文档

由ssmmysql实现的一款酒店管理系统&#xff0c;该系统实现了酒店客房预订管理的基本功能&#xff0c;还增加了图表显示统计结果的功能有需要的可以联系我分享给大家&#xff0c;下面是运行后的一些截图&#xff1a;

【密码学】四、SM4分组密码算法

SM4分组密码算法 1、概述1.1初始变量算法1.2密钥扩展算法1.3轮函数F1.3.1合成置换T1.3.2S盒 2、算法设计原理2.1非平衡Feistel网络2.2T变换2.2.1非线性变换τ2.2.2线性变换L2.2.3基础置换 2.3密钥扩展算法的设计 1、概述 SM4分组密码算法是一种迭代分组密码算法&#xff0c;采…

使用requests库发送http请求

1. get请求 # 导入requests库 import requests# 此处使用的接口地址为zrlog系统后台登录首页的地址 url "http://172.16.171.129/admin/login"# 通过requests库发送get请求 r requests.get(url url)# 以文本的方式返回响应内容 print(r.text)# 返回HTTP协议状态码…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

定时发朋友圈怎么设置?

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

sqlserver row _number函数的运用

sql语句&#xff1a; select dept_id,stcd,row_number() over (partition by dept_id ORDER BY STCD) as 排序 from tb_station_config 这段代码是使用ROW_NUMBER()函数结合窗口函数的语法&#xff0c;用于给结果集中的每一行分配一个唯一的序号。 具体解释如下&#xff1a; R…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

基于深度强化学习的DQN模型实现自动玩俄罗斯方块游戏(附详细代码讲解)

一、DQN&#xff08;Deep Q-Network&#xff09;方法概述 DQN&#xff08;Deep Q-Network&#xff09;是一种强化学习方法&#xff0c;通过结合Q-learning算法和深度神经网络来解决强化学习问题。它是深度强化学习的里程碑之一&#xff0c;由DeepMind在2013年提出&#xff0c;被…

【SQL Server】DBCC CHECKDB只是一个数据库维护命令吗?

日期&#xff1a;2023年7月27日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【数据仓库】Apache Hive初体验

为什么使用Hive&#xff1f; 使用Hadoop MapReduce直接处理数据所面临的问题&#xff1a; 人员学习成本太高需要掌握ava语言MapReduce实现&#xff0c;复杂查询逻辑开发难度太大&#xff01; 1&#xff0c;使用Hive处理数据的好处操作接口采用类SQL语法&#xff0c;提供快速开发…

MUR2080CT- ASEMI二极管的特性和应用

编辑-Z 本文将详细介绍MUR2080CT二极管的特性和应用。首先&#xff0c;将介绍MUR2080CT二极管的基本结构和工作原理。然后&#xff0c;将探讨MUR2080CT二极管的特性&#xff0c;包括正向电压降、反向漏电流和反向恢复时间等。接下来&#xff0c;将介绍MUR2080CT二极管在电源、…

linux环境安装mysql数据库

一&#xff1a;查看是否自带mariadb数据库 命令&#xff1a;rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令&#xff1a;yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二&#xff1a;将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…

18款iPad绘画软件推荐!iPad必备生产力工具

每当提起iPad&#xff0c;少不了会听到坊间流传已久的那句话&#xff0c;「买前生产力&#xff0c;买后爱奇艺」&#xff0c;确实有不少奔着生产力入手iPad的人&#xff0c;最终让iPad沦为煲剧神器或泡面盖&#xff0c;但我们没必要因噎废食&#xff0c;因为总有人能克服iPad上…

互联网医院系统源码实现:打造现代化医疗服务平台

摘要 本文将介绍一个基于Python的简化版互联网医院系统的源码实现&#xff0c;主要包含用户注册与登录、医生信息管理、在线预约挂号、在线问诊与咨询、电子病历管理、在线支付与结算等功能。该源码实现仅为示例&#xff0c;实际开发中需要考虑更多的业务逻辑和安全性。 1. …

摄像头m2dock(MAIX-II DOCK)

官方文档地址 https://wiki.sipeed.com/soft/maixpy3/zh/index.html 一、软件准备 1 烧录镜像软件 2 镜像 当前最近版本镜像文件 3 SDFormatter 4 Maixpy IDE 二、SD卡准备 1 格式化SD卡&#xff08;用SDFormatter&#xff09; 2 烧录 3 弹出&#xff0c;插入开发板中 出现…