• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Подвисает сервер (на основе WiFiWebServer)

Andr

New member
B loop() крутится кусок кода:

Код:
  WiFiClient client = server.available();
  if (!client) return; //Проверяем подключение клиента

  Serial.println("new client");
//  delay(10);
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
///  delay(1);
  Serial.println("1");  ///Serial.println(millis());
 
  if (req.indexOf("/gpio/0") != -1) val = 0;
  else
  if (req.indexOf("/gpio/1") != -1) val = 1;
   
  Serial.println("2");  ///Serial.println(millis());
  digitalWrite(2, val); //Устанавливаетм выход GPIO2
  Serial.println("3");  ///Serial.println(millis());
 
  client.flush();
///  delay(1);
  Serial.println("4");  ///Serial.println(millis());

  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n<a href=""http://192.168.0.241/gpio/""";
  s += (val)?"0>Set ON":"1>Set OFF";
  s += "</a><br>\r\n";
  s += String(temp1,4)+" now<br>\r\n";
  s += listtemp+String(avertemp1/count,4)+" "+String(count)+"<br>\r\n";

  s += String(DHT_h,1)+" %<br>\r\n";
  s += String(temp2,4)+" C T02<br>\r\n";
  s += String(DHT_t,1)+" C DHT<br>\r\n";
  s += String(DHT_hic,2)+" hic<br>\r\n";
 
  s += String((millis()-old_millis)/1000)+" sec<br>\r\n";
  s += String(float (millis())/86400000,5)+" day\r\n";
  s += ss+"\r\n";
  s += "</html>\n";
///  Serial.println("5");  Serial.println(millis());

  client.print(s);

  delay(1);
  Serial.println("Client disonnected");
В таком виде при постоянном подключении из браузера к ESP все работает, ответы идут без задержек. Но так работает только когда присутствуют строки Serial.println("...") до 22 строчки в коде, если какую нибудь из них удалить, то ответы от сервера приходят непредсказуемо - иногда сразу, иногда с задержками или вообще не приходят. Уже замучался прогружать ESP с разными вариантами

Вместо Serial.println пробовал ставить delay(1...10) - не помогает. Из за чего со строками Serial.println работает, а без них нет - не могу разобраться...
Что то читал на английских форумах про проблемы с client.flush(); но так и не сообразил, что к чему. Хочется разобраться в этом вопросе и сделать правильно, а не методом тыка.
Спасибо.
 

Andr

New member
Всё! Следствие зашло в тупик!
Тупо собрал все Serial.println(""); в одну кучу и разместил их в самом конце программы перед последней }
Код:
  Serial.println("new client");
  Serial.println("1");
  Serial.println("2");
  Serial.println("3");
  Serial.println("4");
}
И все четко работает! Т.е. от последовательности строк работа кода не зависит. Это, как я подозреваю, проблема компилятора или самой ESP? Может от размера прошивки зависит?...
Так же при отсутствии этих строк в коде закомментировал строку вызова пользовательской функции, которая вызывается через 5 минут после старта ESP ( т.е. на функциональность программы до 5 минут работы не влияет) и опрос сервера так же работал безглючно. Опять же делаю вывод, что глючность/безглючность зависит от компилятора или самой ESP.
Но надеюсь, что я не прав и этому найдется другое объяснение, которое устранит проблему.
 
Сверху Снизу