RFM70 schon wieder.

OP #3048357
Lesenswert?

Hallo,

das Thema RFM70 ist ja hier schon öfter diskutiert worden, jetzt habe 
ich mich auch mal daran versucht, die Teile mittels AVR zum laufen zu 
bekommen.
Leider kommt auf der Gegenseite nur Mist an.

Ich habe auf einem Steckbrett mal einen Testaufbau gemacht, mit 2 
ATMega48 und einem PTX und einem PRX RFM70. Da ich die RFM70-Bibliothek 
von http://projects.weber-itam.de/?p=90 verwende, dachte ich eigentlich, 
es sollte keine Probleme geben. Die Kommunikation beider Module mit dem 
zugehörigen AVR funktioniert, ich habe mal testweise die Channels 
ausgelesen und über UART ausgegeben, klappt alles wunderbar.
Die RX-Seite reagiert auf ein ankommendes Paket und sendet das Ergebnis 
per UART ab, es kommen aber nur Linefeeds und Punkte (dez.: 10 und 46) 
an...

Hier mein Code:
1
//#define SEND
2

3
#include <inttypes.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <util/delay.h>
7
#include <stdlib.h>
8

9
#include "uart.h"
10
#include "rfm70.h"
11
 
12
#define UART_BAUD_RATE 9600
13

14
#ifndef SEND
15
// ###################### RECEIVE CODE ######################
16

17
int main()
18
{
19
  uint8_t buffer[32];
20
  uint8_t val;
21

22
  sei();
23

24
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
25
  uart_puts("System Ready\n");
26

27
  Begin();
28
  setMode(1);
29
  setChannel(25);
30

31
  while (1)
32
  {
33
    val = receivePayload(buffer);
34

35
    if (val) {
36

37
      uart_puts((char*) buffer);
38
      uart_puts("\n");
39
    }
40
  }
41
  
42
  return 0;
43
}
44

45
#else
46
// ###################### SEND CODE ######################
47

48
int main()
49
{
50
  uint8_t value1 = 0;
51

52
  sei();
53

54
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
55
  uart_puts("System Ready\n");
56

57
  Begin();
58
  setMode(0);
59
  setChannel(25);
60

61
  while (1) {
62

63
    value1 = (uint8_t)uart_getc();
64

65
    if(value1) {
66

67
      PORTB |= (1<<PB0);
68

69
      sendPayload(value1,1,0);
70
      uart_putc(value1);
71

72
      PORTB &= ~(1<<PB0);
73
    }
74

75
  }
76
  
77
  return 0;
78
}
79

80
#endif

Ich hoffe, ihr könnt mir helfen!

Viele Grüße,
Christoph
#3048891
Lesenswert?

Christoph Brennig schrieb:
> Ich hoffe, ihr könnt mir helfen!

Den Fehler kannst Du sehr einfach selber finden, indem Du die Warnung 
des Compilers beachtest. Diese Warnungen gibt es nicht umsonst. Sie 
bedeuten in aller Regel, dass das Programm nicht macht, was es soll.

Falls noch nicht geschehen, füge in den Projektoptionen -Wall ein, dann 
warnt der Compiler in noch mehr Situationen vor Fehlerquellen.
#3049146
Lesenswert?

Du hast auch noch einen anderen, subtileren Fehler im Code. Die Funktion 
uart_puts() erwartet nämlich einen Null-terminierten String. 
receivePayload() liefert dagegen nur die Bytes, die Du per Funk 
übertragen hast, ohne abschließendes Null-Byte.

Der Code funktioniert nur zufällig, weil Dein Paket kürzer als 32 Byte 
ist und das Array buffer anscheinend zu Beginn des Programms mit Null 
gefüllt ist. Letzteres ist aber nicht selbstverändlich, da Du es nicht 
explizit initialisiert hast!

Du musst also entweder das Null-Byte mit übertragen oder die 
Ausgabefunktion im Empfänger ändern, damit es sauber funktioniert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren