Forum: Mikrocontroller und Digitale Elektronik RFM12 String auswerten


von Martink11 M. (Firma: google) (martink11) Flattr this


Lesenswert?

Hallo C-Freunde und Kollegen,

habe hier 2 rfm12-Funkmodule und atmega8 und möchte gern einen String 
übertragen. Programmiersprache ist C.
Ich würde jetzt einfach mithilfe von strcmp den string vergleichen und 
dann darauf reagieren, wahrscheinlich stimmt bloß was in der Syntax oder 
so nicht.
aber vll kann mir jemand auf die schnelle weiterhelfen.
1
void receive(void)
2
{  unsigned char test[10];  
3
  rf12_rxdata(test,10);  
4
  // daten verarbeiten
5
6
7
//von mir
8
//-----------------------------------------------------------------------------
9
             if     (strcmp(test, "signal") == 0)      //Befehl
10
              {
11
                for(j=0;j<10;j++)
12
                {
13
                summer_on;
14
                _delay_ms(100);
15
                summer_off;
16
                }
17
              }
18
19
//-----------------------------------------------------------------------------
20
}
21
22
23
void send(void)
24
{  unsigned char test[]="signal\n ";  
25
  rf12_txdata(test,10);
26
}
27
//###########################################################################################################################################
28
//###########################  Hauptprogramm  ###############################################################################################
29
//###########################################################################################################################################
30
31
32
33
34
int main(void)
35
{
36
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
37
  rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
38
  rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
39
  rf12_setbaud(19200);      // 19200 baud
40
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift
41
42
  while(1)
43
  {
44
    if(taster == false)
45
    {
46
    send();
47
    for (unsigned char i=0; i<100; i++)
48
      _delay_ms(10);
49
50
    receive();
51
52
    }
53
  }
54
}

das wäre der Coden mit den beiden Unterprogrammen die ich schon fertig 
gefunden hab (  send() und receive()  )

danke Moartl

von Karl H. (kbuchegg)


Lesenswert?

Martin 567 schrieb:

> Ich würde jetzt einfach mithilfe von strcmp den string vergleichen und
> dann darauf reagieren, wahrscheinlich stimmt bloß was in der Syntax oder
> so nicht.

Das hätte dir der Compiler gesagt


>              if     (strcmp(test, "signal") == 0)      //Befehl

> void send(void)
> {  unsigned char test[]="signal\n ";
>   rf12_txdata(test,10);
> }


Du sendest nicht "signal".
Du sendest "signal" und dann noch ein Carriage Return. Kein Wunder dass 
daher der empfangene String nicht identisch ist du "signal"

Es sei denn natürlich, dass eine der Funktionen rf12_txdata bzw 
rf12_rxdata den \n ausfiltern. Aber normalerweise halten sich derartige 
Funktionen da raus.


PS: Was bedeuten eigentlich die 10 in

   rf12_txdata(test,10);

da fällt mir kein wirklicher Grund dafür ein, warum eine Funktion 
rf12_txdata eine 10 bekommen sollte. Länge des Strings - ja. Aber 
"signal\n" ist ja nicht 10 Zeichen lang, sondern nur 7 oder besser 
gesagt strlen( "signal\n" ) Zeichen.


Auf jeden Fall solltest du dir die Funktionen rf12_txdata und 
rf12_rxdata mal genauer ansehen, was die eigentlich exakt machen.

von C. H. (_ch_)


Lesenswert?

Karl heinz Buchegger schrieb:
> PS: Was bedeuten eigentlich die 10 in
>    rf12_txdata(test,10);
Das sind die Funktionen von Benedikt :)
10 gibt die Anzahl der zu sendenden Bytes an.

Ich persönlich finde das gar nich so dumm, weil man ja nicht nur Strings 
senden kann und da braucht man ja schließlich ein Argument wieviele 
Bytes ab dem Zeiger losgejagt werden sollen.

Gruß,
Christian

von Karl H. (kbuchegg)


Lesenswert?

C. H. schrieb:
> Karl heinz Buchegger schrieb:
>> PS: Was bedeuten eigentlich die 10 in
>>    rf12_txdata(test,10);
> Das sind die Funktionen von Benedikt :)
> 10 gibt die Anzahl der zu sendenden Bytes an.

Dachte ich mir schon :-)
Aber ich wollte gerne den TO zum Nachdenken bringen.
Wenn sein String 7 Zeichen lang ist, dann wird es wohl nicht so toll 
sein, wenn er seine Sendefunktion anlügt, dass er 10 Zeichen hätte :-)

> Ich persönlich finde das gar nich so dumm, weil man ja nicht nur Strings
> senden kann und da braucht man ja schließlich ein Argument wieviele
> Bytes ab dem Zeiger losgejagt werden sollen.

Für Daten ist das ja auch ok. Für Strings ist es aber eher unpraktisch. 
Du musst immer vorher die Stringlänge feststellen obwohl das bei einer 
eigenen String-Sende Routine eigentlich nicht notwendig wäre.

von C. H. (_ch_)


Lesenswert?

Karl heinz Buchegger schrieb:
> C. H. schrieb:
>> Karl heinz Buchegger schrieb:
>>> PS: Was bedeuten eigentlich die 10 in
>>>    rf12_txdata(test,10);
>> Das sind die Funktionen von Benedikt :)
>> 10 gibt die Anzahl der zu sendenden Bytes an.
> ... Wenn sein String 7 Zeichen lang ist, dann wird es wohl nicht so toll
> sein, wenn er seine Sendefunktion anlügt, dass er 10 Zeichen hätte :-)
Obwohl das prinzipiell auch egal ist, solange es im Empfänger keinen 
Überlauf gibt d.h. in den Empfangspuffer passt :)

> Für Daten ist das ja auch ok. Für Strings ist es aber eher unpraktisch.
> Du musst immer vorher die Stringlänge feststellen obwohl das bei einer
> eigenen String-Sende Routine eigentlich nicht notwendig wäre.
Theoretisch.
Die Stringlänge muss er laut Protokoll eh immer mitgeben, also muss er 
irgendwann den strlen bestimmen. Aber man könnte es schöner machen - 
keine Frage.

von Martink11 M. (Firma: google) (martink11) Flattr this


Lesenswert?

hallo,
hab mir eure komentare schon durchgelesen,
ich werde jetzt mal den code auf den neuesten stand bringen und evtl 
nochmal posten
aber ich probiers erst mal
das mit dem return war ein fehler von mir, das hatte ich übersehen.
servus

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.