无法比较iOS中蓝牙发送的ASCII字符

时间:2015-01-05 23:05:25

标签: ios objective-c cocoa-touch bluetooth arduino

我有一个与RedBearLab Arduino设备对话的iOS应用程序。我用来通过蓝牙从Arduino发送到iOS的代码如下:

void sendMyInt(int myInt) {
 char b[4];

 String str;  

 str=String(myInt);

 str.toCharArray(b,4);

 for (int i; i < 3; i++) {
    char toPrint = b[i];
    ble_write(toPrint);
 }
}   

这是接收端的代码:

-(void) bleDidReceiveData:(unsigned char *)data length:(int)length
{
NSData *d = [NSData dataWithBytes:data length:length];

NSLog([NSString stringWithFormat:@"%@",d]);

NSString *s = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];

const char* clearChar = "!";

if ([self.label.text isEqualToString:@"Label"]) {
    self.label.text = @"";
}

else if ([s isEqualToString:[NSString stringWithUTF8String:clearChar]]) {
    self.label.text = @"";
}

else {
    NSString *store = self.label.text;
    NSString *full = [NSString stringWithFormat:@"%@%@",store,s];
    self.label.text = full;
}
}

最终的else语句会像预期的那样触发,值为233!一遍又一遍地打印到标签上,每次最终形成233!233!233之类的东西!正如您所看到的,我使用通过函数发送的字符(!)来清除标签,但它永远不会清除。整数是感叹号的ASCII代码:

void clearLabel() {
  int clearString = 33;
  char excalamtion = clearString;
  ble_write(excalamtion);
}

为什么这不清楚标签?我认为它与冲突格式有关,但即使在阅读了一些文档之后我也不是很擅长。对于else if语句,我也尝试了这个

if ([s isEqualToString:@"!"])

但这也没有成功......任何帮助都会受到赞赏。

编辑:

我忘记输入循环代码,以便您可以看到函数调用。这是:

void loop()
{
  if ( ble_connected() ) {
    int a = 223;
    sendMyInt(a);
    delay(1000);
    clearLabel();
    delay(1000);
  }
  ble_do_events();
}

编辑2:

根据@Duncan C的建议,我已将问题与数据作为一个数据包发送到iPhone的事实隔离开来。在收到数据时打印出我生成的字符串,字符串233!是一次接收,而不是2 3 3的个别字符,一秒后信号清除,!我的手机上显示的数据需要两秒钟,表明正在使用这两种延迟。我需要一种方法来分离2 3 3数据包!分组。

2 个答案:

答案 0 :(得分:1)

首先,这一行:

NSLog([NSString stringWithFormat:@"%@",d]);

有点无意义。 stringWithFormat不起作用,因为NSLog无论如何都会采用格式字符串。

请改用:

NSLog(@"%@", d);

将NSData转换为NSString后,您可能还应该记录“s”的内容。这将帮助你弄清楚发生了什么。

可能发生的是你的字符串以“233!”的形式出现,一次只有4个字节(假设你的整数是== 233)。

你的字符串不太可能只包含“!”。相反,它可能包含“233!” (4个字符。)我说可能是因为它取决于数据如何被打包成BLE。短信应该在1个BLE数据包中发送,所以你应该把整个字符串放在一起。

您可以使用NSString方法rangeOfString:来搜索“!”字符串,如果它包含“!”,请清除您的标签,但这也不会有任何好处。如果您要发送“233!”,那么iOS代码将在其收到的字符串中看到感叹号并简单地清除标签。

或者您的arduino项目首先发送“233”,然后在其他事件之后发送“!”。你没说清楚。

另一个问题:如果整数小于1000或小于100,并且不需要3或4个字符转换为char数组,Arduino String类会怎么做?什么存储在未使用的字节中?你总是发送4个字符,这可能是错误的。

答案 1 :(得分:0)

在调用ble_do_events();函数后添加另一个sendMyInt();会导致数据在两个单独的数据包中传输。