如何将Serial.readBytesUntil(character, buffer, length)
的结果存储在缓冲区中,但我不知道传入消息的长度?未知长度的Arduino串行消息
0
A
回答
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个字符,然后知道为剩余的串行流分配多少空间!
相关问题
- 1. 串行消息上的Arduino
- 2. Arduino的串行返回未知值
- 3. Java SocketChannel读取未知长度的消息
- 4. 长度未知
- 5. 读取长度未知的字符串
- 6. Arduino串行通信未收到全部消息
- 7. 未知消息中的logcat
- 8. 消除Arduino串行噪声
- 9. Apple Passbook iBeacon消息长度
- 10. 吐司消息长度
- 11. FIX - 确定消息长度?
- 12. AngularJS - 未知路由长度
- 13. 关闭未知长度
- 14. 未定义的抵消通知消息
- 15. 从字符串中提取未知长度的字符串
- 16. 通知未读消息
- 17. 初始化一个未知数字和未知长度的字符串数组
- 18. 未知的Arduino语法
- 19. 工作灯:推送通知消息长度和格式 - 限制
- 20. HTTP消息的最大长度?
- 21. M2Crypto中RSA消息长度的下限
- 22. RSA中的消息长度限制
- 23. C++中protobuf消息的长度前缀
- 24. SHA256:填充512位长度的消息
- 25. 长度瓶的闪光消息
- 26. 消息的最短可预期长度
- 27. 显示不需要的字符串长度消息
- 28. python ctypes中的未知数组长度
- 29. 油嘴-2.0:g_spawn_command_line_sync() - 未知的stdout长度
- 30. MATLAB中未知长度的矩阵?
分配一个巨大的缓冲区,之后调整大小(如果需要的话)。 –