0

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

4

4 回答 4

1

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

int bytesRead = Serial.readBytesUntil(character, buffer, length); 
于 2013-07-27T00:04:26.273 回答
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);
}

*编辑:修复了一个错误,该错误readBytesUntilbuf通过读取length字节而不是length-total_read字节来读取结尾。

于 2013-07-27T00:10:42.167 回答
1

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

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

于 2013-08-09T05:15:21.717 回答
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);
}

无论如何,你应该确保你只读入你实际拥有的内存。

于 2013-08-06T21:57:20.767 回答