Skocz do zawartości

Komunikacja między dwoma ESP - problem z odczytanie informacji


Zgredek

Pomocna odpowiedź

Witam

Podepnę cię pod ten temat gdyż mam mały problem i nie umiem sobie z nim poradzić

W Arduino dopiero zaczynam raczkować więc proszę o łaskawe traktowanie 🙂

 

Komunikuję Się między dwoma ESP,  do klienta mam podłączone dwa przyciski i wysyłam dwie informacje:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid = "circuits4you";
const char *pass = "password"; 

unsigned int localPort = 2000;

IPAddress ServerIP(192,168,4,1);
IPAddress ClientIP(192,168,4,2);

WiFiUDP udp;



void setup(){

  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
  pinMode(16, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  
    Serial.begin(9600);
    Serial.println();
    WiFi.softAP(ssid, pass);

    Serial.println("Starting UDP");
    udp.begin(localPort);

    Serial.print("Local port: ");
    Serial.println(udp.localPort());
}



void loop(){
    int cb = udp.parsePacket();

    if (!cb) 
    {
      if(digitalRead(4) == LOW) {
        udp.beginPacket(ClientIP, 2000);         
        udp.write("A");
        udp.endPacket();
        digitalWrite(LED_BUILTIN, LOW);
        delay(200);
        digitalWrite(LED_BUILTIN, HIGH);
        }
    }
        
    if (!cb) 
    {
      if(digitalRead(5) == LOW) {
        udp.beginPacket(ClientIP, 2000);
        udp.write("V");
        udp.endPacket();
        digitalWrite(LED_BUILTIN, LOW);
        delay(200);
        digitalWrite(LED_BUILTIN, HIGH);
        }
    }
    
}

Serwer odbiera informacje, w moim przypadku przykładowe litery A i V

Do serwera mam podłączone kilka przekaźników i po odebraniu informacji wykonują daną sekwencję załączeń.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid = "circuits4you";
const char *pass = "password"; 

unsigned int localPort = 2000;

unsigned long jedenMillis = 0;
unsigned long dwaMillis = 0;
unsigned long trzyMillis = 0;
unsigned long czteryMillis = 0;
unsigned long zwlokaMillis = 0;

IPAddress ServerIP(192,168,4,1);
IPAddress ClientIP(192,168,4,2);

WiFiUDP udp;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 

void setup(){

  pinMode(0,OUTPUT);
  digitalWrite(0, HIGH);
  pinMode(2,OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(4,OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5,OUTPUT);
  digitalWrite(5, HIGH);
  
  pinMode(16,OUTPUT);
  digitalWrite(16, LOW);
   
    Serial.begin(9600);
    Serial.println();

    WiFi.begin(ssid, pass);
  
    Serial.println("");

  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(16, HIGH);
    delay(500);
    Serial.print(".");
    digitalWrite(16, LOW);
    delay(500);
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
    
    Serial.println("Starting UDP");
    udp.begin(localPort);
    Serial.print("Local port: ");
    Serial.println(udp.localPort());
}

void loop() {
   int cb = udp.parsePacket();
    
    if (cb) {
                udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
                Serial.print(packetBuffer);
                digitalWrite(4, LOW);
                jedenMillis = millis() + 500;
                dwaMillis = millis() + 600;
                trzyMillis = millis() + 600;
                delay(100);        
                digitalWrite(5, LOW);
                delay(50);
                digitalWrite(0, LOW);
             }      


    
    if(millis() >= jedenMillis) {
      digitalWrite(4, HIGH);
    }
    if(millis() >= dwaMillis) {
      digitalWrite(5, HIGH);
    }
    if(millis() >= trzyMillis) {
      digitalWrite(0, HIGH);
    }
    

}

Łączenie przebiega w porządku i odbieranie informacji też, na serial porcie tak to wygląda:

⸮txW⸮H$48⸮$<⸮⸮⸮

.......
Connected to circuits4you
IP address: 192.168.4.2
Starting UDP
Local port: 2000
AAVVVVA

Problem dotyczy - jak rozróżnić te informacje, żeby po wysłaniu i odebraniu A wykonać przykładowo powyższą sekwencję a po wysłaniu i odebraniu V inną sekwencję

Nie umiem puki co sobie z typ poradzić

Próbowałem przeczytać bufor i go rozpoznać ale nie wychodzi mi...

  • Lubię! 1
Link do komentarza
Share on other sites

22 minuty temu, Zgredek napisał:

Próbowałem przeczytać bufor i go rozpoznać ale nie wychodzi mi...

Pokaż jak próbowałeś. Przy okazji - podpinanie się pod inny wątek z problemem zupełnie nie na temat to głupi pomysł... @Treker - byłbyś tak miły i wydzielił to do nowego wątku?

 

Link do komentarza
Share on other sites

Z tym podpinaniem bendę miał na uwadze 😉

void loop() {
   int cb = udp.parsePacket();
    
    if (cb) {
                
                
                int read = udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE); 
                Serial.print(packetBuffer);
                packetBuffer[read] = 0;
                char odczyt[] = { packetBuffer["A"], packetBuffer["V"], '\0'};
                
                if (strcmp( odczyt, "A") == 0 ) {
                digitalWrite(4, LOW);
                jedenMillis = millis() + 500;
                dwaMillis = millis() + 600;
                trzyMillis = millis() + 600;
                delay(100);        
                digitalWrite(5, LOW);
                delay(50);
                digitalWrite(0, LOW);
                } 
                
                if (strcmp( odczyt, "V") == 0 ) {
                digitalWrite(4, LOW);
                jedenMillis = millis() + 500;
                trzyMillis = millis() + 600;
                czteryMillis = millis() + 600;
                delay(100);        
                digitalWrite(2, LOW);
                delay(50);
                digitalWrite(0, LOW);
                } 
              }    


    
    if(millis() >= jedenMillis) {
      digitalWrite(4, HIGH);
    }
    if(millis() >= dwaMillis) {
      digitalWrite(5, HIGH);
    }
    if(millis() >= trzyMillis) {
      digitalWrite(0, HIGH);
    }
    if(millis() >= czteryMillis) {
      digitalWrite(2, HIGH);
    }
    
    

}

Takie moje próby ☹️

nie przechodzi kompilacji na:

char odczyt[] = { packetBuffer["A"], packetBuffer["V"], '\0'};

wyrzuca błąd: invalid types 'char [8192][const char [2]]' for array subscript

i brakło mi pomysłów jak to ugryźć

bo A/V bez " " też nie pomaga.

 

 

Link do komentarza
Share on other sites

Bo ta linijka jest absolutnie sprzeczna ze składnią języka. Z ciekawości - co to miało oznaczać?

Przede wszystkim nie bardzo rozumiem, dlaczego chcesz koniecznie operować napisami, jeśli wystarczy porównanie pojedynczego znaku.

Na początku bufora siedzi sobie znak odebrany przez UDP. Dalej nie ma co bufora analizować, przesyłany powinien być dokładnie jeden znak.

Czyli coś w stylu:

char odebrany = packetBuffer[0];
printf("Odebrano %c\n", odebrany);
if (odebrany == 'A') {
  // tu coś robisz
}
else if (odebrany  == 'V') {
  // a tu robisz coś innego
}

ewentualnie tak bardziej profesjonalnie:

char odebrany = packetBuffer[0];
printf("Odebrano %c\n", odebrany);
switch(odebrany) {
  case 'A':
    // coś robisz
    break;
  case 'V':
    // coś innego robisz
    break;
  default:
    printf("Co ty mi tu wysyłasz?\n");
}

Czy to jasne?

Proponuję jakiś najprostszy kurs C++...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dziękuję za odpowiedź

Co do linijki to gdzieś podpatrzone i próbowałem zastosować u mnie ale nie wyszło 😅

Nie muszą to być litery, taki sobie przykład wziąłem, zapewne nie potrzebie.

trochę jaśniejsze, popróbuję

Link do komentarza
Share on other sites

Akurat czy to litera czy nie w tym przypadku to nieważne - program operuje na liczbach, a zapis literowy jest po prostu wygodniejszy do czytania przez człowieka.  Równie dobrze zamiast 'A' mógłbym użyć 65, 051 albo 0X41 - wszystkie te zapisy oznaczają to samo.

  • Lubię! 1
Link do komentarza
Share on other sites

Problem udało się rozwiązać

w zasadzie mi do szczęścia nie dużo brakowało 😄

Linijka z którą miałem problem, wystarczyło tylko tak zmienić:

char odczyt[] = { packetBuffer[0], packetBuffer[1], '\0'};

THX

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.