Arduino ESP8266 - 免费堆ram随着每个网页请求而下降

时间:2016-05-07 09:55:50

标签: arduino esp8266

我使用的是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>";
}

1 个答案:

答案 0 :(得分:1)

尽管WiFiClientloop结束时被销毁,但是生成它的实际TCP缓冲区在客户端断开连接或{{3}之前都无法释放达到限制。浏览器保持连接处于活动状态,或者更有可能是缓冲区在循环后保持活动状态,因为您(隐式)在客户端可以确认它们正确接收数据之前销毁了WiFiClient。

根据规范,ESP必须在整个MSL持续时间内保持这些数据,或者直到客户端说他们已正确接收到所有内容。由于这不会发生在您的循环中,因此它会占用RAM,直到这2分钟的时间段结束。

通过等待客户端使用client.connected()使用某种while循环主动关闭连接,并且另外指示浏览器/ HTTP客户端完成{{{}}时关闭连接,可以轻松解决此问题。 1}}标题。断开连接后,您应该拨打Connection: close