我正在尝试通过BLE mini(Red Bear实验室)将9dof Razor IMU模块(来自Sparkfun)的数据传输到BLEChat_Central_OSX应用程序,但它不起作用:/

我使用的代码是:

  • https://github.com/ptrbrtz/razor-9dof-ahrs/tree/master/Arduino/Razor_AHRS
  • https://github.com/RedBearLab/iOS/tree/master/Examples/BLEChat_Central_OSX

  • 我尝试通过BLE仅使用以下代码传输一个值:
         Serial.print(int(smoothedAX));
    
         Serial.println();
    

    但是在Xcode上运行BLEChat时,我仅收到“i”和“Y”值:
    2014-07-16 18:27:01.389 BLEChat Central[395:303] scanForPeripheralsWithServices
    
    2014-07-16 18:27:02.108 BLEChat Central[395:303] didDiscoverPeripheral
    
    2014-07-16 18:27:02.426 BLEChat Central[395:303] Duplicate UUID found updating...
    
    2014-07-16 18:27:03.389 BLEChat Central[395:303] Stopped Scanning
    
    2014-07-16 18:27:03.389 BLEChat Central[395:303] Known peripherals : 1
    
    2014-07-16 18:27:03.389 BLEChat Central[395:303] List of currently known peripherals :
    
    2014-07-16 18:27:03.390 BLEChat Central[395:303] 0  |  308B4C0E-F756-434C-84D4-B474B1C12AD6
    
    2014-07-16 18:27:03.390 BLEChat Central[395:303]
    ------------------------------------
    
    2014-07-16 18:27:03.390 BLEChat Central[395:303] Peripheral Info :
    
    2014-07-16 18:27:03.390 BLEChat Central[395:303] UUID : 308B4C0E-F756-434C-84D4-B474B1C12AD6
    
    2014-07-16 18:27:03.390 BLEChat Central[395:303] Name : Biscuit
    
    2014-07-16 18:27:03.391 BLEChat Central[395:303]
    -------------------------------------
    
    2014-07-16 18:27:03.391 BLEChat Central[395:303] Connecting to peripheral with UUID : 308B4C0E-F756-434C-84D4-B474B1C12AD6
    
    2014-07-16 18:27:03.567 BLEChat Central[395:303] Connected to 308B4C0E-F756-434C-84D4-B474B1C12AD6 successful
    
    2014-07-16 18:27:03.582 BLEChat Central[395:303] ->Connected
    
    2014-07-16 18:27:03.747 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.747 BLEChat Central[395:303] y
    
    2014-07-16 18:27:03.749 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.749 BLEChat Central[395:303] y
    
    2014-07-16 18:27:03.750 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.750 BLEChat Central[395:303] i
    
    2014-07-16 18:27:03.814 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.814 BLEChat Central[395:303] i
    
    2014-07-16 18:27:03.816 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.816 BLEChat Central[395:303] i
    
    2014-07-16 18:27:03.817 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.817 BLEChat Central[395:303] i
    
    2014-07-16 18:27:03.818 BLEChat Central[395:303] Length: 2
    
    2014-07-16 18:27:03.818 BLEChat Central[395:303] i
    

    我还尝试使用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-Debugger,该错误应存在以下两种方法:
    -(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)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
    {
        unsigned char data[20];
    
        static unsigned char buf[512];
        static int len = 0;
        NSInteger data_len;
    
        if (!error)
        {
            if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@RBL_CHAR_TX_UUID]])
            {
                data_len = characteristic.value.length;
                [characteristic.value getBytes:data length:data_len];
    
                if (data_len == 20)
                {
                    memcpy(&buf[len], data, 20);
                    len += data_len;
    
                    if (len >= 64)
                    {
                        [[self delegate] bleDidReceiveData:buf length:len];
                        len = 0;
                    }
                }
                else if (data_len < 20)
                {
                    memcpy(&buf[len], data, data_len);
                    len += data_len;
    
                    [[self delegate] bleDidReceiveData:buf length:len];
                    len = 0;
                }
            }
        }
        else
        {
            NSLog(@"updateValueForCharacteristic failed!");
        }
    }
    

    可能是在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);
    }
    

    我试图寻找解决方案三天,但未能解决问题。如果您能帮助我,那将非常好:)

    在此先多谢与欢呼!

    最佳答案

    如果您只发送两个字节,那么最简单的方法是-

    - (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!");
        }
    }
    

    您将需要使用smoothedAX做一些有用的事情-可能将其传递给另一种方法

    10-07 19:40