RFM12B receive String

OP #4796759
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
Gast #4853868
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
OP #4942739
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.