Ios 9自由度剃须刀和可折叠迷你
我正试图通过BLE mini(红熊实验室)将数据从9dof Razor IMU模块(来自Sparkfun)传输到BLEChat_Central_OSX应用程序,但它不起作用:/ 我使用的代码是:Ios 9自由度剃须刀和可折叠迷你,ios,arduino,bluetooth-lowenergy,Ios,Arduino,Bluetooth Lowenergy,我正试图通过BLE mini(红熊实验室)将数据从9dof Razor IMU模块(来自Sparkfun)传输到BLEChat_Central_OSX应用程序,但它不起作用:/ 我使用的代码是: 我尝试通过BLE仅传输一个值,代码如下: Serial.print(int(smoothedAX)); Serial.println(); 但在Xcode上运行BLEChat时,我只收到“I”和“Y”值: 我还尝试使用arduino代码的自适应传输数据: //
Serial.print(int(smoothedAX));
Serial.println();
但在Xcode上运行BLEChat时,我只收到“I”和“Y”值:
我还尝试使用arduino代码的自适应传输数据:
// uint16_t value = smoothedAX;
uint16_t value = 123; // fake reading
BLEMini_write(0x0B);
BLEMini_write(value >> 8);
BLEMini_write(value);
但随后我立即收到一条错误消息:
2014-07-16 18:28:04.930 BLEChat Central[425:303] scanForPeripheralsWithServices
2014-07-16 18:28:04.964 BLEChat Central[425:303] didDiscoverPeripheral
2014-07-16 18:28:04.964 BLEChat Central[425:303] Duplicate UUID found updating...
2014-07-16 18:28:06.932 BLEChat Central[425:303] Stopped Scanning
2014-07-16 18:28:06.932 BLEChat Central[425:303] Known peripherals : 1
2014-07-16 18:28:06.932 BLEChat Central[425:303] List of currently known peripherals :
2014-07-16 18:28:06.932 BLEChat Central[425:303] 0 | 308B4C0E-F756-434C-84D4-B474B1C12AD6
2014-07-16 18:28:06.932 BLEChat Central[425:303] ------------------------------------
2014-07-16 18:28:06.933 BLEChat Central[425:303] Peripheral Info :
2014-07-16 18:28:06.933 BLEChat Central[425:303] UUID : 308B4C0E-F756-434C-84D4-B474B1C12AD6
2014-07-16 18:28:06.933 BLEChat Central[425:303] Name : Biscuit
2014-07-16 18:28:06.933 BLEChat Central[425:303] -------------------------------------
2014-07-16 18:28:06.933 BLEChat Central[425:303] Connecting to peripheral with UUID : 308B4C0E-F756-434C-84D4-B474B1C12AD6
2014-07-16 18:28:06.975 BLEChat Central[425:303] Connected to 308B4C0E-F756-434C-84D4-B474B1C12AD6 successful
2014-07-16 18:28:06.991 BLEChat Central[425:303] ->Connected
2014-07-16 18:28:07.131 BLEChat Central[425:303] Length: 2
2014-07-16 18:28:07.132 BLEChat Central[425:303] (null)
2014-07-16 18:28:07.133 BLEChat Central[425:303] An uncaught exception was raised
2014-07-16 18:28:07.134 BLEChat Central[425:303] -[__NSCFString appendString:]: nil argument
2014-07-16 18:28:07.134 BLEChat Central[425:303] (
0 CoreFoundation 0x00007fff82e5725c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff88243e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff82e5710c +[NSException raise:format:] + 204
3 CoreFoundation 0x00007fff82e26def mutateError + 159
4 BLEChat Central 0x00000001000054d1 -[RBLAppDelegate bleDidReceiveData:length:] + 257
5 BLEChat Central 0x0000000100004cb2 -[BLE peripheral:didUpdateValueForCharacteristic:error:] + 770
6 CoreBluetooth 0x00007fff884b4089 -[CBCentralManager xpcConnection:didReceiveMsg:args:] + 101
7 CoreBluetooth 0x00007fff884bd88b __34-[CBXpcConnection handleMsg:args:]_block_invoke + 81
8 libdispatch.dylib 0x00007fff884c81bb _dispatch_call_block_and_release + 12
9 libdispatch.dylib 0x00007fff884c528d _dispatch_client_callout + 8
10 libdispatch.dylib 0x00007fff884ccef0 _dispatch_main_queue_callback_4CF + 333
11 CoreFoundation 0x00007fff82dbe4f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
12 CoreFoundation 0x00007fff82d79714 __CFRunLoopRun + 1636
13 CoreFoundation 0x00007fff82d78e75 CFRunLoopRunSpecific + 309
14 HIToolbox 0x00007fff877cea0d RunCurrentEventLoopInMode + 226
15 HIToolbox 0x00007fff877ce7b7 ReceiveNextEventCommon + 479
16 HIToolbox 0x00007fff877ce5bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
17 AppKit 0x00007fff833f624e _DPSNextEvent + 1434
18 AppKit 0x00007fff833f589b -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
19 AppKit 0x00007fff833e999c -[NSApplication run] + 553
20 AppKit 0x00007fff833d4783 NSApplicationMain + 940
21 BLEChat Central 0x0000000100005122 main + 34
22 libdyld.dylib 0x00007fff87eea5fd start + 1
)
2014-07-16 18:28:07.135 BLEChat Central[425:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString appendString:]: nil argument'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff82e5725c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff88243e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff82e5710c +[NSException raise:format:] + 204
3 CoreFoundation 0x00007fff82e26def mutateError + 159
4 BLEChat Central 0x00000001000054d1 -[RBLAppDelegate bleDidReceiveData:length:] + 257
5 BLEChat Central 0x0000000100004cb2 -[BLE peripheral:didUpdateValueForCharacteristic:error:] + 770
6 CoreBluetooth 0x00007fff884b4089 -[CBCentralManager xpcConnection:didReceiveMsg:args:] + 101
7 CoreBluetooth 0x00007fff884bd88b __34-[CBXpcConnection handleMsg:args:]_block_invoke + 81
8 libdispatch.dylib 0x00007fff884c81bb _dispatch_call_block_and_release + 12
9 libdispatch.dylib 0x00007fff884c528d _dispatch_client_callout + 8
10 libdispatch.dylib 0x00007fff884ccef0 _dispatch_main_queue_callback_4CF + 333
11 CoreFoundation 0x00007fff82dbe4f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
12 CoreFoundation 0x00007fff82d79714 __CFRunLoopRun + 1636
13 CoreFoundation 0x00007fff82d78e75 CFRunLoopRunSpecific + 309
14 HIToolbox 0x00007fff877cea0d RunCurrentEventLoopInMode + 226
15 HIToolbox 0x00007fff877ce7b7 ReceiveNextEventCommon + 479
16 HIToolbox 0x00007fff877ce5bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
17 AppKit 0x00007fff833f624e _DPSNextEvent + 1434
18 AppKit 0x00007fff833f589b -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
19 AppKit 0x00007fff833e999c -[NSApplication run] + 553
20 AppKit 0x00007fff833d4783 NSApplicationMain + 940
21 BLEChat Central 0x0000000100005122 main + 34
22 libdyld.dylib 0x00007fff87eea5fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
根据Xcode调试器,错误应该存在于以下两种方法中:
-(void) bleDidReceiveData:(unsigned char *)data length:(int)length
{
NSLog(@"Length: %d", length);
data[length] = 0;
NSString *str = [NSString stringWithCString:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
static NSMutableString *message;
if (message == nil)
message = [[NSMutableString alloc] initWithString:@""];
[message appendString:str];
[message appendString:@"\n"];
self.textView.string = message;
[self.textView scrollRangeToVisible: NSMakeRange(self.textView.string.length, 0)];
}
及
-(void)外围设备:(CBPeripheral*)外围设备didUpdateValueForCharacteristic:(CBCharacteristic*)特征错误:(NSError*)错误
{
无符号字符数据[20];
静态无符号字符buf[512];
静态int len=0;
NSInteger数据;
如果(!错误)
{
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@RBL\u CHAR\u TX\u UUID]]
{
数据长度=特征值长度;
[characteristic.value getBytes:数据长度:数据长度];
如果(数据长度=20)
{
memcpy(和buf[len],数据,20);
len+=数据_len;
如果(len>=64)
{
[[self delegate]bleDidReceiveData:buf长度:len];
len=0;
}
}
否则如果(数据长度<20)
{
memcpy(&buf[len],data,data_len);
len+=数据_len;
[[self delegate]bleDidReceiveData:buf长度:len];
len=0;
}
}
}
其他的
{
NSLog(@“updateValueForCharacteristic失败!”);
}
}
可能是在OSX应用程序中添加以下代码的解决方案?如果是这样,我应该把它放在哪里
UInt16 value;
UInt16 pin;
for (int i = 0; i < length; i+=3) {
pin = data[i];
value = data[i+2] | data[i+1] << 8;
NSLog(@"Pin: %d", pin);
NSLog(@"Value %d",value);
}
UInt16值;
UInt16引脚;
对于(int i=0;i value=data[i+2]| data[i+1]如果只发送两个字节,那么最简单的方法是-
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
int smoothedAX;
if (!error)
{
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@RBL_CHAR_TX_UUID]])
{
if (characteristic.value.length == 2) {
const char *data=[characteristic.value bytes];
smoothedAX=data[0] <<8 | data[1];
}
else {
NSLog(@"Received %ld bytes",characteristic.value.length);
}
}
}
else
{
NSLog(@"updateValueForCharacteristic failed!");
}
}
-(void)外围设备:(CBPeripheral*)外围设备didUpdateValueForCharacteristic:(CBCharacteristic*)特征错误:(NSError*)错误
{
整数平滑dax;
如果(!错误)
{
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@RBL\u CHAR\u TX\u UUID]]
{
if(characteristic.value.length==2){
常量字符*数据=[characteristic.value字节];
SmoothDax=data[0]>>是一种右移位操作。当您将右移位8应用于8位值(即小于256)时您将得到0-这似乎导致了nil append错误。在您的第一次测试中,SmoothDAX
的值是多少?您如何知道y和i不正确?SmoothDAX的值介于-300和+300之间-此信息来自Arduino串行监视器。抱歉,我没有注意到您有一个16位的值。奇怪很明显,您有一个无符号int,但得到的是有符号的值。无论如何,您用于将16位值作为两个字节发送的方法是正确的。您需要检查接收数据的代码,以确定获取crashI的原因。根据Xcode调试器,错误出现在[message appendString:str]行中和[[self delegate]bleDidReceiveData:buf长度:len]解决方案可能是以下问题的答案吗?如果是的话,我应该在哪里实现这一部分?谢谢@paulw11是的,这个答案看起来是重新创建16位值的正确方法。您的问题似乎是您正在使用的同一代码被设计为接收文本字符串,而不是二进制数据。如果您更新您的问题以包括方法使用您的注释中的代码,我可能会建议进行更改,您需要提供异常。我猜这是一个超出范围的错误,因为我没有检查是否收到了两个字节。我可以很快更新我的答案
UInt16 value;
UInt16 pin;
for (int i = 0; i < length; i+=3) {
pin = data[i];
value = data[i+2] | data[i+1] << 8;
NSLog(@"Pin: %d", pin);
NSLog(@"Value %d",value);
}
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
int smoothedAX;
if (!error)
{
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@RBL_CHAR_TX_UUID]])
{
if (characteristic.value.length == 2) {
const char *data=[characteristic.value bytes];
smoothedAX=data[0] <<8 | data[1];
}
else {
NSLog(@"Received %ld bytes",characteristic.value.length);
}
}
}
else
{
NSLog(@"updateValueForCharacteristic failed!");
}
}