Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino ESP8266-空闲堆ram随每个网页请求而下降_Arduino_Esp8266 - Fatal编程技术网

Arduino ESP8266-空闲堆ram随每个网页请求而下降

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

我正在使用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><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来做其他事情。