Go Down

Topic: RF12 Datenstruct senden, empfangen und wieder trennen (Read 4 times) previous topic - next topic

MueThoS

Hallo zusammen,
ich brauche mal ein paar Tips.
Ich habe zwei RF12 Module.
Senden und empfangen geht schon mal  :)

Nun habe ich mal wieder eine Wissenslücke.
Und zwar sammle ich an einem Modul verschiedene Daten. Diese wollte ich in einem Struct speichern.
Senden würde ich das ja in etwa so:
Code: [Select]
rf12_sendStart(0, &payload, sizeof payload);

Leider kann ich nicht ganz nachvollziehen was am ende raus kommt.
Wenn mein zusammengesetztes Payload eigentlich 12345 sein müsste
kommt komischer weise 12950 am anderen ende raus.
Ausgelesen wird das ganze ja durch folgenden code:
Code: [Select]
if (rf12_recvDone() && rf12_crc == 0) {
        for (byte i = 0; i < rf12_len; ++i) {
            Serial.print((int) rf12_data[i]);
}


Deshalb zwei Fragen:
1. Wieso kommt so was komisches an? Übersehe ich etwas?
2. Wie kann ich am besten den Empfangenen String wider in das Construct bekommen.



Das Struct:
Code: [Select]
struct {
    byte t_id;
    byte light;     // light sensor: 0..255
    byte moved :1;  // motion detector: 0..1
    byte humi  :7;  // humidity: 0..100
    int temp   :10; // temperature: -500..+500 (tenths)
    byte lobat :1;  // supply voltage dropped under 3.1V: 0..1
} payload;

mmi

#1
Mar 03, 2012, 06:28 am Last Edit: Mar 03, 2012, 06:33 am by mmi Reason: 1
Kommt auch bei mehreren Versuchen immer "12950" statt "12345" an ??
Falls ja, bitte den kompletten Programmcode für Sender und Empfänger zeigen.

Gruß, mmi.

MueThoS

Ja es kommt immer 12950 an:
Code: [Select]
[crypRecv]
31 =12950
32 =12950
33 =12950
34 =12950
35 =12950
36 =12950
37 =12950


Sender:
Code: [Select]
#include <RF12.h>
#include <Ports.h>
#define T_ID 10

MilliTimer sendTimer;
byte sendSize;
struct {
    byte t_id;
    byte light;     // light sensor: 0..255
    byte moved :1;  // motion detector: 0..1
    byte humi  :7;  // humidity: 0..100
    int temp   :10; // temperature: -500..+500 (tenths)
    byte lobat :1;  // supply voltage dropped under 3.1V: 0..1
} payload;

void setup () {
    Serial.begin(57600);
    Serial.println("\n[crypSend]");
    rf12_initialize(T_ID, RF12_868MHZ, 47);
    rf12_encrypt(RF12_EEPROM_EKEY);
}

void loop () {
    rf12_recvDone();
    if (rf12_canSend() && sendTimer.poll(1000)) { // jede sekunde senden
        payload.t_id = 1;
        payload.light = 2;
        payload.moved = 3;
        payload.humi = 4;
        payload.temp =5;
       
        rf12_sendStart(0, &payload, sizeof payload);
     }
}


Empfänger:
Code: [Select]
#include <RF12.h>
#include <Ports.h>

struct {
  byte t_id;
    byte light;     // light sensor: 0..255
    byte moved :1;  // motion detector: 0..1
    byte humi  :7;  // humidity: 0..100
    int temp   :10; // temperature: -500..+500 (tenths)
    byte lobat :1;  // supply voltage dropped under 3.1V: 0..1
} payload;

void setup () {
    Serial.begin(57600);
    Serial.println("\n[crypRecv]");
    rf12_initialize(1, RF12_868MHZ, 47);
    rf12_encrypt(RF12_EEPROM_EKEY);
}

void loop () {
    if (rf12_recvDone() && rf12_crc == 0) {
        // good packet received
        Serial.print(' ');
        Serial.print(rf12_seq);
        Serial.print(" =");
        for (byte i = 0; i < rf12_len; ++i) {
            Serial.print((int) rf12_data[i]);
        }
        Serial.println();
    }
}


Der Code soll noch nicht viel machen! Muss mich da jetzt erstmal einarbeiten und schritt für schritt erweitern.
Was hab ich für Möglichkeiten und so.
Möchte zb noch wissen ob ich die Versender-ID am Empfänger auslesen kann.
Dann würde ich die nicht im Payload mit senden sondern so erkennen, fände ich besser.

Was ich auch noch nicht verstehe (steht auch nicht in der Referenz :
Beim Struct
byte moved :1; <- was bedeutet die 1 oder die 7 oder die 10 bei meinem Struct

-Holger-

Hallo MueThoS,
(und hallo Forum, ich fange nach langem mitlesen mal an, mitzuschreiben)

Meine Vermutung:
Schau dir mal http://www.c-howto.de/tutorial-strukturierte-datentypen-bitfelder.html oder http://en.wikipedia.org/wiki/Bit_field an.

Dein Struct orientiert sich nicht an Bytegrenzen ... Und daher kommen beim byteorientierten Ausgeben (beim Serial.print) deines Empfangs-code auch komische Daten raus.

Versuche bei der Ausgabe auch wieder die Elemente des Structs zu verwenden und anzusprechen, wie du es beim befüllen machst ... Oder lasse die Doppelpunkt-angaben einfach weg (das macht aber deine Nachrichten unnötig groß).

Viele Grüße,
Holger

rz259

Hallo MueThoS,

wie Holger schon richtig bemerkte, ist das eine Struktur mit Bitfeldern. Die Zahl hinter dem Doppelpunkt gibt an, wieviele Bits das Attribut  belegt.
Code: [Select]

struct {
    byte t_id;
    byte light;     // light sensor: 0..255
    byte moved :1;  // motion detector: 0..1
    byte humi  :7;  // humidity: 0..100
    int temp   :10; // temperature: -500..+500 (tenths)
    byte lobat :1;  // supply voltage dropped under 3.1V: 0..1
} payload;


Das Attribut "moved" z. B. hat nur eine Länge von einem Bit, da versuchst du, den Wert 3 reinzuschreiben - bei einem Bit geht aber nur 0 oder 1.

Du solltest also erst mal da nur vernünftige Werte reinschreiben, die 3 kriegst du so nie wieder raus.
Auch ist es schwierig, die Werte direkt von der empfangenen Struktur so anzuzeigen, das stimmt ja vom Speicherlayout her nicht mit deiner Struktur "Payload" überein.

Die in meinen Augen einfachste Vorgehensweise wäre es, die empfangenen Bytes in einer eigenen Struktur zu übertragen (byte [5]) und dann die Daten in deine payload-Struktur zu kopieren, also z. B:

Code: [Select]

byte buffer[sizeof(payload)];
memcpy(&payload, &buffer, sizeof(payload));


Danach kannst du deine Daten aus der payload-Struktur ausgeben, indem du die einzelnen Attribute ansprichst, also z. B.

Code: [Select]

  Serial.println (payload.temp);
  Serial.println (payload.humi);


Ich hoffe, dass das dann bei dir so klappt.

Ciao,

Rudi


Go Up