2013-07-26 112 views
0

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

+0

分配一个巨大的缓冲区,之后调整大小(如果需要的话)。 –

回答

1

这是一个使用realloc()继续增长缓冲区的小代码。当您完成buf时,您将不得不free()

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会通过阅读length字节而不是length-total_read字节读出的buf末的错误。

+1

@guiomie在这里的错误,应该只读'length-total_read'字节,而不是'length'。 – Macattack

1

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

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

您可以创建一个只比其余RAM小的缓冲区并使用它。在打电话找剩下的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,你实际上有。

1

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

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