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

Trouble Comparing Bluetooth-Sent ASCII char in iOS

我有一个与 RedBearLab Arduino 设备对话的 iOS 应用程序。我用来通过蓝牙从 Arduino 发送一个 int 到 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 数据包与 !数据包。

首先,这一行:

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

有点无意义。 stringWithFormat 没有实际用途,因为 NSLog 无论如何都采用格式字符串。

改用这个:

NSLog(@"%@", d);

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

可能发生的情况是您的字符串以“233!”的形式出现,全部一起,一次 4 个字节(假设您的整数 == 233)。

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

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

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

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

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