ESPNOW Daten löschen nach Verarbeitung

Hallo zusammen,

habe ein Problem mit ESPNOW.
Die Daten werden sauber vom Sender zum Empfänger übertragen und auch beim Empfänger angezeigt.
Nun möchte ich aber die übertragenen Daten nach der Verarbeitung im Empfänger löschen um dies beim nächsten loop- Durchlauf wieder neu einzulesen.

Momentan ist es so, dass wenn die Daten vom Sender an den Empfänger übermittelt wurden, diese immer beim Empfänger verarbeitet werden. Sogar, wenn ich den Sender ausschalte. Somit gehe ich davon aus, dass diese durch memcpy in den Speicher unter stationMsg kopiert werden.

Wie kann ich im Empfänger die Daten leeren, damit im Empfänger keine empfangenen Daten vorhanden sind und diese bei der loop- Ausführung wieder neu eingelesen werden.

Bin hier absolut überfordert und hoffe auf Unterstützung.

#include <esp_now.h> // https://wolles-elektronikkiste.de/esp-now
#include <esp_wifi.h>
#include <WiFi.h>
uint8_t myAddress[] = {0x94, 0x3C, 0xC6, 0x33, 0x68, 0x01};

typedef struct data {
    int sen;
    float humidity;
    float temperature;
} data;

String Sensor;
int SenIn;
float TempIn;
float HumaIn;

data stationMsg;

data weatherStation[3] = {0};

void messageReceived(const uint8_t* macAddr, const uint8_t* incomingData, int len){
    memcpy(&stationMsg, incomingData, sizeof(stationMsg));
    weatherStation[macAddr[5]].sen = stationMsg.sen;
    weatherStation[macAddr[5]].humidity = stationMsg.humidity;
    weatherStation[macAddr[5]].temperature = stationMsg.temperature;
}

void setup(){
    Serial.begin(115200);
    delay(1000);
    WiFi.mode(WIFI_STA);
    esp_wifi_set_mac(WIFI_IF_STA, myAddress);
    
    if (esp_now_init() == ESP_OK) {
        Serial.println("ESPNow Init success");
    }
    else {
        Serial.println("ESPNow Init fail");
        return;
    }
    esp_now_register_recv_cb(messageReceived);
}
 
void loop(){
  SenIn = 0;
  TempIn = 999.99;
  HumaIn = 999.99;

    for(int i=2; i<3; i++){

      if(i==2)
      {
        Sensor = " 002 IN"; 
        SenIn = weatherStation[i].sen;
        TempIn = weatherStation[i].temperature,1;
        HumaIn = weatherStation[i].humidity;
      }

      Serial.print("Sensor");
      Serial.print(Sensor);
      Serial.println(":");
      Serial.print("Sen: ");
      Serial.println(SenIn);
      Serial.print("HumaIn: ");
      Serial.println(HumaIn + String(" %"));
      Serial.print("TempIn: ");
      Serial.print(TempIn + String(" °"));
      Serial.println();
    }

    // Hier sollen alle übertragenen Daten gelöscht werden, damit diese beim nächsten Aufruf wieder eingelesen werden

    Serial.println();
    delay(2000);   
}

Gruß
Falke07

nein das tust du nicht.
Wenn du Daten empfängst, befüllst du die Daten einer deiner 3 weatherStation (0, 1 oder 2).

im loop gibst du die Daten der weatherStation[2] aus.
Unabhängig davon ob du Daten empfangen hast oder nicht.
Das wiederholt sich alle zwei Sekunden.

Wenn du die Daten nur bei hereinkommen einmal ausgeben willst und diese nicht mehr benötigst, dann mach die Ausgabe doch einfach in der callback Funktion messageReceived und bereinige den loop.

Imho hast du da einiges im Code das so überhaupt nicht relevant ist.
Wenn du dein Projekt ausführlich beschreibst und anführst was du eigentlich genau erreichen willst, kann man dir sicher besser helfen.

PS.: pass auf dass macAddr[5] NIEMALS größer als 2 wird - du hast nämlich nur 0 bis 2 zur Verfügung!

Hmm,
wenn ich es richtig verstehe, kopiere ich doch die Daten in stationMsg durch memcpy.
Somit dachte ich, dass es doch am einfachsten wäre, stationMsg nach der Verarbeitung aus dem Speicher zu löschen. Dann sollte doch auch weatherStation[i] keine Daten mehr enthalten, wenn der nächste loop kommt und alle weatherStation[i] auch leer sein.

Gut, dein Lösungsvorschlag funktioniert (Thx hierfür), aber wäre mein obiger Gedanke falsch?

"falsch" klingt immer so hart.

Aber wenn du die Werte zunächst in einem incomingData hast
diese dann in ein stationMsg kopierst,
um diese dann in ein weatherStation[] zu kopieren,
um sie dann im loop im Falle von weatherStation[2] in weitere 3 Variablen zu kopieren.
um diese auszugeben,
und dann irgendwas löschen zu wollen damit die Werte nicht mehr da sind, ...

klingt für mich halt nicht sehr effizent.

Hallo,
man könnte ein live Bit einführen, das der Sender mit sendet und der Empfänger die Daten nur dann übernimmt wenn sich das Bit geändert hat.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.