无法比较 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();
会导致数据在两个单独的数据包中传输。
我有一个与 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();
会导致数据在两个单独的数据包中传输。