Qt QSerialPort ReadAll() 报错 串口读取错误,非法内存,及小项目开发感悟

简介: 小背景

从串口读数据,本来是很简单的问题,但是这次串口的数据量有点大,而我的上位机也有PC变成了ARM的嵌入式系统,性能相对PC有所下降。以前写去读串口,都是在PC下的程序,也一直用的都是readAll函数,没有啥大问题。这次出现了问题,在第一版本中,出现了丢包严重,好多数据丢失,开始一度怀疑都是单片机出数的问题,所以优先解决单片机问题,解决方法很简单,把现有程序改成PC版,在PC上通过串口连接到单片机的串口上,发现单片机确实存在出数据量不够的因素。随后将单片机波特率调至高波特率。在PC上验证数据可以。


2 串口readAll读取数据问题


移植到ARM嵌入式系统上面,画面依旧卡顿,无解,随打印Log查看发现,每次readAll的数据长度都不一样,而我的解析函数都是默认解析第一帧,和面的数据等于全部丢失,导致画面卡顿;这里要说一下,以前以我浅陋的认识认为中断的方式就是一帧一帧的来接受,但是这几天学习才发现我以前的认识是错误的,中断只是在接收到有数据的时候就会触发了,所以这里在使用串口的时候,最后可以加上结束符,这样也好判断包的完整性。


3 线程问题


其实包的完整性不是我第一个考虑的问题,我第一个考虑的问题是ARM开发板的处理性能问题,打开资源管理器查看,发现有一个核心CPU占用率95左右,有时直接100了。所以第一想到的可能是应为CPU性能有限,而我在界面上有大量的绘制工作,导致数据处理不及时或者画面渲染卡顿造成,所以开了线程。一开线程,那就发现我以前的认知又错了。一直以为只要写在线程类里面的东西,都会去线程里面,后面通过打印线程ID发现根部不是一回事,线程ID和主线程ID一样,一度怀疑开了一个假线程,后面学习才发现,只有在run函数里面的才会去到线程里面。这里又一个知识点。开了线程还是没有解决我的问题。画面依旧卡顿。考虑可能是中断的问题,所以转换思路,换直接读取,直接在run函数里面while(1)读取串口数据,还是无解,画面依旧卡顿,这才回到上面“2”中的内容,打印串口readAll数据发现每次接收的数据量都不是一样的。找到方法就很简单了,在我的数据解析函数里面加入拆包处理就可以了。完美决绝问题。


4 线程遇到内存错误问题


线程其实就是一个最大的坑,这里当我窃喜的时候,程序运行无缘无故崩溃 Debug发现都是内存错误,传说中的问题终于让我遇到,但是呢,没有解决,怎么改也不行,都是内存先关的问题,尝试过吧串口对象设置静态、全局、指针、实体。均失败,都会有程序崩溃线程,最后还是把串口数据读取移动到主进程中,才解决。


5 小总结


绕了一圈最后发现还是出现在读取数据理解的问题上,还是自己的开发经验不足呀。不过还是解决了这个问题了,老板看到新的画面丝滑搬流畅,很开心,哈哈哈哈。


6 题外话


这次开发有个插曲,在第一版中,客户给的文件中图形画面模糊,而且是黑白的,画面描述很多地方都不具体,导致做出来的东西都是摸索出来的,很不满意,加上客户还让出六份文档,导致我个人直接崩溃,完全没有得到客户的认可,文档也不是客户想要的,这里是因为客户的问题“上位机”软件,我没有理解到客户的点,导致文档全部作废。直接爆发,和老板干了一架。估计这也没谁了,还是太年轻,自己也没有摆好自己的位置,我们做开发的,不就是解决客户的问题吗,客户要是知道自己要啥,那还找我们做啥了,希望在后面的职业生涯中,自己可以稳重点,不要还和一个刚毕业的大学生的一样。逼近也不小了,总不能天天让被人哄着。


 


目录
相关文章
|
4月前
|
关系型数据库 MySQL 数据库
实时计算 Flink版操作报错合集之网络缓冲池(NetworkBufferPool)中可用内存不足,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
1月前
|
Windows
qt Error 20报错
这篇文章讨论了Qt开发中遇到的Error 20报错问题,并提供了将Windows服务中的NahimicService设置为手动运行或关闭的解决方案。
108 0
qt Error 20报错
|
3月前
【BUG记录】力扣报错:内存空间不足
【BUG记录】力扣报错:内存空间不足
|
4月前
|
移动开发 监控 Serverless
函数计算操作报错合集之机器配置显示为1G内存,但报错显示0.12G,是什么原因
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
4月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
存储 JavaScript 前端开发
阿里云云效操作报错合集之如何解决云效流水线内存溢出的问题
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
4月前
|
移动开发 运维 JavaScript
阿里云云效操作报错合集之遇到Node.js的内存溢出问题,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
4月前
|
DataWorks 关系型数据库 API
DataWorks操作报错合集之使用PolarDB Reader时,遇到报错:内存溢出,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
关系型数据库 MySQL Java
实时计算 Flink版操作报错之整内存和cpu分配之后启动报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。