我使用的是Arduino IDE 1.6.8和ESP8266 Arduino社区版本2.2.0
每个页面请求空闲堆大小下降,直到最终崩溃。
我在其他网络服务代码上看过字符串类使用情况,所以我认为它不是......
#include <ESP8266WiFi.h>
String freeHeap;
WiFiServer webServer(80);
const char* html1 = "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1\"/></head><body style=\"background-color:#EEE;font-family:Arial,Tahoma,Verdana;\"><h1>Title</h1>";
String html2 = "";
String req;
void setup() {
WiFi.mode(WIFI_STA);
WiFi.begin("name","pwd");
WiFi.config(IPAddress (192,168,1,201), IPAddress (192,168,1,1), IPAddress (255,255,255,0));
WiFi.softAPdisconnect(true);
webServer.begin();
}
void loop() {
WiFiClient webClient = webServer.available();
if (!webClient) {
delay(1);
return;
}
req = webClient.readStringUntil('\r');
webClient.flush();
setHTML();
webClient.print(html1);
webClient.print(html2);
delay(1);
}
void setHTML() {
long fh = ESP.getFreeHeap();
char fhc[20];
ltoa(fh, fhc, 10);
freeHeap = String(fhc);
html2 = "Heap " + freeHeap + "</body></html>";
}
答案 0 :(得分:1)
尽管WiFiClient
在loop
结束时被销毁,但是生成它的实际TCP缓冲区在客户端断开连接或{{3}之前都无法释放达到限制。浏览器保持连接处于活动状态,或者更有可能是缓冲区在循环后保持活动状态,因为您(隐式)在客户端可以确认它们正确接收数据之前销毁了WiFiClient。
根据规范,ESP必须在整个MSL持续时间内保持这些数据,或者直到客户端说他们已正确接收到所有内容。由于这不会发生在您的循环中,因此它会占用RAM,直到这2分钟的时间段结束。
通过等待客户端使用client.connected()
使用某种while循环主动关闭连接,并且另外指示浏览器/ HTTP客户端完成{{{}}时关闭连接,可以轻松解决此问题。 1}}标题。断开连接后,您应该拨打Connection: close