我无法在任何地方找到这些信息。使用redpark电缆的TTL版本可以发送一个字符串多长时间?
当我从我的Arduino中打印一些完整的串行代码时,会调用以下委托方法两次,字符串的示例如下:144; 480,42; 532,40; 20e
- (void) readBytesAvailable:(UInt32)length{
当我使用检索可用数据的新函数方法[getStringFromBytesAvailable]时,我只得到144; 480,42; 532,40;然后再次调用整个函数,字符串现在包含字符串的其余部分:20e
以下方法用于附加两个字符串,但仅当数据传输速率为“慢”时(每秒1次,我希望每秒最少10次)。
-
(void) readBytesAvailable:(UInt32)length{
if(string && [string rangeOfString:@"e"].location == NSNotFound){
string = [string stringByAppendingString:[rscMgr getStringFromBytesAvailable]];
NSLog(string);
finishedReading = YES;
}
else{
string = [rscMgr getStringFromBytesAvailable];
}
if (finishedReading == YES)
{
//do stuff
}
finishedReading = NO;
string = nil;
}
}
但是,如果我写一个“长”字符串,你能告诉我为什么方法被调用两次,以及如何避免这个问题?
答案 0 :(得分:0)
这就是串口工作的方式。你不能也不需要避免这些问题。在SW / HW的任何级别都没有尝试保持串行数据流的完整性,因此在代码中对此进行任何假设都是错误的。串行数据只是一个字节流,没有分组化的概念。因此,您必须处理以下事实:您可能必须阅读部分数据并稍后阅读其余数据。
答案 1 :(得分:0)
由于程序片段的运行速度比发送字符串所需的时间快,因此需要捕获字节并将它们附加到字符串中。
如果使用回车符终止串行数据,您可以测试它是否知道您何时收到整个字符串。
然后你可以允许你的Arduino每秒发送10次。
答案 2 :(得分:0)
RedPark提供的redparkSerial头文件中的serialPortConfig实际上为您提供了比您可能意识到的更多的配置控制。 readBytesAvailable:length方法是抽象的,仅在满足以下两个条件之一时调用:超出rxForwardingTimeout值且主缓冲区中的数据(默认设置为100 ms)或达到rxForwardCount(默认设置为16个字符)。
因此,在您的情况下,看起来您在初始读取后仍然在缓冲区中有数据,这意味着将再次调用readBytesAvailable:length方法(从主运行循环)以检索剩余数据。我建议使用rxForwardingTimeout和rxForwardCount,直到它按预期执行。
如前所述,我建议至少在数据包末尾添加一个标志(不必回车),以便识别。
另外,这里有一些好的建议:How do you design a serial command protocol for an embedded system?
祝你好运!