Arduino序列消息长度未知

时间:2013-07-26 23:41:41

标签: c arduino

如果我不知道传入消息的长度,如何将Serial.readBytesUntil(character, buffer, length)的结果存储在缓冲区中?

4 个答案:

答案 0 :(得分:1)

使缓冲区足够大以容纳消息。不知道邮件的最大长度?使用length来控制读取的字符,然后继续读取直到遇到字符。

int bytesRead = Serial.readBytesUntil(character, buffer, length); 

答案 1 :(得分:1)

这是一个使用realloc()来增加缓冲区的代码。完成free()后,您必须buf

int length = 8;
char * buf = malloc(length);
int total_read = 0;

total_read = Serial.readBytesUntil(character, buf, length);
while(length == total_read) {
    length *= 2;
    buf = realloc(buf, length);
    // Bug in this line:
    // total_read += Serial.readBytesUntil(character, buf+total_read, length);
    // Should be
    total_read += Serial.readBytesUntil(character, buf+total_read, length-total_read);
}

*编辑:通过阅读readBytesUntil字节而不是buf字节来修复length读取length-total_read末尾的错误。

答案 2 :(得分:1)

您可以创建一个比剩余RAM小的缓冲区并使用它。寻找剩余公羊的呼吁(正如我在别处发布的那样)是:

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  int fr = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
  Serial.print("Free ram: ");
  Serial.println(fr);
}

无论如何,你应该确保你只读到你实际拥有的RAM。

答案 3 :(得分:1)

一个答案是,当程序读取串行字节时,它通常不会逐字存储它们。相反,程序检查每个字节并确定接下来要采取的操作。该逻辑通常实现为有限状态机。

那么,您的特定串行流代表什么?可以按顺序块进行分析吗?例如:“0008ABCDEFGH”表示8个字符跟随4个字符长度字段。在这个愚蠢的例子中,你的代码将读取4个字符,然后知道为串行流的其余部分分配多少空间!