Добрый день!
плата ESP12E
Есть софт который подключается к виртуальному ком-порту и шлет туда поток данных, порт пробрасывает эти данные в TCP сервер (через HW Virtual Serial Port).
На ESP организован сервер (через библиотеку Esp8266WIFI) - его задача в следующем: при подключении клиента - отправить приветствие и далее держать соединение открытым, ждать данные от клиента и как-то их обрабатывать. Если клиентов нет - ничего не делать, ждать подключения.
Для организации соединения я опирался на код из примера WiFiTelnetToSerial.
Проблема в том, что соединение работает несколько непредсказуемым (для меня) образом... К примеру не удается сделать так, что бы обработчик данных вызвался только если есть подключенные клиенты, также
написал некоторые моменты в комментариях.
Пример кода:
плата 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());
}
}