• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

помогите отладить стабильное TCP соединение через библиотеку ESP8266WIFI

HgTr

New member
Добрый день!
плата ESP12E
Есть софт который подключается к виртуальному ком-порту и шлет туда поток данных, порт пробрасывает эти данные в TCP сервер (через HW Virtual Serial Port).
На ESP организован сервер (через библиотеку Esp8266WIFI) - его задача в следующем: при подключении клиента - отправить приветствие и далее держать соединение открытым, ждать данные от клиента и как-то их обрабатывать. Если клиентов нет - ничего не делать, ждать подключения.

Для организации соединения я опирался на код из примера WiFiTelnetToSerial.

Проблема в том, что соединение работает несколько непредсказуемым (для меня) образом... К примеру не удается сделать так, что бы обработчик данных вызвался только если есть подключенные клиенты, также
написал некоторые моменты в комментариях.

Пример кода:
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#define WiFi_ssid "sssid"
#define WiFi_pass "pass"
const int port = 23; //порт сервера
#define serialRate 115200  // скорость связи с ПК

WiFiServer server(port); //сервер компорта
WiFiClient Sclient; // клиент

void setup() {
  delay(3000);

  Serial.begin(serialRate);
  pinMode(LED_BUILTIN, OUTPUT); //светодиод вайфай
  digitalWrite(LED_BUILTIN, HIGH);

  WiFiConnect();

  server.begin();
  server.setNoDelay(true);


}

void WiFiConnect(){
   // пытаемся подключиться
   
  Serial.print("Connect to: ");
  Serial.println(WiFi_ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WiFi_ssid, WiFi_pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }
  if(WiFi.status() == WL_CONNECTED){
  Serial.println();
  Serial.print("Connected! Local IP: ");
  Serial.println(WiFi.localIP());
  digitalWrite(LED_BUILTIN, LOW); //вкл. при подключении

  }else WiFiConnect();

}

void loop(){
 
//соединение с ком
static boolean said=false; //это чтобы не забивать монитор сообщениями
static boolean said1=false;
  if (server.hasClient()){ //судя по всему срабатывает когда кто то новый подключен к серверу
      if (!Sclient.connected()) { // equivalent to !serverClients[i].connected()  //эта часть должна срабаывать когда НОВЫЙ клиент подключается
      Sclient = server.available();
      Serial.println("New client");
      Sclient.print("Hello\n");
      said=false;
      said1=false;
      Progress();
    } else{ //если подключается второй клиент то отключаем его (но отключается первый)
      if (!said1){Serial.println("already connected");said1=true;};
        Sclient.stop();
      }
    } else{ // по идее этот код должен срабатывать если нет подключенных клиентов, но иногда это сообще выходит после New Client и соединение остается активным
     if(!said){ Serial.println("diconnected"); said=true;}
    
      }
     
      Progress(); //По задумке обработчик должен вызываться только если есть подключенные клиенты, но если разместить обработчик только внутри проверок выше - он не срабатывает или срабатывает 1 раз.

}

void Progress(){
//здесь как-то обрабатываются данные для управления RGB_LED, для примера будем выводить в сериал
while(Sclient.available()) {
Serial.write(Sclient.read());
}
}
 
Сверху Снизу