17-06-2020, 00:15
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:
Oraz kod klienta:
Pozdrawiam
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
}
}
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