串口通信遇到的一个问题。

2023-09-22 15:16:43

crash信息:

 W/System.err: java.io.IOException: write failed: EAGAIN (Try again)
 W/System.err:     at libcore.io.IoBridge.write(IoBridge.java:531)
 W/System.err:     at java.io.FileOutputStream.write(FileOutputStream.java:381)
 W/System.err:     at java.io.FileOutputStream.write(FileOutputStream.java:359)
 W/System.err:     at com.libmotor.MotorMsgSendHelper.sendData(MotorMsgSendHelper.java:168)
 W/System.err:     at com.libmotor.MotorMsgSendHelper.upSendData(MotorMsgSendHelper.java:79)
 W/System.err:     at com.libmotor.MotorManager.motorUpdata(MotorManager.java:218)
 W/System.err:     at com.uyu.visualtraining3h.util.MotorUtil$1.run(MotorUtil.java:245)
 W/System.err:     at java.lang.Thread.run(Thread.java:764)
 W/System.err: Caused by: android.system.ErrnoException: write failed: EAGAIN (Try again)
 W/System.err:     at libcore.io.Linux.writeBytes(Native Method)
 W/System.err:     at libcore.io.Linux.write(Linux.java:288)
 W/System.err:     at libcore.io.BlockGuardOs.write(BlockGuardOs.java:348)
 W/System.err:     at libcore.io.IoBridge.write(IoBridge.java:526)

问题描述:

在给固件做ota升级的时候,Android端从云端下载升级文件,然后再通过串口传输,把文件发送给主控板。

在文件传输的过程中,logcat后台多次出现以上crash信息,导致的结果就是ota升级失败。

主控板给Android端的反馈是等待接收数据超时,超时的原因就是收到的数据大小比预期的要小,所以就一直在等待继续接收,等不到了就是超时。

造成这个问题的原因,就是在传输的过程中,数据丢失。为啥会丢失,就是由于上面的crash引起的。

具体过程是这样的。

串口通信设置的波特率是9600,也就是说1秒钟可以传输1200个字节。

而在Android的发送端是每隔5毫秒发送一次,一次发送12字节,一秒就会发送2400字节。

这样就会导致一个问题,每一秒钟就会多出来1200字节的数据等待发送。而多出来的数据就存在了串口的缓冲区。

但是缓冲区的大小是固定的。随着时间的累加多出来的数据就会把缓冲区冲爆。

这是底层就抛出了上面的异常,写数据失败,请重试。但是Android端并没有重试机制,就造成了传输过程中数据的丢失。但是主控板并不知道数据丢了,还一直等待接收。所以就导致他抛出了接收数据超时的问题,最终导致ota升级失败。

解决问题的方案,就是Android客户端写数据的速度保持和串口传输数据同步。解决方案很简单,但是里面蕴含的知识却不少。

1.java层操作的流,都是封装的底层的,最终写数据还是靠native层,native层抛异常在java层是无能为力的。

java所有的流操作都是通过IO.Bridge进行的。

2.串口缓冲区,在网上没有查到具体的大小。

更多推荐

[正确重装docker] Win10 重装 Docker 提示 Exising installation is up to date 的正确姿势

Win10重装Docker报错Exisinginstallationisuptodate的一种情况是原来的docker没有卸载干净,或者说,没有正确卸载。巧了,我就是直接删除了,因为一些原因重装了好几次,血泪史留给各位嘲笑。一条正确的卸载命令就能够干净地卸载docker。如果你安装docker一直安装不上,请检查自己的

【Git】万字git与gitHub

🎄欢迎来到@边境矢梦°的csdn博文🎄🎄本文主要梳理在git和GitHub时的笔记与感言🎄🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆Ps:月亮越亮说明知识点越重要(重要性或者难度越大)🌑🌒🌓🌔🌕目录🌸git是分布式版本控制软

Gof23设计模式之状态模式

1.概述【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。publicinterfaceILift{//电梯的4个状态//开门状态pu

微信小程序——常用组件的属性介绍

常用的组件内容标签text文本组件类似于HTML中的span标签,是一个行内元素rich-text富文本标签支持把HTML字符串渲染为WXML结构text标签的基本使用通过text组件的selectable属性,实现长按选中文本内容的效果。只有text标签支持长按选中效果,其他的组件是不支持的结构内容代码:<viewc

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(二)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.模型训练1)数据集分析2)数据预处理相关其它博客工程源代码下载其它资料下载前言本项目专注于MovieLens数据集,并采用TensorFlow中的2D文本卷积网络模型。它结合了协同过滤算法来计算电影之间的余弦相似度,并通过用户的交互方式,以单击电影的方式,提供

npm发布vue3自定义组件库--方法一

npm发布vue3自定义组件库创建项目vuecreatetest-ui自定义组件创建自定义组件,组件名称根据你的需求来,最好一个组件一个文件夹,下图是我的示例。src/components组件和你写页面一样,所谓组件就是方便实用,不用重复搬动页面到不同的项目,可以直接install到你本地的项目,下图是一个示例。编写完

CRC校验原理与FPGA实现(含推导过程)

CRC校验原理与FPGA实现(含推导过程)写在前面一、CRC校验原理1.1CRC校验基本概念1.2CRC校验计算1.2.1发送端CRC校验码计算1.2.1.1CRC校验码计算方法1.2.1.2CRC校验码计算例子1.2.2接收端CRC校验1.2.2.1校验通过1.2.2.2数据段出错1.2.2.3CRC校验码段出错二、

有没有免费的云渲染平台?哪家云渲染平台收费更合理?

如今,越来越多的设计师开始使用云渲染平台来加快渲染速度并降低成本。许多人都想知道是否有免费的云渲染平台,或者说哪家云渲染平台收费更合理。在本文中,小编将详细介绍这些问题,帮助您更好地了解和选择适合您需求的云渲染平台。一、有免费的云渲染平台吗?首先,目前市面上没有完全免费的云渲染平台。这是因为云渲染平台建设和维护都需要资

Learn Prompt-ChatGPT 精选案例:广告文案

ChatGPT可以帮助我们生成广告文案和宣传图片,这对营销品牌建设很有帮助。通常,一个产品会有一个主要的广告词,传达设计理念或宣传产品的好处。我们可以尝试直接生成文案,看看ChatGPT有没有好的创意。假设我们的产品是一款登山鞋,我们要怎么得到令人满意的文案和宣传图片呢?背景查询​ChatGPT能帮助你快速熟悉一个领域

分享一个基于微信小程序的社区生活小助手源码调试和lw,有java+python双版本

💕💕作者:计算机源码社💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流!💕💕学习资料、程序开发、技术解答、文档报告💕💕如需要源码,可以扫取文章下方二维码联系咨询💕💕JavaWeb项目💕💕微信小程序项目💕💕

C++ STL & 标准库

STLSTL(标准模板库)是一套C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++STL的核心包括三个组件:容器(Containers)用来管理某一类对象的集合。C++提供了各种不同类型的容器,比如deque、list、vector、map等。

热文推荐