string - ESP8266 无法将字符添加到非常长的字符串(> 8000 个字符)
问题描述
在从 HTTPS 请求中正确获取有效负载后,将客户端的字符添加到字符串中大约 8000 个字符后停止,然后恢复并再次停止几次这是我的代码片段:
long streamSize = 0;
Serial.println("Now reading payload...");
while (stream.connected()) {
while (stream.available() > 0) {
char ch = (char)stream.read();
Serial.println((String)"Reading [" + ++streamSize + "] " + ch);
ret += ch;
Serial.println(ret.length());
}
}
效果很好,直到:
Reading [8685] t
8685
Reading [8686] r
8686
Reading [8687] u
8687
Reading [8688] m
8687
Reading [8689]
8687
Reading [8690] e
8687
[Resumes correctly appending chars]
Reading [9226] i
8748
Reading [9227] p
8749
Reading [9228] t
8750
Reading [9229] i
8751
Reading [9230] o
8751
Reading [9231] n
8751
等等好几次。内存堆大小似乎不是问题,因为system_get_free_heap_size()
在附加所有内容后我得到了 14128 个空闲字节。我正在使用 Wemos D1 R1,这是我尝试使用 Github API 完全读取的文件,用于测试
解决方案
我发现由于可用内存量少,Arduino 可能无法连接字符串。此外,Arduino 中的 String 类似乎没有错误处理程序,因此当内存过于碎片化时,它可能会默默地失败。
请参见此处:来自 Arduino 论坛 和此处:来自 Stack Overflow 中的讨论
在许多情况下,他们建议您可以使用String reserve(int)调用预先分配缓冲区。
也许您无法事先知道您的字符串会增长到多大,但也许您可以管理它。例如,通过调用两次您的 https 目标。第一次只是想知道你的答案有多大(这样你就可以分配确切的内存量);第二次有效阅读。
推荐阅读
- design-patterns - 询问有关软件设计的名言
- java - spring-message依赖连接问题
- php - 使用 JMS 3.11 反序列化时,setSerializeNull() 报告为未定义
- azure-service-fabric - 启用 gMSA 时如何设置安全服务结构仪表板?
- python - 如何在 Huggingface + CUDA 内存不足的 BERT 之上添加 BiLSTM。尝试分配 16.00 MiB
- java - 用斜杠替换文字的 Java 把手
- python - Django 模型如何修复循环导入错误?
- c - C 指向数据。为什么显示错误;二进制的无效操作数?
- c - 将 char* 复制到 char* 的指针
- android - Android错误膨胀类
加载高图时