www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12 String auswerten


Autor: Martin 567 (martink11)
Datum:

Bewertung
0 lesenswert
nicht 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.
void receive(void)
{  unsigned char test[10];  
  rf12_rxdata(test,10);  
  // daten verarbeiten


//von mir
//-----------------------------------------------------------------------------
             if     (strcmp(test, "signal") == 0)      //Befehl
              {
                for(j=0;j<10;j++)
                {
                summer_on;
                _delay_ms(100);
                summer_off;
                }
              }

//-----------------------------------------------------------------------------
}


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




int main(void)
{
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
  rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
  rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
  rf12_setbaud(19200);      // 19200 baud
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift

  while(1)
  {
    if(taster == false)
    {
    send();
    for (unsigned char i=0; i<100; i++)
      _delay_ms(10);

    receive();

    }
  }
}

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

danke Moartl

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: C. H. (_ch_)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: C. H. (_ch_)
Datum:

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

Autor: Martin 567 (martink11)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.