Android问题笔记四十八:蓝牙obtainMessage数据传输部分数据丢失乱序问题

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总
游戏脚本-辅助自动化Android控件全解手册再战Android系列
Scratch编程案例软考全系列Unity3D学习专栏
蓝桥系列ChatGPT和AIGC

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

根据google的demo写的蓝牙通信程序,在接收蓝牙的信息时,发现收到的数据有部分丢失和乱序
在电脑上串口上查看蓝牙模块数据传输结果正常,
但是当利用蓝牙传数据的时候,上位机端(安卓手机客户端)就会出现数据丢失的问题,而且数据丢的特别严重:

既然串口上面输出的结果是正确的,那么证明单片机本身没有任何问题。
接着看蓝牙模块:蓝牙模块hc-05,支持蓝牙v2.0,传输速率大约在1.8M/s—2.1M/s,所以一秒传那一点数据没有任何压力。那么问题出在哪里呢?还有最后一个可以怀疑的目标:上位机。

上位机上蓝牙通信的代码用得是google的官方demo,所以一开始并没有怀疑过。
然后demo里面接收数据是这么写的:

public void run() {Log.i(TAG, "BEGIN mConnectedThread");byte[] buffer = new byte[1024];int bytes;// 继续听InputStream同时连接while (true) {try {// 读取输入流bytes = mmInStream.read(buffer);// 发送获得的字节的用户界面mHandler.obtainMessage(RetimeFragment.MESSAGE_READ, bytes, -1, buffer).sendToTarget();} catch (IOException e) {Log.e(TAG, "disconnected", e);connectionLost();break;}}
}

然后handler的处理是这么写的:

case MESSAGE_READ://3读取数据byte[] readBuf = (byte[]) msg.obj;String readMessage = new String(readBuf, 0, msg.arg1);mInputEditText.getText().append(readMessage);fmsg += readMessage;

然后在UI线程中出现了部分数据丢失的情况……

在网上查阅资料,handler消息传递有两种方法,一种就是上面代码里面给出来的obtainMessage()方法,另外一种就是sendMessage()方法。

两种方法的主要区别是,obtainMessage()从全局对象池中取出Message对象,而sendMessage()则是new一个新的对象,因此obtainMessage()的效率更高。

Android更推荐我们通过Message.obtain()或者Handler.obtainMessage()获取Message对象。是因为obtain方法并不一定是直接创建一个新的实例,而是先从消息池中看有没有可用的Message实例,存在则直接取出并返回这个实例。反之如果消息池中没有可用的Message实例,则根据给定的参数new一个新Message对象。通过分析源码可得知,Android系统默认情况下在消息池中实例化10个Message对象。

因此,可能在从全局对象池中取Message对象,覆盖了发送到UI线程中的消息队列中的对象,从而导致数据丢失的情况。因此改成使用sendMessage(),new出新的Message对象来解决这个问题。

使用sendMessage():

case MESSAGE_READ:Bundle data = msg.getData();String readMessage = data.getString("BTdata");fmsg += readMessage;

对应的run()

 public void run() {byte[] buffer = new byte[1024];int bytes;String readMessage;// Keep listening to the InputStream while connectedwhile (true) {try {int availableBytes = mmInStream.available();if (availableBytes > 0) {bytes = mmInStream.read(buffer);Message msg = new Message();Bundle data = new Bundle();readMessage = new String(buffer,0,bytes);data.putString("BTdata",readMessage);msg.what = RetimeFragment.MESSAGE_READ;msg.setData(data);mHandler.sendMessage(msg);}} catch (IOException e) {Log.e(TAG, "disconnected", e);connectionLost();break;}}
}

运行结果正确,但是影响了效率问题(应该影响不大?)。

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

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

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

相关文章

YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)

一、本文介绍 本文给大家带来的改进机制是RFAConv,全称为Receptive-Field Attention Convolution,是一种全新的空间注意力机制。与传统的空间注意力方法相比,RFAConv能够更有效地处理图像中的细节和复杂模式(适用于所有的检测对象都有一定的…

springboot+jsp+java房屋销售出租赁网站的ssm设计与实现7xcvq

三、研究方案(主要研究内容、目标、研究方法等) 主要研究内容 房屋租售网站采用的开发框架为springboot框架,也就是Spring mvc、Spring、MyBatis这三个框架,页面设计用的是jsp技术作为动态页面文件设计,jsp文件里可以对…

【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 NeurIPS 2022

前言 BEVFusion其实有两篇, 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation 2022 | MIT提出 本文先分…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站,这个是由于证书失效了,临时解决方式是: 第一种方案: 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下,然后输入“thisisunsafe”(页…

人工智能 - 目标检测:发展历史、技术全解与实战

目录 一、早期方法:滑动窗口和特征提取滑动窗口机制工作原理 特征提取方法HOG(Histogram of Oriented Gradients)SIFT(Scale-Invariant Feature Transform) 二、深度学习的兴起:CNN在目标检测中的应用CNN的…

[c++]—string类___深度学习string标准库成员函数与非成员函数

要相信别人能做出来自己一定可以做出来,只不过是时间没到而已 目录 🚩string类对象capacity操作 💻reserve()保留 💻resize() 🚩string类对象元素访问操作 💻operator[]和at() 💻operator…

如何让嵌入式开发板使用主机的网络

配置网络 1.开发板配置 将开发板和主机用网线连接 安装 net-tools,使用 ifconfig 命令 或者使用 ip 命令 su root ip a 发现一个 eth0的网口 ip link set xxx up 有多个网口时可以用该命令启用某一个网口 vim /etc/netplan/00-installer-config.yaml写入以下…

HTML—列表、表格、表单

1、列表 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表 1.1 无序列表 作用:布局排列整齐的不需要规定顺序的区域 标签:ul 嵌套 li,ul 是无序列表,li 是列表条目 注意事项&#…

FPGA falsh相关知识总结

1.存储容量是128M/8 Mb16MB 2.有256个sector扇区*每个扇区64KB16MB 3.一页256Byte 4.页编程地址0256 5:在调试SPI时序的时候一定注意,miso和mosi两个管脚只要没发送数据就一定要悬空(处于高组态),不然指令会通过两…

【双向链表的实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 双向链表的结构 2. 双向链表的实现 2.1 头文件 ——双向链表的创建及功能函数的定义 2.2 源文件 ——双向链表的功能函数的实现 2.3 源文件 ——双向链表功能的…

Jmeter测试移动接口性能 —— 压测

一般的公司都想知道自己产品的性能瓶颈和以及提升性能,以期大流量来了还撑得住。其实性能测试很难,难点在你不知道性能要达到怎样的需求。难点在于你没有实际的环境场景给你测试,总不能给线上环境你测试吧? 难点在于找性能瓶颈&a…

kafka C++实现消费者

文章目录 1 Kafka 消费者的逻辑2 Kafka 的C API2.1 RdKafka::Conf2.2 RdKafka::Event2.3 RdKafka::EventCb2.4 RdKafka::TopicPartition2.5 RdKafka::RebalanceCb2.6 RdKafka::Message2.7 RdKafka::KafkaConsumer(核心) 3 Kafka 消费者客户端开发3.1 必要…

Linux操作系统虚拟机安装(图文详解)

目录 前言 Linux系统介绍 虚拟机安装 1.安装步骤 2.破解激活步骤 3.创建Linux系统虚拟机 虚拟机的相关设置 1.基础设置 2.语言设置为中文 前言 今天我们开始学习Linux操作系统的安装虚拟机以及相关的Linux的环境配置,后面我还会继续发布Linux系统的相关基…

手机电脑同步的时间管理工具

有不少上班族会发现自己有太多的工作要完成,并且在工作中往往会浪费很多时间在无关紧要的事情上,而不是专注于真正重要的任务,因此没有足够的时间来完成所有任务。在这种情况下,我们可以使用时间管理软件来帮助自己优先考虑重要的…

IIS post .html页面报 405错误

IIS是不允许本地文件默认post请求的,windows10系统下的IIS(10.0版)默认也是不能 post请求\*.html或\*.json文件的 1 需要配置一下,配置如下: 2 双击处理程序映射,添加托管处理程序: 3 请求路径 …

es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承

es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承 promise async await 解构 // 解构var character {name:Brucezzz,pseudonym:Bruce,metadata:{age:32,gender:male,airbags: "说两句啊",airconditio…

springboot+jsp+java人才招聘网站4f21r

本基于springboot的人才招聘网站主要满足3种类型用户的需求,这3种类型用户分别为求职者、企业和管理员,他们分别实现的功能如下。 (1)求职者进入网站后可查看职位信息、企业信息以及职位新闻等,注册登录后可实现申请职…

在MySQL中如何存储一个IPv4地址?

在MySQL如何存储IPv4地址?这个在秋招面试的过程中被问到过,没有答上来,今天猛地想起了这个问题,做一下复盘。 一个IPv4地址是由32位二进制来表示的,用点分十进制表示可以划分为4部分,每部分占8位&#xff…

云时空社会化商业 ERP 系统 service SQL 注入漏洞复现

0x01 产品简介 时空云社会化商业ERP(简称时空云ERP) ,该产品采用JAVA语言和Oracle数据库, 融合用友软件的先进管理理念,汇集各医药企业特色管理需求,通过规范各个流通环节从而提高企业竞争力、降低人员成本…

『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行

分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行 文章目录 一. 介绍二. 并行数据加载2.1. 加载数据步骤2.2. PyTorch 1.0 中的数据加载器(Dataloader) 二. 数据并行2.1. DP(DataParallel)的基本原理2.1.1. 从流程上理解2.1.2. 从模式角度理解2.1.3. 从操作系统角度看2.1.…