Serial.readBytesUntil(character, buffer, length)
当我不知道传入消息的长度时,如何将结果存储在缓冲区中?
问问题
3366 次
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);
}
*编辑:修复了一个错误,该错误readBytesUntil
会buf
通过读取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 回答