Forum: Mikrocontroller und Digitale Elektronik RFM12B receive String


von Hi H. (hi_h)


Lesenswert?

Guten Abend,

ich habe mein Projekt (drahtlose Temperaturmessstation mit RFM12B Chips) 
jetzt um ein drahtloses Display erweitert, auf dem die Temperatur 
angezeigt werden soll.

Mein aktueller Quellcode:
1
#include <RFM12B.h>
2
#include <avr/sleep.h>
3
#include <LiquidCrystal.h>
4
 
5
#define NODEID            30  //network ID used for this unit
6
#define NETWORKID        210  //the network ID we are on
7
#define ACK_TIME        2000  // # of ms to wait for an ack
8
 
9
#define LEDpin 1
10
 
11
#define SenderNODE 22
12
 
13
//Define LED-Ports
14
#define LCD_RS 9
15
#define LCD_enable 6
16
#define LCD_D4 5
17
#define LCD_D5 4
18
#define LCD_D6 3
19
#define LCD_D7 7
20
 
21
 
22
LiquidCrystal lcd(LCD_RS, LCD_enable, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
23
RFM12B radio;
24
 
25
static void activityLED (byte mode) {
26
  pinMode(LEDpin, OUTPUT);
27
  digitalWrite(LEDpin, mode);
28
}
29
 
30
 
31
static void blink (byte pin, byte n = 3) {
32
  pinMode(pin, OUTPUT);
33
  for (byte i = 0; i < 2 * n; ++i) {
34
    delay(100);
35
    digitalWrite(pin, !digitalRead(pin));
36
  }
37
}
38
 
39
void setup() {
40
 
41
    if (LEDpin) {
42
    activityLED(1); // LED on
43
    delay(1000);
44
    activityLED(0); // LED off
45
  }
46
 
47
  radio.Initialize(NODEID, RF12_868MHZ, NETWORKID);
48
  lcd.begin(16, 2);
49
 
50
  lcd.print("Es funktioniert!");
51
  lcd.setCursor(0, 0);
52
 
53
  delay(1000);
54
  lcd.clear();
55
 
56
 
57
}
58
 
59
void loop() {
60
 
61
 
62
  if (radio.ReceiveComplete()) {
63
    if (radio.CRCPass()) {
64
      if (radio.GetSender() == SenderNODE) {
65
        int i;
66
        char cmd[*radio.DataLen];
67
        for (byte i = 0; i < *radio.DataLen; i++) //can also use radio.GetDataLen() if you don't like pointers
68
          cmd[i] = ((char) radio.Data[i]);
69
        lcd.print ((char) radio.Data[i]);
70
         
71
        cmd[i] = '\0';
72
       
73
       
74
       
75
        //PRINT TO DISPLAY HERE
76
        //lcd.print("test");
77
        lcd.setCursor(0, 1);  
78
 
79
        if (LEDpin) {
80
          blink(LEDpin, 2);
81
        }
82
     
83
   
84
   
85
   
86
   
87
   
88
   
89
    } }  }

Mein Ziel ist es jetzt, dass der String, der von dem Sender gesendet 
wird auf dem Display angezeigt wird. Ich bekomme nur nicht so richtig 
hin aus den empfangenen Daten wieder einen String zu machen.

Vielen Dank schon mal im Voraus
Paul

von Florian (Gast)


Lesenswert?

Hi H. schrieb:
> for (byte i = 0; i < *radio.DataLen; i++)
>           cmd[i] = ((char) radio.Data[i]);
>         lcd.print ((char) radio.Data[i]);
>
>         cmd[i] = '\0';

Is zwar schon etwas her, aber ...

Was genau willst Du denn da machen?
1
// Willst Du hier die Daten aus "radio.Data[i]" in "cmd[i]" kopieren?
2
for (byte i = 0; i < *radio.DataLen; i++)
3
{
4
   cmd[i] = ((char) radio.Data[i]);
5
}
6
7
// Warum gibst Du dann "radio.Data[i]" aus, wozu dann das kopieren in "cmd[i]"? Wenn Du die Laufvariable i angibst landest Du auch im nirgendwo, da sie nach dem hochlaufen in der for-Schleife jetzt am Ende des Arrays steht. Das kann also gar nicht klappen :-) 
8
lcd.print ((char) radio.Data[i]);
9
10
// Wenn Du hier das String Ende setzt, was Grundsätzlich nicht falsch ist, warum machst Du dann mit cmd[i] nichts mehr?
11
cmd[i] = '\0';
12
13
14
// Du kannst auch einfach "cmd[i] = 0" schreiben.

logischer fände ich sowas:
1
for (byte i = 0; i < *radio.DataLen; i++)
2
{
3
   cmd[i] = ((char) radio.Data[i]);
4
}
5
cmd[i] = 0;
6
7
// Ein Array ist bereits ein Pointer auf das erste Element
8
lcd.print ((char) cmd);
9
10
// Du kannst auch schreiben:
11
lcd.print ((char) &cmd[0]);
12
13
// ob der cast auf (char) nötig ist kann ich Dir nicht sagen, das musst Du testen.


Mein code ist aber nur eine Grundlage, ich denke nicht das es so auf 
anhieb klappen wird.

Warum kopierst Du überhaupt um? Wenn Du einen String sendest sollte der 
doch auch eine 0-Terminierung haben. Kannst Du dann nicht sofort 
"radio.Data" ausgeben?

Gruß
Florian

von Hi H. (hi_h)


Lesenswert?

Hallo Florian,

vielen Dank für die ausführliche Antwort! Habe jetzt leider auch schon 
länger nicht mehr hier rein geguckt, daher die späte Antwort.

Ich werde den Code direkt mal ausprobieren und gegebenfalls versuchen 
ans Laufen zu bringen.

Ich wollte einen String haben, damit ich diesen speichern und dann wenn 
ein neuer Messwert ankommt, den alten in der unteren Zeile des LCDs 
anzeigen kann.

Gruß
Paul

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.