Skocz do zawartości

Miksior

Użytkownicy
  • Zawartość

    12
  • Rejestracja

  • Ostatnio

Reputacja

5 Neutralna

O Miksior

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. 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:
  2. 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
  3. 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
  4. Probowalem do zmiennej przepisac ostatni bajt adresu i jest to samo - jesli zrobie kilka if'ów sprawdzajacych jej wartosc program sie wysypuje (crash)
  5. 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); }
  6. Witam Robilem ciekawe rzeczy na esp32 i esp8266 i chcialem dalej rozwijac moje tematy, kupilem nowy modul ESP32 i mam problem, mianowicie skopiowany program ze starego urzadzenia wrzucam na nowe i urzadzenie nawet nie startuje, bez przerwy sie resetuje. W czym moze byc problem? Urzadzenia maja ta sama specyfikacje, sa identyczne. Probowalem wgrac firmware za pomoca flash download tool 3.6.8 (nie wiem czy udalo mi sie to zrobic z powodzeniem, niby znalazlem w sieci jakis firmware i go wgralem lecz jak widac urzadzenie nie podejmuje pracy). co moze byc przyczyna? zle wgrany firmware? Bede wdzieczny za kazda wskazowke, Okej, przed chwila udalo mi sie rozwiazac problem, wystarczylo zmienic Flash Frequency z 80 na 40MHz, pytanie tylko skad ta roznica?
  7. Witam mam trzy moduly ESP - 2 nowe i 1 stary, na tym starym mam wgrany kod (do laczenia sie po TCP lub UDP i przesylania danych) i dziala jak nalezy - nawiazuje polaczenie i przesyla dane, natomiast na dwoch "nowych" modulach wgrywam ten sam kod i niestety, kompiluje sie i wgrywa natomiast nie nawiazuje polaczenia (dodam ze w kodzie nie zmieniam niczego!) wgrywalem firmware z wykorzystaniem programu NODEMCU FLASH MASTER, bez skutku... dodatkowo wrzuce kod: #include <ESP8266WiFi.h> #include <WiFiUdp.h> IPAddress ip(192, 168, 4, 1); const char* host = "192.168.4.1"; const uint16_t port = 80; 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()); } 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); // 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; } // This will send the request to the server client.println("hello from ESP8266"); Serial.println("Wyslalem po TCP: Hello from ESP8266"); //read back one line from server Serial.print("Odpowiedz: "); String line = client.readStringUntil('\r'); Serial.println(line); Serial.println("closing connection"); client.stop(); Serial.println("wait 5 sec..."); delay(5000); } Dodam tylko ze te dwa nowe moduly sa identyczne, roznia sie jedynie sposobem grawerowania napisu na procku, parametry maja te same Michal
  8. Zgadza sie, ogarnalem tez komunikacje poprzez TCP i dziala dopoki nie chcialem polaczyc 3 moduly, jeden glowny ktory jest AP i czyta dane, jeden wysyla dane po UDP a drugi po TCP, Wklejam kod: Moze ktos jest w stanie powiedziec mi co tutaj blokuje komunikacje z wykorzystaniem obu protokolow na raz? jak to rozdzielic? #include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h> #include <WiFiUdp.h> #include <stdlib.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); WiFiUDP Udp; unsigned int localUdpPort = 4210; // local port to listen on char incomingPacket[255]; // buffer for incoming packets char incomingPacket1[255];// wyciecie litery z ramki UDP aby przekonwertowac String na float float temp; float hum; // The devices that want to connect to our Access Point will need to use the next credentials. char ssid[] = "ESP32"; // SSID for the Access Point char pass[] = "123456789"; // password for the Access Point void setup() { Serial.begin(115200); Serial.print("Setting soft-AP ... "); Serial.println(WiFi.softAP("ESP32", "123456789") ? "Ready" : "Failed!"); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.begin(); // Begin the server Udp.begin(localUdpPort); //Serial.printf("Now listening at IP %d, UDP port %d\n", WiFi.softAPIP(), localUdpPort); Serial.print("Now listening at IP: "); Serial.print(WiFi.softAPIP()); Serial.print(" UDP PORT: "); Serial.print(localUdpPort); Serial.println(" TCP PORT: 80 "); } void loop() { WiFiUDP Udp; //UDP: int packetSize = Udp.parsePacket(); if (packetSize) { // receive incoming UDP packets Serial.printf("Dostalem po UDP: Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(incomingPacket, 255); Serial.printf("UDP packet contents: %s\n", incomingPacket); if (incomingPacket[0]=='t'){ //sprawdzanie jaka wartosc przyszla (temp czy humidity czy inna) for (int i=1; i<7; i++){ // wyciecie litery z ramki UDP aby przekonwertowac String na float incomingPacket1[i-1]=incomingPacket[i]; } String msg = String(incomingPacket1); //konwersja string na float float jakasliczba = msg.toFloat(); //konwersja string na float Serial.print("Temperatura wynosi :"); Serial.println(jakasliczba); temp=jakasliczba; } if (incomingPacket[0]=='h'){ for (int i=1; i<7; i++){ incomingPacket1[i-1]=incomingPacket[i]; } String msg = String(incomingPacket1); float jakasliczba = msg.toFloat(); Serial.print("Humidity wynosi :"); Serial.println(jakasliczba); hum=jakasliczba; } if (len > 0) { incomingPacket[len] = 0; } //TCP: WiFiClient client = server.available(); // Return a client object to the class if there is a client available 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.println(" Dostalem po TCP: " + request); //client.flush(); client.println(" Dostalem po TCP: " + request + "\r"); // Send the data with the \r so the client knows when to stop //Serial.println(request + "Aknowledge"); } WiFiClient client = server.available(); // Return a client object to the class if there is a client available 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.println(" Dostalem po TCP: " + request); //client.flush(); client.println(" Dostalem po TCP: " + request + "\r"); // Send the data with the \r so the client knows when to stop //Serial.println(request + "Aknowledge"); } EDIT: rozwiazalem, trzeba bylo wstawic linijke: client.stop();
  9. oczywiscie w przypadku konwersji przychodzacej wiadomosci: String msg = String(incomingPacket); int jakaśliczba = msg.toInt(); w przypadku proby wyslania jakiejs liczby typu int: char buffer[16]; //16 bitow sprintf(buffer, "%d", jakaśliczba); Udp.write(buffer, sizeof(char) * 16)
  10. Witam ogarnalem sobie komunikacje kilku modulow ESP poprzez UDP, chcialbym teraz zrobic to poprzez TCP/IP, moglby ktos mnie nakierowac na dobry poradnik/przyklad w ktorym jest to dosc prosto i lopatologoczinie zrobione? Szukalem sporo w necie, jednak nie znalazlem klarownego przykladu czy tez poradnika w ktorym opisana jest komunikacja kilka modulow w taki sposob Bede wdzieczny za kazda pomoc Pozdrawiam
  11. Witam serdecznie wczoraj pol dnia glowilem sie nad pewnym tematem i nic nie wymyslilem, robie zdalny system pomiarowy w ktorym kilka modulów WiFi (jeden glowny ESP32 jest serverem, pozostale 8266 to klienci) beda zbierac dane z czujnikow, wysylac po UDP (moze w przyszlosci TCP) do serwera a stamtad powedruja na jakas strone/apke. Mam zrobiona na esp komunikacje UDP zarowno po stronie accespointa jak i klienta, natomiast przesylana ramka danych jest w formacie ASCII, problem (moze trywialny) to wyslanie i odebranie danych w formacie int/float (bo tego typu dane beda pochodzily z czujnikow). Probowalem roznych funkcji jak i sposobow rzutowania, zawsze arduino ide (bo w tym programuje ESP) zwraca mi bledy o niedozwolonej konwersji itp... Wrzuce kod na ktorym poprawnie sa wysylane dane jednak tak jak pisalem jako tekst w ASCII: Strona klienta: #include <ESP8266WiFi.h> #include <WiFiUdp.h> WiFiUDP Udp; unsigned int localUdpPort = 4210; // local port to listen on IPAddress ip(192, 168, 4, 1); 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()); } void loop() { while (WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); delay(10000); Serial.print(".Reconnected"); Serial.println(WiFi.localIP()); } Udp.beginPacket(ip, localUdpPort); Udp.write("45"); // wysyłamy jeden bajt Udp.endPacket(); Serial.print("Wyslalem cos\n"); delay(5000); } Jak widac wyslanie tekstu nie jest problemem ale nie umiem wyslac danych np z typu int, gdyz wysyla sie calkmien zmieniona wartosc Na stronie serwera wyglada to tak: #include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h> #include <WiFiUdp.h> #include <stdlib.h> WiFiUDP Udp; unsigned int localUdpPort = 4210; // local port to listen on char incomingPacket[255]; // buffer for incoming packets void setup() { Serial.begin(115200); Serial.println(); Serial.print("Setting soft-AP ... "); Serial.println(WiFi.softAP("ESP32", "123456789") ? "Ready" : "Failed!"); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); Udp.begin(localUdpPort); Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); } void loop() { int packetSize = Udp.parsePacket(); if (packetSize) { // receive incoming UDP packets Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(incomingPacket, 255); if (len > 0) { incomingPacket[len] = 0; } Serial.printf("UDP packet contents: %s\n", incomingPacket); } } Czy ktos moglby powiedziec albo moze wskazac przyklad jak poprzez UDP przeslac np float? Bede wdzieczny za rady
×
×
  • Utwórz nowe...