2.4 GHz Tranceiver nrf24L01+ und die Mirf Lib

Hallo,
ich fange gerade an mit den recht günstigen 2,4GHz Tranceivern nrf24L01+ zu spielen.
Für einen ersten Test benutze ich gerade die Library Mirf http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01.
Ich habe aus den Examples die Programme ping_server.ino und ping_client.ino auf 2 Arduinos hochgeladen. Die Kommunikation funktioniert auch. Jetzt versuch ich den Inhalt der Payload zu verändern und verstehe nicht genau, was da eigentlich passiert.

  unsigned long time = millis();
  Mirf.setTADDR((byte *)"serv1");
   Mirf.send((byte *)&time);

An die Library wird damit ein Pointer auf die Variable time übergeben, oder? Gesendet werden dann also 4 Bytes.
Auf der Empfangsseite stehen nach Empfang die Daten in

  byte data[Mirf.payload];

Die Umwandlung des Byte Arrays in eine unsigned long funktioniert zwar, das geht aber doch bestimmt einfacher.

    Mirf.getData(data);
      unsigned long longdata;
    for (int i=sizeof(data)-1; i>=0;i--) {
      longdata = (longdata<<8) + data[i];
    }
    Serial.println(longdata, HEX);

Kann ich hier auch mit einem Pointer arbeiten?

Gruß
Reinhard

Du machst genau das umgekehrte wie vorher: auf einen long* casten und dereferenzieren:

unsigned long longdata = *((unsigned long*)data);

Danke,
nachdem ich mir gerade einiges zum Thema Pointer angeschaut habe, bin ich gerade selbst draufgekommen und lade die unsigned long direkt.

    Mirf.getData((byte *) &longdata);

Ich übergebe einen Pointer und die Funktion schreibt die Daten an die richtige Stelle.
Das mit dem Dereferer muss ich mir jetzt noch mal ansehen. Auf jeden Fall funktioniert es so auch.

Denk daran, dass die Module an allen Geräten eine feste Nutzdaten (Payload) Größe haben.
Diese wird oben im Code mit auf die sizeof(unsigned long) festgesetzt.

Du möchtest da evtl. lieber einen Wert selbst bestimmen, welcher mit deiner Nachrichtenlänge übereinstimmt.

Viele Grüße,
Tobi

Eigentlich offensichtlich, wenn man es mal weiß. Aber ich habe nur "Umwandlung des Byte Arrays" gelesen und mich darauf konzentriert :slight_smile:

Zu Pointern allgemein. Wenn du z.B. das machst:

int data = 50;
int* pData = &data;

Dann ist pData ein Pointer. Um dann in die Daten zu kommen auf die dieser zeigt schreibt man einfach das:

*pData = 20;

Wenn man dagegen pData = 20 macht, würde er den Pointer auf Adresse 20 ändern. Das darf man nicht machen.