经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
蓝牙收发数据长度的问题
来源:cnblogs  作者:yuyuyu37  时间:2018/12/25 9:25:48  对本文有异议

最近公司固件工程师在调试时发现一个问题,蓝牙设备和安卓APP可以正常通讯,但是和iOS APP总是传输数据超时,之后断开连接,应该是程序问题,之前遇到过一次,但是只有那一次,想偷下懒所以就没改,这次又出现了就不得不改了。用xcode运行项目,打开log,在

  1. - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

方法中输出了接收到的数据,发现接收到的数据总长度时对的,但是分包发送每次接收到的数据长度和其他的设备不一样,而代码里面写的是按照分包的长度来接收的,所以就导致最后拼接的数据不对,那就需要改动了,虽然这部分代码已经用了一年多了,那也没办法,有问题必须得改呀。

根据log看岀接收到的数据格式是这样的:5b24xxxx 5b05xxxx,其中第一字节固定为5b,第二字节为本次发送数据总长度。如果有36字节数据,分3次接收10+10+10+6,然而部分读卡器不是按照这种顺序发的,可能是9+8+9+9+1这样发的,所以就不能根据固定长度来接收数据。

每次接收数据前先清空之前的数据:

  1. self.receiveData = [[NSMutableData alloc] initWithCapacity:50];

然后接收数据,并拼接到receiveData中:

  1. [_receiveData appendData:characteristic.value];

每次接收完数据都检查receiveData,看其长度是否等于第一个字节:

  1. if (bytes[1] == 0x24 && _receiveData.length == 0x24 && [BLEUtil verifyReceivedData:_receiveData]) {}

如果等于表明本次数据接收完毕,检查数据格式是否正确,如果正确再继续下面的操作。

这样只判断数据总长度就可以了,不用判断分包接收的数据,完美解决上面的问题。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号