如果我不知道传入消息的长度,如何将Serial.readBytesUntil(character, buffer, length)
的结果存储在缓冲区中?
答案 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个字符,然后知道为串行流的其余部分分配多少空间!