0

我无法在任何地方找到这些信息。使用 TTL 版本的 redpark 电缆可以发送多长时间的字符串?

当我从 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;
    }

}

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

4

3 回答 3

0

这就是串行端口的工作方式。你不能也不需要避免这些问题。软件/硬件的任何级别都没有尝试保持您的串行数据流完好无损,因此在您的代码中对此做出任何假设都是错误的。串行数据只是一个字节流,没有打包的概念。因此,您必须处理可能必须读取部分数据并稍后读取其余数据的事实。

于 2012-09-21T14:36:00.303 回答
0

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

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

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

于 2012-09-23T03:05:42.307 回答
0

事实上,RedPark 提供的 redparkSerial 头文件中的 serialPortConfig 确实为您提供了比您可能意识到的更多的配置控制。readBytesAvailable:length 方法是抽象的,仅在满足以下两个条件之一时调用:主缓冲区中的数据超出 rxForwardingTimeout 值(默认设置为 100 毫秒)或达到 rxForwardCount(默认设置为 16 个字符)。

因此,在您的情况下,看起来您在初始读取后仍然在缓冲区中获得数据,这意味着将再次调用 readBytesAvailable:length 方法(从主运行循环)以检索剩余数据。我建议使用 rxForwardingTimeout 和 rxForwardCount 直到它按您的预期执行。

不过,正如已经提到的,我建议至少在数据包的末尾添加一个标志(不必是回车),以进行识别。

另外,这里有一些很好的建议:如何为嵌入式系统设计串行命令协议?

祝你好运!

于 2012-12-19T02:05:36.467 回答