【Qt】QT串口接收一帧数据有时候不完整,需要接收两次

1. 现象

//正常数据
Read:  "12345678901234567890123456789012345678901234567890"		//异常数据
Read:  "12345678901234567890123456789012"						
Read:  "345678901234567890"

2. 问题代码

#include "serialbase.h"QString serialNameLinux = "/dev/ttyS4";SerialBase::SerialBase(QObject *parent): QObject{parent}
{// 设置串口号SerialPort.setPortName(serialNameLinux);// 打开串口SerialPort.open(QIODevice::ReadWrite);// 设置波特率SerialPort.setBaudRate(115200);//设置数据位数SerialPort.setDataBits(QSerialPort::Data8);//设置奇偶校验SerialPort.setParity(QSerialPort::NoParity);// 设置流控制SerialPort.setFlowControl(QSerialPort::NoFlowControl);//设置停止位SerialPort.setStopBits(QSerialPort::OneStop);
}SerialBase::~SerialBase()
{SerialPort.close();
}void SerialBase::serialRx(void)
{SerialPort.waitForReadyRead(10);QByteArray rxBuff = SerialPort.readAll();if(rxBuff.length() > 0)qDebug() << "Read: " << rxBuff;
}//周期性调用这个函数
void SerialBase::serialReadTest()
{serialRx();
}

3. 问题分析

  • 问题出在SerialPort.waitForReadyRead(10);这行代码,手册中的说明如下:
    在这里插入图片描述
  • 超时时间到达之前接收到数据,则发送信号readyRead(),超时时间到达的时候,返回true
  • 注意,如果超时时间到达时,数据帧没有接收完,就出现了如上问题。
  • 超时时间到达时还没有数据返回,则直接返回false

4. 解决思路

接收到readyRead()信号后,再调用waitForReadyRead()等待一段时间。

4. 修改后代码

#include "serialbase.h"QString serialNameLinux = "/dev/ttyS4";SerialBase::SerialBase(QObject *parent): QObject{parent}
{// 设置串口号SerialPort.setPortName(serialNameLinux);// 打开串口SerialPort.open(QIODevice::ReadWrite);// 设置波特率SerialPort.setBaudRate(115200);//设置数据位数SerialPort.setDataBits(QSerialPort::Data8);//设置奇偶校验SerialPort.setParity(QSerialPort::NoParity);// 设置流控制SerialPort.setFlowControl(QSerialPort::NoFlowControl);//设置停止位SerialPort.setStopBits(QSerialPort::OneStop);//接收到数据后,再等待一段时间connect(&SerialPort, SIGNAL(readyRead()), this, SLOT(waitNextMs()));
}SerialBase::~SerialBase()
{SerialPort.close();
}void SerialBase::serialRx(void)
{SerialPort.waitForReadyRead(10);QByteArray rxBuff = SerialPort.readAll();if(rxBuff.length() > 0)qDebug() << "Read: " << rxBuff;
}void SerialBase::waitNextMs()
{SerialPort.waitForReadyRead(20);qDebug() << "wait";
}void SerialBase::serialReadTest()
{serialRx();
}

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

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

相关文章

【rk3368 android6.0 恢复出厂设置功能】

rk3368 android6.0 恢复出厂设置功能 恢复出厂设置三种方法一&#xff0c;设置--进入恢复出厂设置页面二&#xff0c;发送广播形式三&#xff0c;命令形式总结 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 恢复…

llinux C语言在网络编程时使用标准IO

目录 fdopen(3)函数 使用标准IO发送数据 使用标准IO接收数据 注意 先看一个简单的TCP客户端程序&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <sys/socket.h> #include <stdlib.h> #include <string.h> #include <…

哈尔滨华时信息公司是怎么样帮助社会残障人士解决生活保障

在社会进步的今天&#xff0c;关注弱势群体的生活保障问题显得尤为重要。哈尔滨华时信息公司积极响应社会责任&#xff0c;通过多项举措&#xff0c;为社会残障人士提供生活保障&#xff0c;助力他们融入社会、享受尊严生活。 1. 提供就业机会&#xff1a; 华时信息公司积极招…

以题为例浅谈DFS算法

DFS算法是什么 深度优先搜索算法(Depth First Search 简称DFS算法)&#xff0c;一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件&#xff0c;搜索将回溯到发现节点v的…

php彩虹/异世界云商全解系统

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

Spring Boot+Vue前后端分离项目如何部署到服务器

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

IO流(1)——文件输入输出流(FIleInputStream、FIleOutputStream)

IO流概述 IO流应用场景 FileInputStream&#xff08;文件字节输入流&#xff09; 方法 使用read&#xff08;&#xff09;每次读取一个字节的弊端 使用read&#xff08;byte[] buffer&#xff09;方法每次读取多个字节&#xff0c;取多少&#xff0c;倒多少 解决方法 文件字节…

C++ 开发篇+一个简单的数据库管理系统ZDB

说明&#xff1a;本文供数据库爱好者和初级开发人员学习使用 标签&#xff1a;数据库管理系统、RDBMS、小程序、C、C程序 系统&#xff1a;Windows 11 x86 CPU &#xff1a;Intel IDE &#xff1a;Visual Studio 2022 语言&#xff1a;C语言 标准&#xff1a;C14 提示&#xff…

在idea中配置tomcat服务器,部署一个项目(下载教程加链接)

第一步&#xff1a;把Tomcat下载好 ww​​​​​​​Apache Tomcat - Welcome! 链接如上&#xff1a;进去后在左边找到Tomcat8点击进去后 找到图下内容 第二步&#xff1a; 打开这个文件点击bin进去 会出现一个黑色框框&#xff0c;也就是服务器 完成后就可以在浏览器输入…

掘根宝典之C++普通迭代器和反向迭代器详解

简介 迭代器是一种用于遍历容器元素的对象。它提供了一种统一的访问方式&#xff0c;使程序员可以对容器中的元素进行逐个访问和操作&#xff0c;而不需要了解容器的内部实现细节。 C标准库里每个容器都定义了迭代器&#xff0c;这迭代器的名字就叫容器迭代器 迭代器的作用类…

Yolo系列算法-理论部分-YOLOv1

0. 紧接上一篇目标检测算法的介绍 基于深度学习的目标检测算法概述-CSDN博客 本篇YOLO算法系列&#xff0c;参考优秀作者-AI菌&#xff0c;文章链接&#xff1a;YOLO系列算法精讲&#xff1a;从yolov1至yolov8的进阶之路&#xff08;2万字超全整理&#xff09;_yolov9-CSDN博…

deepin23beta中SQLite3数据库安装与使用

SQLite 是一个嵌入式 SQL 数据库引擎&#xff0c;它实现了一个自包含、无服务器、零配置、事务性 SQL 数据库引擎。 SQLite 的代码属于公共领域&#xff0c;因此可以免费用于任何商业或私人目的。 SQLite 是世界上部署最广泛的数据库&#xff0c;其应用程序数量之多&#xff0c…