Skocz do zawartości
Miksior

Komunikacja TCP/IP kilku modułow ESP - crash pamięci przy wywolaniu client.remoteIP() w celu rozpoznania modułów

Pomocna odpowiedź

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:

#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:

#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);
}

 

Udostępnij ten post


Link to post
Share on other sites

Możesz przypisać wynik tej metody do jakiejś zmiennej i wyświetlić ją zanim zaczniesz się dobierać do poszczególnych jej elementów i porównywać je? Być może to wyjaśni problem.

Przy okazji nie rozumiem czemu koniecznie musisz tę metodę wołać kilka razy, ale to nie ma związku z twoim problemem.

Udostępnij ten post


Link to post
Share on other sites

Probowalem do zmiennej przepisac ostatni bajt adresu i jest to samo - jesli zrobie kilka if'ów sprawdzajacych jej wartosc program sie wysypuje (crash)

 

Udostępnij ten post


Link to post
Share on other sites

To spróbuj tak jak napisałem.

Udostępnij ten post


Link to post
Share on other sites

Piszesz o wywolaniu client.remoteIP() i przepisaniu jej do zmiennej? tak robie, przypisuje jej ostatni bajt do zmiennej i gdy ta zmienna porownuje kilka razy rowniesz dostaje crash

Udostępnij ten post


Link to post
Share on other sites

Nie, nie tak robisz. Wypisz co dostałeś z client.remoteIP() zanim zaczniesz grzebać po tej strukturze danych i wyciągać z niej ostatni bajt.

Udostępnij ten post


Link to post
Share on other sites

Dostaje wtedy pelen adres ip podlaczenego urzadzenia i drukuje go na serial monitor:

From 192.168.4.2, port 50887
 Dostalem po TCP: 44

Dodam tylko ze nawet na dzialajacym testowym programie zdarza sie ze kilka razy musze resetowac esp zanim zacznie pracowac... nie mam pojecia skad to sie bierze

Udostępnij ten post


Link to post
Share on other sites

Dostajesz adres i go drukujesz i co dalej? Nadal masz crash? Bo to by sugerowało, że problem nie jest jednak z remoteIP. Może powstawiaj trochę printów żeby zobaczyć na czym dokładnie się wykłada?

11 minut temu, Miksior napisał:

Dodam tylko ze nawet na dzialajacym testowym programie zdarza sie ze kilka razy musze resetowac esp zanim zacznie pracowac... nie mam pojecia skad to sie bierze

A co się dzieje kiedy nie "zaczyna pracować"? W którym miejscu się zatrzymuje? Może warto najpierw rozwiązać ten problem?

Udostępnij ten post


Link to post
Share on other sites

Crash dzieje sie dokladnie gdy klient probuje sie polaczyc, serwer wstaje (drukuje sobie adres serwera itp...)

Zainstalowalem jeszcze narzedzie do dekodowania bledow, moze ktos cos z tego wywnioskuje:

image.thumb.png.2cd315666882c0ed06fcd45cd5fc1966.png

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...