我有一个与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数据包!分组。
答案 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();
会导致数据在两个单独的数据包中传输。