首页 > 解决方案 > 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 完全读取的文件,用于测试

标签: stringheap-memoryesp8266arduino-esp8266

解决方案


我发现由于可用内存量少,Arduino 可能无法连接字符串。此外,Arduino 中的 String 类似乎没有错误处理程序,因此当内存过于碎片化时,它可能会默默地失败。

请参见此处:来自 Arduino 论坛 和此处:来自 Stack Overflow 中的讨论

在许多情况下,他们建议您可以使用String reserve(int)调用预先分配缓冲区。

也许您无法事先知道您的字符串会增长到多大,但也许您可以管理它。例如,通过调用两次您的 https 目标。第一次只是想知道你的答案有多大(这样你就可以分配确切的内存量);第二次有效阅读。


推荐阅读