BLE 通知有时会在 iOS 应用程序中收到错误的传输数据
BLE notify sometimes got wrong transfer data in iOS App
我使用 CC2541 作为外围设备,iPad mini 作为中央设备。我每秒通过串行端口(波特率为 19200)从 CC2541 传输数据作为通知。 (我也试过每100次传输数据ms.It 似乎准确度相同)
这是我的代码:
- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
if (error)
{
NSLog(@"Error receiving notification for characteristic %@: %@", characteristic, error);
return;
}
//NSLog(@"Received data on a characteristic.");
if (characteristic == self.rxCharacteristic)
{
NSData *data = [characteristic value];
//NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[self.delegate didReceiveData:string];
}
else if ([characteristic.UUID isEqual:self.class.hardwareRevisionStringUUID])
{
NSString *hwRevision = @"";
const uint8_t *bytes = characteristic.value.bytes;
for (int i = 0; i < characteristic.value.length; i++)
{
NSLog(@"%x", bytes[i]);
hwRevision = [hwRevision stringByAppendingFormat:@"0x%02x, ", bytes[i]];
}
//[self.delegate didReadHardwareRevisionString:[hwRevision substringToIndex:hwRevision.length-2]];
}
}
我尝试了单步调试,但似乎这段代码是正确的。而且从外设传输是错误的(因为我调试的时候 "string" 是错误的)。我得到了大约 85% 的正确数据。并且有 15% 的数据是错误的。
正确的数据(字符串)是"12399921"
,它会通知为0x3132333939393231
。通常错误的数据会连续出现,例如 0x31323339393932
and 0x3132E739393231
, 0x31323339393231
and 0x249ACACACA928AFE
...
也许它有办法纠正它们,因为它似乎在那里有一些规律......或者有什么方法可以避免从外围设备传输错误的数据。无论哪种方式都可以。
提前致谢。
对不起...
我想我自己发现了问题。
当波特率设置为57600而不是19200时,精度会更好。
但是Android应用程序似乎是一样的(无论波特率是19200还是57600,它仍然运行良好)。
我使用 CC2541 作为外围设备,iPad mini 作为中央设备。我每秒通过串行端口(波特率为 19200)从 CC2541 传输数据作为通知。 (我也试过每100次传输数据ms.It 似乎准确度相同)
这是我的代码:
- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
if (error)
{
NSLog(@"Error receiving notification for characteristic %@: %@", characteristic, error);
return;
}
//NSLog(@"Received data on a characteristic.");
if (characteristic == self.rxCharacteristic)
{
NSData *data = [characteristic value];
//NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[self.delegate didReceiveData:string];
}
else if ([characteristic.UUID isEqual:self.class.hardwareRevisionStringUUID])
{
NSString *hwRevision = @"";
const uint8_t *bytes = characteristic.value.bytes;
for (int i = 0; i < characteristic.value.length; i++)
{
NSLog(@"%x", bytes[i]);
hwRevision = [hwRevision stringByAppendingFormat:@"0x%02x, ", bytes[i]];
}
//[self.delegate didReadHardwareRevisionString:[hwRevision substringToIndex:hwRevision.length-2]];
}
}
我尝试了单步调试,但似乎这段代码是正确的。而且从外设传输是错误的(因为我调试的时候 "string" 是错误的)。我得到了大约 85% 的正确数据。并且有 15% 的数据是错误的。
正确的数据(字符串)是"12399921"
,它会通知为0x3132333939393231
。通常错误的数据会连续出现,例如 0x31323339393932
and 0x3132E739393231
, 0x31323339393231
and 0x249ACACACA928AFE
...
也许它有办法纠正它们,因为它似乎在那里有一些规律......或者有什么方法可以避免从外围设备传输错误的数据。无论哪种方式都可以。
提前致谢。
对不起...
我想我自己发现了问题。
当波特率设置为57600而不是19200时,精度会更好。
但是Android应用程序似乎是一样的(无论波特率是19200还是57600,它仍然运行良好)。