• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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());
}
}
 
Сверху Снизу