QT串口发送数据的一个问题

一.问题与解决

1.问题:

  在做串口发送固件升级数据的时候,总是莫名提示错误:

QObject::startTimer: Timers cannot be started from another thread

QObject::startTimer: Timers cannot be started from another thread

QObject::startTimer: Timers cannot be started from another thread

用多线程也没有用,后来发现程序写的不够严谨,导致发送和接收出现了一些不太常见的问题,分享如下。

问题程序示例:

void MainWindow::startTransfer()

{

    localFile = new QFile(fileName);

    if (!localFile->open(QFile::ReadOnly)) {

        qDebug() << "client: open file error!";

        return;

    }

    payloadSize = 1024;   

    bytesWritten = 0;

    bytesToWrite = 0;

    totalBytes = localFile->size();

    outBlock = localFile->read(totalBytes);

    while((totalBytes-bytesWritten) >= payloadSize)

    {

        serial.write(outBlock.mid(bytesWritten,payloadSize));

        bytesWritten = bytesWritten +payloadSize;

    }

    if((totalBytes-bytesWritten) > 0)

    {

        serial.write(outBlock.mid(bytesWritten,(totalBytes-bytesWritten)));

    }

    localFile->close();

}

2.解决

  发送完成后加入代码:serial.waitForBytesWritten(),修改为:

void MainWindow::startTransfer()

{

    localFile = new QFile(fileName);

    if (!localFile->open(QFile::ReadOnly)) {

        qDebug() << "client: open file error!";

        return;

    }

    payloadSize = 1024;  

    bytesWritten = 0;

    bytesToWrite = 0;

    totalBytes = localFile->size();

    outBlock = localFile->read(totalBytes);

    while((totalBytes-bytesWritten) >= payloadSize)

    {

        serial.write(outBlock.mid(bytesWritten,payloadSize));

        if(!serial.waitForBytesWritten())

        {

            qDebug()<<"serial write error";

        }

        bytesWritten = bytesWritten +payloadSize;

    }

    if((totalBytes-bytesWritten) > 0)

    {

        serial.write(outBlock.mid(bytesWritten,(totalBytes-bytesWritten)));

        if(!serial.waitForBytesWritten())

        {

            qDebug()<<"serial write error";

        }

    }

    localFile->close();

}

二.原理分析

1.在Qt中,进行串口通信时,QSerialPort 类是一个非常重要的类,它封装了与串口通信相关的功能。当你通过串口发送数据时,数据并不是立即被发送到物理设备上的,而是先被放入到QSerialPort的内部缓冲区中,然后由Qt的底层机制(可能是依赖于操作系统的串口驱动)负责将缓冲区中的数据发送给目标设备。

2.serial.waitForBytesWritten(int msecs = 30000) 函数的作用就是等待直到所有待发送的字节都被写入到底层的串口硬件,或者直到指定的毫秒数(msecs)过去。这个函数对于确保数据的完整发送非常重要,尤其是在需要连续发送多条消息或者发送后需要立即读取响应的场合。

参数说明:

msecs:这是一个可选参数,表示等待的最大时间(以毫秒为单位)。如果在这段时间内,所有的字节都被成功写入到底层串口硬件,函数将返回true。如果超时(即指定的时间过去了,但仍有数据未被写入),函数将返回false。如果msecs被设置为-1,则函数将无限期地等待,直到所有字节都被写入。

使用场景:

确保数据完整性:在发送重要数据后,你可能需要确保这些数据已经完全被发送出去,此时就可以调用waitForBytesWritten()函数来等待发送完成。

同步通信:在进行同步通信时,你可能需要发送一条命令后,立即读取命令的响应。在这种情况下,使用waitForBytesWritten()可以确保命令已经完全发送,然后再读取响应。

性能优化:在一些性能敏感的场合,你可能需要减少不必要的等待时间。通过调整waitForBytesWritten()的等待时间,可以在确保数据完整性的同时,尽量减少等待时间,从而提高程序的性能。

需要注意的是,虽然waitForBytesWritten()函数非常有用,但在一些情况下(如非阻塞通信模式),你可能不需要显式地等待所有字节都被写入。此外,如果串口通信出现问题(如设备断开连接),该函数可能会无限期地等待(如果msecs被设置为-1),因此在使用时需要注意处理这种情况。

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

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

相关文章

python 2024-9

第一课 问题 a, b 求最大值&#xff1f;分类讨论 if a > b:print("最大值 "&#xff0c; a)else:print("最大值 "&#xff0c; b)a, b, c 求最大值&#xff1f; 条件语句 if ... elif ... else列表最大值&#xff1f;与参照物循环比较 a [1.7, 1.…

机器学习:opencv--图像金字塔

目录 一、图像金字塔 1.图像金字塔是什么&#xff1f; 2.有哪些常见类型&#xff1f; 3.金字塔的构建过程 4.图像金字塔的作用 二、图像金字塔中的操作 1.向下采样 2.向上采样 3.注意--无法复原 三、代码实现 1.高斯金字塔向下采样 2.高斯金字塔向上采样 3.无法复…

基于SpringBoot+Vue+MySQL的志愿服务管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会对志愿服务需求的日益增长&#xff0c;传统的志愿服务管理方式已难以满足高效、透明、精准的管理需求。为提升志愿服务组织的运营效率&#xff0c;优化资源配置&#xff0c;增强志愿者参与度和满意度&#xff0c;开发基…

LinuxC高级作业1

1.已知网址www.hqyj.com截取出网址的每一个部分 2.整理思维导图 3.将配置桥接网络的过程整理成文档 i)) 保证虚拟机提供了桥接模式 菜单栏中 ----> 虚拟机 -----> 设置 -----> 网络适配器 ii) 保证虚拟机可以设置桥接网络 菜单栏中 ----> 编辑 -----> 虚拟网…

linux第一课(操作系统核心)

一.关于linux (1)linux是一款开源的操作系统(是多用户&#xff0c;多任务&#xff0c;多线程)。 (2)一般所说的linux指的是linux核心&#xff0c;即对计算机硬件资源负责调度管理&#xff0c;主要职责是进程管理&#xff0c;内存管理文件系统&#xff0c;设备驱动&#xff0c…

禹神3小时快速上手typescript

一、TypeScript简介 TypeScript 由微软开发&#xff0c;是基于 JavaScript 的⼀个扩展语⾔。TypeScript 包含了 JavaScript 的所有内容&#xff0c;即&#xff1a; TypeScript 是 JavaScrip t 的超集。TypeScript 增加了&#xff1a;静态类型检查、接⼝、 泛型等很多现代开发特…

事件冒泡和事件捕获一般用在什么场景

事件冒泡和事件捕获是JavaScript中处理DOM事件时的两种不同传播方式&#xff0c;它们各自有特定的应用场景。 事件冒泡&#xff08;Event Bubbling&#xff09; 定义&#xff1a;事件冒泡是指当某个元素上的事件被触发时&#xff0c;这个事件会沿着DOM树向上传播&#xff0c;…

算法练习题24——查找杨辉三角中的组合数

题目描述 杨辉三角中的每个元素是一个组合数。第 ( i ) 行的第 ( j ) 个元素表示组合数 ( C(i, j) ) &#xff0c;即从 ( i ) 个元素中选 ( j ) 个元素的组合方式。已知一个正整数 ( N )&#xff0c;要求在杨辉三角中找到这个数&#xff0c;并输出它在杨辉三角中的具体位置。位…

(计算机毕设)基于SpringBoot+Vue的“乐锄”农产品销售网站的设计与实现

毕业设计&#xff08;论文&#xff09; 博主可接毕设&#xff01;&#xff01;&#xff01; 基于SpringBootVue的“乐锄”农产品销售网站的设计与实现 摘 要 传统的农资采购销售模式&#xff0c;造成农业生产的效率和质量低&#xff0c;人们对食品安全问题关注不断增加&#x…

golang 字符串浅析

go的字符串是只读的 测试源代码 package mainimport ("fmt""unsafe" )func swap(x, y string) (string, string) {return y, x }func print_string(obj *string, msg string) {string_ptr : (*[2]uintptr)(unsafe.Pointer(obj))first_obj_addr : string_…

前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发

mock是什么 Mock生成随机数据,拦截Ajax 请求&#xff0c;前后端分离&#xff0c;让前端攻城师独立于后端进行开发。 增加单元测试的真实性 通过随机数据,模拟各种场景。 在实际开发过程中&#xff0c;前端是通过axios来请求数据的&#xff0c;很多时候前端开发者就是通过写固定…

idea2023版使用Free MyBatis plugin插件报错

项目场景&#xff1a; 新版的idea使用Free MyBatis plugin插件报错 问题描述 错误信息 java.lang.Throwable: #LineMarkerInfo(T, TextRange, Icon, int, Function, GutterIconNavigationHandler, Alignment) is deprecated and going to be removed soon. Please use LineM…

1.Seata 1.5.2 seata-server搭建

一&#xff1a;Seata基本介绍 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 详见官网链接&#xff1a;https://seata.apache.org/zh-cn/ 1.历史项目里的使用经验&#xff1a; 之前公司里的oem用户对应的App…

Docker 容器网络技术

Docker 容器网络技术 一、概述 Docker 容器技术在微服务架构和云原生应用中扮演着重要角色。容器的轻量化和快速启动特性&#xff0c;使得它们成为现代应用部署的首选。然而&#xff0c;容器的网络连接和管理是一个复杂的问题&#xff0c;尤其是当涉及到容器间通信时。Docker…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Docker学习笔记(四)单主机网络

简介 Docker从容器中抽象除出了底层的主机连接网络&#xff0c;使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址&#xff0c;其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。   但是容器内运行的软件没法方便的确定主机IP地址…

SEGGERS实时系统embOS推出Linux端模拟器

SEGGER 发布了两个新的 embOS 仿真模拟器&#xff1a;embOS Sim Linux 和 embOS-MPU Sim Linux。 通过模拟 Linux 主机系统上的硬件&#xff0c;取代物理硬件&#xff0c;为开发人员提供了一种无缝的方式来构建原型和测试应用程序。 embOS Sim Linux 端口支持 32 位和 64 位系…

网络安全产品认证证书大全(持续更新...)

文章目录 一、引言二、《计算机信息系统安全专用产品销售许可证》2.1 背景2.2 法律法规依据2.3 检测机构2.4 检测依据2.5 认证流程2.6 证书样本 三、《网络关键设备和网络安全专用产品安全认证证书》3.1 背景3.2 法律法规依据3.3 检测机构3.4安全认证和安全检测依据标准3.5 认证…

费用管理系统如何优化企业年报台账归集流程?

随着企业规模的扩大和业务的复杂化&#xff0c;财务管理工作的重要性日益凸显。其中&#xff0c;年报台账归集作为财务管理的重要环节&#xff0c;不仅关乎企业财务数据的准确性和完整性&#xff0c;更直接影响到企业决策的科学性和合理性。面对海量的财务数据和复杂的归集要求…

下载 llama2-7b-hf 全流程【小白踩坑记录】

1、文件转换 在官网 https://ai.meta.com/llama/ 申请一个账号&#xff0c;选择要下载的模型&#xff0c;会收到一个邮件&#xff0c;邮件中介绍了下载方法 执行命令 git clone https://github.com/meta-llama/llama.git​ &#xff0c;然后执行 llama/download.sh&#xff0c…