2012-09-21 51 views
0

我无法在任何地方找到此信息。使用红色电缆的TTL版本可以发送一个字符串多长时间?RedPark电缆readBytesAvailable每次读取两次

,当我从我的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

由于您的程序片段运行得更快,所以发送字符串所需的时间需要捕获字节并将它们附加到字符串中。

如果串行数据以回车符结束,您可以测试它是否知道您何时收到整个字符串。

然后你可以让你的Arduino每秒发送10次。

0

这就是串口如何工作。你不能也不需要避免这些问题。 SW/HW的任何级别都没有尝试保持串行数据流的完整性,因此在代码中对此做任何假设都是错误的。串行数据只是一个字节流,没有打包的概念。所以你必须处理这样一个事实,即你可能需要读取部分数据并在稍后阅读其余部分。

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?

祝你好运!