关于蓝牙通信的问题

本文总结了在蓝牙通信模块开发过程中遇到的问题,包括页面跳转时的Intent使用、数据接收的不稳定、连接断开后的重连、多次尝试才能连接上的情况以及数据接收不完整的问题。并提供了解决方案,如使用静态BluetoothSocket、养成关闭流的习惯、增加线程暂停等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近和队友一起做蓝牙通信模块,中间遇到了不少问题。下面分别对遇到的一些问题做一个总结。至于android端蓝牙通信的实现,有需要的可以相互讨论下。

问题1:由于整个运用程序都需要用到蓝牙,并且界面不止一个,当蓝牙连接成功以后需要页面跳转,最开始尝试用Intent传对象,发现不方便,后来将BluetoothSocket设成了静态的,以便各处共用一个socket对象。如果有更好的方法,希望大家能提供建议。

问题2:接收的数据没规律,莫名其妙,是我们定义的数据帧的任意一部分。经过检查,当时以为是流没关闭,在程序的最后对流进行了关闭处理(后来发现问题不仅仅在这里,不过记得养成个关流的好习惯)。

问题3:我们知道蓝牙socket有个connect方法,必须先连接才能进行数据传输。关流以后,导致连接断开,需要重新连接,我重连的时候连接不上,可能是我的个例,也可能是蓝牙的通病,希望大家留意下。没办法,只好每传送一次数据后将BluetoothSocket断开,再通过BluetoothDevice重新连接,同样设成static即可。

问题4:蓝牙要连几次才能连上。能连上证明你的程序没有问题(像问题3又是另外一种情况),用手机蓝牙助手测试时每次连接都没问题,连蓝牙模块时各种连不上,后来换了一个很low的手机,每次都能顺利连接。所以遇到这种情况看一下蓝牙模块的型号,可能有兼容性的问题。最好让负责硬件的找个靠谱点的板子,可能版本太低。

问题5:用手机蓝牙助手测试一切正常开始连调时,发现数据接收又有了问题,不过这次每次开头都是一样的,只是接收不全,比如我们定的长度是18个,每次都只能接收5个,7个等等。结果是两边通过蓝牙助手都能通过。

byte[] buffer = new byte[1024];
						int bytes;
						StringBuffer buf = new StringBuffer();
   							ips=socket.getInputStream();
							bytes=ips.read(buffer);
							


经过调试发现当用debug模式一步步执行时,每次都能接收完整。

于是用log进行输出,发现bytes的长度每次都不够18个,于是加了一个线程暂停

byte[] buffer = new byte[1024];
                        int bytes;
                        StringBuffer buf = new StringBuffer();
                            ips=socket.getInputStream();
                            bytes=ips.read(buffer);
                            try {
                                Thread.sleep(3000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
倒是能解决问题,说明发送的时候并没有一次发送,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值