• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Komunikacja TCP/IP kilku modułow ESP - crash pamięci przy wywolaniu client.remoteIP
#1
Witam

chyba juz od tygodnia walcze z pewnym problemem i nie potrafie sobie samemu poradzic a w internecie tez ciezko znalesc podobne problemy... Mianowicie chce skomunikowac kilka modułow ESP32 ze soba korzystajac z protokolu TCP/IP (jeden ESP jest serwerem, reszta sie do niego laczy). Kazdy z ESP chce rozrozniac przez adres IP i w zaleznosci od adresu wrzucac przychodzace dane do konkretnej zmiennej. Aby odczytac adres IP wykorzystuje clien.remoteIP() - zwraca adres IP jednak gdy wywolam w loop ta funkcje wiecej niz jeden raz moj ESP dostaje crash pamieci:

(komunikat: Guru Meditation Error: Core  0 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x00000000  PS      : 0x00060e30  A0      : 0x801100ad  A1      : 0x3ffb3d30 
A2      : 0x3ffccd7c  A3      : 0x3ffccfb0  A4      : 0x3ffcb340  A5      : 0x3ffcb320 
A6      : 0x0204a8c0  A7      : 0x0c04a8c0  A8      : 0x8010ff50  A9      : 0x3ffb3cf0 
A10    : 0x3ffccd8c  A11    : 0x3ffccfb0  A12    : 0x3ffb3d3c  A13    : 0x00000044 
A14    : 0x00000001  A15    : 0x00000006  SAR    : 0x00000010  EXCCAUSE: 0x00000014 
EXCVADDR: 0x00000000  LBEG    : 0x4000c349  LEND    : 0x4000c36b  LCOUNT  : 0x00000000 

Backtrace: 0x00000000:0x3ffb3d30 0x401100aa:0x3ffb3d70 0x4011d011:0x3ffb3d90 0x40122019:0x3ffb3dd0 0x401272b6:0x3ffb3df0 0x401109cf:0x3ffb3e10 0x40088b7d:0x3ffb3e40


Dodam ze crash wystepuje zaraz przy probie polaczenia klientow do ESP 
Jesli podlaczam moduly bez rozpoznawania wszystko jest okej - jestem w stanie wysylac serie danych (co prawda idzie t wolno, kilkanascie razy wolniej niz przez UDP bo z wykorzystaniem UDP zrobilem juz identyczna rzecz) jednak rozpoznanie jest niezbedne aby prawidlowo segregowac dane - zalozmy ze kazde esp wysyla dane z innego czujnika - serwer musi to zebrac i obrobic... Gdy wywoluje client.remoteIP() tylko raz to program dziala (choc nie zawsze, czasem wymaga kilku resetow klienta)

Czy ktos bylby tak dobry i doradzil lub naprowadzil mnie chociaz na odpowiedz jak sobie z tym poradzic? Moze gdzies jest dostepny przyklad?
Załaczam rowniez kod serwera:
Kod:
#include <WiFi.h>

WiFiServer server(80);                // Set a object server as a WiFiServer class
IPAddress IP(192,168,4,1);           // Select ip and mask
IPAddress mask = (255, 255, 255, 0);

void setup() { 
  Serial.begin(115200); 
  WiFi.mode(WIFI_AP);                     // Set Wi-Fi as access point/server
  WiFi.softAP("ESP32", "123456789");                // SSID and Password for the AP
  WiFi.softAPConfig(IP, IP, mask);        // Set our own desired IP address
  server.begin();  // Begin the server

  Serial.println("Server started.");
  Serial.print("IP: ");    
  Serial.println(WiFi.softAPIP());        // .softAPIP calls for the IP of the access point which we set earlier
  Serial.print("MAC:");    
  Serial.println(WiFi.softAPmacAddress());  // Calls for the mac address
  }

void loop() { 
  WiFiClient client = server.available(); // Return a client object to the class if there is a client available
  client.setNoDelay(1);
  if (!client) {return;}    // Return cuts the function (loop) if client class is not connected

//  String request = client.readStringUntil('\r');    // Reads string received until \r and saves as string
//  Serial.print("From ");
//  Serial.print(client.remoteIP());
//  Serial.print(", port ");
//  Serial.println(client.remotePort());
  
  if (client.remoteIP()[3] == 2){ // badanie ostatniego bajtu adresu IP w celu rozpoznania urzadzenia (adresy sa kolejno od 192.168.4.2
  String request = client.readStringUntil('\r');
  Serial.println(" Dostalem po TCP od 1 : " + request);                                
  client.println(" Dostalem po TCP: " + request + "\r");   // Send the data with the \r so the client knows when to stop
  }

    if (client.remoteIP()[3] == 3){
  String request = client.readStringUntil('\r');
  Serial.println(" Dostalem po TCP od 2 : " + request);                                
  client.println(" Dostalem po TCP: " + request + "\r");   // Send the data with the \r so the client knows when to stop
  }
    }
Oraz kod klienta:
Kod:
#include <WiFi.h>

IPAddress ip(192, 168, 4, 1);
const char* host = "192.168.4.1";  //ip serwera do ktorego sie laczymy
const uint16_t port = 80;        
int buffer;      
int sygnal[100];  //tablica do przechowania sprobkowanego sygnalu

void setup()
{
  Serial.begin(115200);
  Serial.println();
  WiFi.begin("ESP32", "123456789");
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  for (int i=0; i <100; i++){   //uzupelnienie zmiennej sygnal wartosciami probek od 0-99
    sygnal[i]=i;
  }
  delay(2500);
}
void loop() {
  //Wydruk na serial monitor adresu i portu po ktorym sie łaczymy
  Serial.print("connecting to ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  for (int i=0; i <100; i++){  //petla w ktorej 100 razy wysylany jest pakiet 2 bajtow
    buffer=sygnal[i];
  // Use WiFiClient class to create TCP connections
    WiFiClient client;
  //w przypadku niedostepnosci serwera czekaj 3 sekundy
    if (!client.connect(host, port)) {
      Serial.println("connection failed");
      Serial.println("wait 3 sec...");
      delay(3000);
      return;
    }
    // wyslanie zawartosci buffer na serwer
  client.print(buffer);
  client.println("\r");
  Serial.print("Wyslalem po TCP: ");
  Serial.println(buffer);
  //odczytaj odpowiedz serwera
  Serial.print("Odpowiedz: ");
  String line = client.readStringUntil('\r');
  Serial.println(line);
  Serial.println("closing connection");
  client.stop();
  } 
//czekaj 5 sekund przed ponowym wyslaniem sygnalu
  Serial.println("wait 5 sec...");
  delay(5000);
}

Pozdrawiam
 
Odpowiedź
#2
Screen z ESP exception decoder:


Załączone pliki Miniatury
   
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości