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

本文主要是介绍Qt QSerialPort ReadAll() 报错 串口读取错误,非法内存,及小项目开发感悟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 小背景

从串口读数据,本来是很简单的问题,但是这次串口的数据量有点大,而我的上位机也有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 题外话

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

 

这篇关于Qt QSerialPort ReadAll() 报错 串口读取错误,非法内存,及小项目开发感悟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742893

相关文章

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav