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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本