Arduino ESP8266-空闲堆ram随每个网页请求而下降
我正在使用Arduino IDE 1.6.8和ESP8266 Arduino社区2.2.0版 每个页面请求的空闲堆大小都会减小,直到最终崩溃 我在其他web服务代码中看到过字符串类的用法,所以我认为不是这样的Arduino ESP8266-空闲堆ram随每个网页请求而下降,arduino,esp8266,Arduino,Esp8266,我正在使用Arduino IDE 1.6.8和ESP8266 Arduino社区2.2.0版 每个页面请求的空闲堆大小都会减小,直到最终崩溃 我在其他web服务代码中看到过字符串类的用法,所以我认为不是这样的 #include <ESP8266WiFi.h> String freeHeap; WiFiServer webServer(80); const char* html1 = "<!DOCTYPE html><html><head>&l
#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>";
}
#包括
字符串自由堆;
WiFiServer-webServer(80);
const char*html1=“Title”;
字符串html2=“”;
字符串请求;
无效设置(){
WiFi.模式(WiFi_STA);
WiFi.begin(“name”、“pwd”);
WiFi.config(IPAddress(192168,1201)、IPAddress(192168,1,1)、IPAddress(255255,0));
WiFi.softAPdisconnect(正确);
begin();
}
void循环(){
WiFiClient-webClient=webServer.available();
如果(!webClient){
延迟(1);
返回;
}
req=webClient.readStringUntil('\r');
webClient.flush();
setHTML();
网络客户端打印(html1);
webClient.print(html2);
延迟(1);
}
void setHTML(){
长fh=特别是getFreeHeap();
char-fhc[20];
ltoa(fh,fhc,10);
freeHeap=字符串(fhc);
html2=“堆”+自由堆+”;
}
虽然WiFiClient
在循环结束时被销毁,但它背后的实际TCP缓冲区直到客户端断开连接或达到限制后才会释放。要么是浏览器使连接保持活动状态,要么更可能是缓冲区在循环后保持活动状态,因为您(隐式地)在客户端确认其正确接收数据之前销毁了WiFiClient
根据规范,ESP必须在整个MSL期间保留此数据,或者直到客户表示他们已正确接收所有数据。因为这不会在循环中发生,所以它将消耗RAM,直到这2分钟的时间段结束
通过使用client.connected()
,等待客户端通过某种while循环主动关闭连接,并在使用connection:close
头时指示浏览器/HTTP客户端关闭连接,可以很容易地解决这一问题。一旦它断开连接,那么您应该调用client.stop()
发送页面后是否应该调用webClient.stop()
?webClient在使用后如何释放内存?循环()具有作用域,因此每次迭代都应该删除所有内容。但是有些东西粘住了。。不知道这是为什么我会看到带有“connection:close”的自定义头,如果我在主循环()中等待client.connected()变为false,我会阻止其他服务。。。还是说“连接:关闭”,我们只是在说几个滴答声?是的,你确实在阻止它们。相反,您可以通过某种其他引用保持对WiFiClient的引用处于活动状态—可以是在另一个类、结构、全局等中—并在每次通过主循环时检查它的状态(即已连接)。如果已断开连接,请检查是否有新的客户端,否则请等待该客户端关闭。我可能还会添加一些超时,以强制关闭它,以防出现不规则的浏览器-但这将导致约200字节的惩罚。另一个想法是,当循环被客户端阻止时,使用一个Ticker来做其他事情。