RedPark Cable readBytesAvailable每次读取两次

时间:2012-09-21 11:11:10

标签: iphone objective-c ipad serial-port

我无法在任何地方找到这些信息。使用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;
    }

}

但是,如果我写一个“长”字符串,你能告诉我为什么方法被调用两次,以及如何避免这个问题?

3 个答案:

答案 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?

祝你好运!