Forum: Mikrocontroller und Digitale Elektronik RFM12B receive String


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hi H. (hi_h)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.