Qt扫盲-QSerialPort理论总结

news2024/11/29 2:45:14

QSerialPort理论总结

  • 一、概述
  • 二、使用流程
    • 1. 错误处理
    • 2. 阻塞串行端口编程
    • 3. 非阻塞串行端口编程
  • 三、信号
  • 四、注意事项

一、概述

QSerialPort 类其实就是一个打开串口,进行串口通信传输数据的功能类。我们可以使用QSerialPortInfo帮助类获取有关可用串行端口的信息,这个类能直接列举出系统中的所有串行端口。QSerialPortInfo类主要是我们在使用QSerialPort要通信的时候为指定我们具体操作哪一个串口,我们可以将QSerialPortInfo类的对象作为参数传递给setPort()或setPortName()方法,以分配所需的串行设备。Qt中的这个串口指的是 RS232串口,也是全双工的。

在具体使用每个函数的参数的时候,

二、使用流程

使用的流程其实也很简单
在这里插入图片描述
打开串口其实就是一个 在构造函数里传递一个 QSerialPortInfo 对象,或者一开始声明一个空参数对象,然后用 setPort() 来绑定一个串口 。

设置端口后,可以使用 open() 方法以只读(r/o)、只读(w/o)或读写(r/w)方式打开端口。因为QSerialPort是继承至QIODevice的。

注意:串口总是以独占访问方式打开的 (也就是说,没有其他进程或线程可以访问已经打开的串口,也就是程序只能在同一时刻操作一个串口)。

使用close()方法关闭端口并取消I/O操作。

成功打开后,QSerialPort将尝试确定端口的当前配置并初始化自身。您可以使用setBaudRate(), setDataBits(), setParity(), setStopBits() 和 setFlowControl()方法将端口重新配置为所需的设置。这些参数其实就是标准的一个设置流程。具体的看看那个串口协议就好。

有几个属性可以使用pinout信号,即:QSerialPort::dataTerminalReady, QSerialPort::requestToSend。也可以使用pinoutSignals()方法来查询当前的pinout信号集。

一旦知道端口可以读或写了,就可以使用read()或write()方法。另外,还可以调用 readLine() 和 readAll() 方便方法。
如果不是一次读取所有数据,剩余的数据将在以后可用,因为新的传入数据将追加到QSerialPort的内部读缓冲区。可以使用setReadBufferSize()限制读取缓冲区的大小,设置这个大小来配置一次读取的大小,这个看具体的协议内容的大小。能一次读完就一次读完最好。

1. 错误处理

如果在任何时间点发生错误,QSerialPort将发出 errorOccurred() 信号。
您还可以调用error()来查找上次发生的错误类型。我们从整个错误类型知道是为什么错误

使用阻塞串行端口编程与使用非阻塞串行端口编程完全不同。阻塞串行端口不需要事件循环,通常会使用更简单的代码。然而,在GUI应用程序中,阻塞串口应该只用于非GUI线程,以避免冻结用户界面。

2. 阻塞串行端口编程

QSerialPort提供了一组函数,用于挂起调用线程,直到发出特定信号。下面的例子就是一个阻塞式的。

这些函数可以用来实现阻塞串口:

  • waitForReadyRead()阻塞调用,直到有新的数据可供读取。
  • waitForBytesWritten()阻塞调用,直到一个数据负载被写入串口。

下面就是 读数据,用的 read() 来读 示例如下:

int numRead = 0, numReadTotal = 0;
char buffer[50];

for (;;) {
      numRead  = serial.read(buffer, 50);

      // Do whatever with the array

      numReadTotal += numRead;
      if (numRead == 0 && !serial.waitForReadyRead())
          break;
}

如果waitForReadyRead()返回false,则表示连接已关闭或发生错误。

写也是一样的,就是在循环中使用 waitForBytesWritten() 来完成

3. 非阻塞串行端口编程

非阻塞式编程就是用的信号槽的方式。

  1. 在读数据的时候:可以使用 read()readAll() 方法,以及 readyRead() 信号。
    readyRead()信号是继承至 QIODevice:这个信号的含义即是-> 每当有新的数据可以从设备的当前读取通道读取时,该信号就会发出一次。只有在有新数据可用时,比如有新的网络数据到达网络套接字时,或者有新数据块添加到设备时,才会再次触发。
    readyRead()不是递归触发的;如果你重新进入事件循环或在与readyRead()信号相连的插槽中调用waitForReadyRead(),信号将不会重新发出(尽管waitForReadyRead()仍然可能返回true)。
    实现QIODevice派生类的开发人员注意:当有新数据到达时,应该总是发出readyRead()(不要仅仅因为缓冲区中还有数据需要读取而发出它)。在其他情况下不要触发readyRead()。

  2. 在写数据的时候:使用 write() 方法和 bytesWritten() 信号。
    每当有数据写入设备的当前写入通道时,就会发出该信号。 bytes参数设置为写入该有效载荷的字节数。
    bytesWritten()不会递归地发出;如果你重新进入事件循环或在连接bytesWritten()信号的插槽中调用waitForBytesWritten(),信号将不会重新发出(尽管waitForBytesWritten()仍然可能返回true)。

三、信号

在 QSerialPort 里面的信号,主要是一些配置发生改变的信号,
在这里插入图片描述

四、注意事项

QSerialPort类也可以与QTextStream和QDataStream的流操作符(操作符<<()和操作符>>())一起使用。但是,有一个问题需要注意:在尝试使用运算符>>()重载运算符读取之前,请确保有足够的数据可用。

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

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

相关文章

JavaEE高阶---Spring AOP

一&#xff1a;什么是Spring AOP&#xff1f; 首先&#xff0c;AOP是一种思想&#xff0c;它是对某一类事情的集中处理。 如用户登录权限的效验&#xff0c;没学 AOP 之前&#xff0c;我们所有需要判断用户登录的页面&#xff0c;都要各自实现或调用验证的方法。然后有了 AOP …

【Linux进程间通信】

Linux进程间通信进程间通信介绍进程间通信的概念进程间通信的目的进程间通信的本质进程间通信的分类管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤匿名管道读写规则匿名管道的特点匿名管道的四种特殊情况匿名管道的大小命名管道命名管道的原理使用命令创建命名…

【浮点数在内存中的存储规则】

我们知道&#xff0c;整型在内存中的存储比较简单&#xff0c;在内存中都是以二进制来存储的。然而&#xff0c;浮点型在内存中的存储较为复杂。下面来详细探讨&#xff1a; 直接举一个例子&#xff1a; int main() { int n 9; float *pFloat (float *)&n; printf("…

工业树莓派解决传统数据设备数据上云问题

一、前言 工业4.0的浪潮下&#xff0c;许多中小型制造业企业渴望通过数字化转型谋求新的发展动力&#xff0c;然而&#xff0c;在转型之路上常常会面临一个问题&#xff1a;传统数据采集设备数量多、种类杂&#xff0c;不支持比较新颖的现场总线协议或者通信技术&#xff0c;最…

java 微服务框架介绍 SpringCloud Eureka注册中心 Nacos注册中心

为什么要学习微服务框架 认识微服务 服务架构演变 单体架构 分布式架构 微服务结构 SrpingCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址&#xff1a;https://spring.io/projects/spring-cloud。 服务拆分及远程调用 服务拆分注意事项 我们查询的时候需要…

Java基础 —— 编程入门

一、比特(bit)和字节(byte)一个0或者一个1存储为一个比特(bit)&#xff0c;是计算机中最小的存储单位。计算机中是最基本的存储单元是字节(byte)。每个字节由8个比特构成。计算机就是一系列的电路开关。每个开关存在两种状态:关(off)和开(on)。如果电路是开的&#xff0c;它的值…

Ubuntu物理真机提高访问速度

这里不适合小白用户&#xff0c;只是做出几点提醒。 iguge学术助手 纯Ubuntu真机&#xff0c;是没办法访问外部网络的&#xff0c;先用百度搜索iguge下载一个&#xff0c;安装在Firefox浏览器插件上&#xff08;edge或者chrome也行&#xff09;。 免费的不好用&#xff0c;建…

算法之初始动态规划

目录 前言&#xff1a; 初始动态规划 0-1背包问题 0-1背包问题升级版 问题&#xff1a;如何巧妙解决“双十一”购物是的凑单问题&#xff1f; 总结&#xff1a; 前言&#xff1a; 淘宝的“双十一”购物节有各种促销活动&#xff0c;比如“满 200 元减 50 元”。假设你女朋友…

SpringBoot使用 axis 实现webservice客户端(亲测可行)

目录一、webservice在线验证服务端接口地址二、使用 axis 实现webservice客户端代码示例2.1、服务端地址使用qq在线接口验证接口2.2、webservice客户端示例代码一、webservice在线验证服务端接口地址 qq 在线验证接口&#xff1a;http://www.webxml.com.cn/webservices/qqOnli…

[飞腾]Trace32使用概述

最近将多年来收集到的教学视频、国内外图书、源码等整理整合拿出来&#xff0c;涉及arm、Linux、python、信号完整性、FPFA、DSP、算法、stm32、单片机、制图、电子模块、kali、出版社图书等。资料目前约1.5TB。资料详情请参阅&#xff1a; 1.5TB电子工程师资料详细介绍https:/…

软件定义的存储时代即将结束

数据存储、安全性、保护和整体管理对于大多数组织的生存至关重要。 从软件定义的存储时代的结束到本地存储的回归&#xff0c;Nyriad的首席营收官概述了他对最新技术趋势的看法&#xff0c;并提供了他对2023年将会发生的预测。 从以CPU为中心的软件定义存储过渡到卸载辅助架构…

Java 开发环境配置 || Java 基础语法

Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境&#xff0c;以及不同系统下的环境变量怎么配置。 window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK&#xff0c;下载地址&#xff1a;Java Downloads | Oracle 点击如下下载按钮&#xff…

阿里CCO:基于Hologres的亿级明细BI探索分析实践

作者&#xff1a;张乃刚&#xff08;花名&#xff1a;隽驰)&#xff0c;CCO数据开发 CCO是Chief Customer Officer的缩写&#xff0c;也是阿里巴巴集团客户体验事业部的简称。随着业务的多元化发展以及行业竞争的深入&#xff0c;用户体验问题越来越受到关注。CCO体验业务运营…

【前端】CSS进阶

四、选择器进阶 1.1后代选择器&#xff1a;空格 作用&#xff1a;根据HTML标签的嵌套关系&#xff0c;选择父元素后代中满足条件的元素 选择器语法&#xff1a;选择器1 选择器2{css} 结果&#xff1a; 在选择器1所找到标签的后代&#xff08;儿子、孙子、重孙子…&#xf…

Zipkin基础知识及Linux下搭建服务端

Zipkin组成 Zipkin的基础架构&#xff0c;他由4个核心组件构成&#xff1a;分别是Collector、Storage、RESTful API、WebUI Collector&#xff1a;收集器组件&#xff0c;它主要用于处理从外部系统发送过来的跟踪信息&#xff0c;将这些信息转换为 Zipkin 内部处理的 Span 格式…

最快速的获取元素的方法?快到你想象不到~

1、首先我们先准备一个div标签&#xff0c;id定义为box<div id"box"></div>2、通常情况下我们会使用原生js获取&#xff0c;如下所示&#xff1a;let box document.getElementById("box"); // 或者 let box document.querySelector("#b…

【Vue中使用Echarts】Echarts的基本配置

文章目录一、Echarts的基础配置二、柱状图表1.原始柱状图2.经过美化的柱状图3.横向柱状图一、Echarts的基础配置 需要了解的主要配置&#xff1a;series xAxis yAxis grid tooltip title legend color 属性作用series系列列表。每个系列通过 type 决定自己的图表类型 大白话&am…

ConvNeXt V2学习笔记

ConvNeXt V2学习笔记 ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders Abstract 在改进的架构和更好的表示学习框架的推动下&#xff0c;视觉识别领域在21世纪20年代初实现了快速现代化和性能提升。例如&#xff0c;以ConvNeXt[52]为代表的现代Co…

目标检测:RCNN、SppNet、Fast RCNN、Faster RCNN是如何过渡的?

目标检测&#xff1a;RCNN、SppNet、Fast RCNN、Faster RCNN、思想总结R-CNN候选框生成Training迁移学习分类与回归候选框R-CNN存在的问题SppNet面临的问题空间金字塔池化特征图映射SppNet存在的问题Fast R-CNNR-CNN与SppNet存在的问题核心思想模型流程ROI Pooling多任务损失的…

力扣刷题记录——326.3的幂、338. 比特位计数、342. 4的幂、350. 两个数组的交集 II

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《326.3的幂、338. 比特位计数、342. 4的幂、350. 两个数组…