Wi-Fi-подключения теряются при сбросе подключения

Посмотрите на трюк в последних нескольких строках этого кода:

#include <ESP8266WiFi.h>

const char* ssid = "xxxxx";
const char* password = "yyyyyyy";

// Создаем экземпляр сервера
// укажите порт для прослушивания в качестве аргумента
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // Подключиться к сети WiFi
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Запустить сервер
  server.begin();
  Serial.println("Server started");

  // Распечатать IP-адрес
  Serial.println(WiFi.localIP());
}

void loop() {
  // Проверяем, подключился ли клиент
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

 int delays = 0;

 // Подождите, пока клиент отправит какие-нибудь данные
 Serial.println("new client");
 while(!client.available()){
    delay(1);
    delays++;  // Первая строка трюка.
    if (delays > 10) {
       return;
    } // Трюк заканчивается.
  }
  ...// Обработка некоторых событий.
}

Код работает нормально и без этого трюка (только delay(1); внутри цикла), но проблема в том, что он там застревает, если из браузера запрашиваются какие-то ответы, из-за чего вкладка закрывается между запросами.

Один ответ для favicon:

 if (req.indexOf("favicon.ico") != -1) {
    String s = "HTTP/1.1 404 WTF Favicon !!\r\n";
    client.print(s);
    client.flush();
    return;
 }

У меня также был один похожий ответ, начинающийся с 200 OK для определенных URL-адресов, а затем ответ в виде простого текста JSON.

Я хотел бы знать, почему мой сервер зависает на этой delay(1);? Кроме того, когда требуется этот трюк, какое правильное значение delays?

Также я добавил client.flush(); после каждого client.print();. Может ли это на что-то повлиять?

, 👍0