• Система автоматизации с открытым исходным кодом на базе 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.
Но надеюсь, что я не прав и этому найдется другое объяснение, которое устранит проблему.
 
Сверху Снизу