Android蓝牙通信——安卓蓝牙obtainMessage数据传输部分数据丢失乱序问题

根据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
### 如何在 Android 平台上实现蓝牙数据传输 要在 Android 上实现蓝牙数据传输,开发者可以利用 `android.bluetooth` 包中的 API 来完成这一功能。以下是关于如何设置蓝牙、发现设备、连接以及传输数据的核心概念和技术细节。 #### 设置蓝牙 为了使应用程序能够使用蓝牙功能,必须先启用蓝牙并请求必要的权限。这可以通过调用 `BluetoothAdapter` 类来实现。如果蓝牙尚未开启,则应提示用户打开它: ```java // 获取默认的 BluetoothAdapter 实例 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); // 请求码用于 onActivityResult 方法中处理结果 } ``` 此部分操作涉及基础配置[^1]。 #### 发现附近的蓝牙设备 一旦蓝牙被激活,就可以通过广播接收器监听附近可用的蓝牙设备。要扫描其他设备,需注册一个 `BroadcastReceiver` 以捕获 `ACTION_FOUND` 的意图动作: ```java IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); bluetoothAdapter.startDiscovery(); // 开始查找过程 ``` 当找到新设备时,会触发广播接收器内的逻辑处理程序[^2]。 #### 建立连接 对于经典蓝牙通信而言,通常采用 RFCOMM 协议栈创建套接字并与远程设备建立链接;而对于现代应用更倾向于使用的 BLE 技术来说,则基于 GATT 和 GAP 层次结构来进行交互[^3]。下面展示的是传统方式下的客户端和服务端模型示例代码片段之一——服务端等待传入连接的部分: ```java serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); socket = serverSocket.accept(); // 阻塞直到有客户机尝试连接 ``` 而另一侧作为发起方的角色则执行如下命令序列去主动寻求目标节点地址之后形成绑定关系: ```java device.createRfcommSocketToServiceRecord(MY_UUID).connect(); ``` 以上两段伪代码分别代表了两种角色间可能存在的行为模式。 #### 数据交换流程 成功构建双向链路以后即可着手准备实际的消息传递工作了。一般情况下我们会借助输入/输出流机制读写共享缓冲区从而达成最终目的。例如,在已知双方均已就绪的前提下可以从一方写出字符串至对方那里: ```java OutputStream outputStream = socket.getOutputStream(); outputStream.write(message.getBytes()); ``` 与此同时也要记得安排好相应的线程管理策略以便于持续监控是否有新的到来信息待处理[^1]: ```java InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int bytes; while ((bytes = inputStream.read(buffer)) != -1){ handler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget(); } ``` 上述方法展示了基本的数据收发原理[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值