蓝牙收发数据长度的问题

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

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

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

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

每次接收数据前先清空以前的数据:调试

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

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

     [_receiveData appendData:characteristic.value];

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

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

若是等于代表本次数据接收完毕,检查数据格式是否正确,若是正确再继续下面的操做。ip

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

相关文章
相关标签/搜索