Forum: Mikrocontroller und Digitale Elektronik USART Problem (Anfänger)


von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich versuche gerade ein Programm zu schreiben welches beim Empfang von 
"on" eine LED einschaltet.

Prinzipiell funktoniert bei mir die Kommunikation zwischen PC und AVR.
Ich denke ich habe einen Fehler bei der Abfrage: if(Line == "on")
Muss ich hier noch das '\n' und '\0' mitabfragen. (hab ich eigentlich 
schon alles versucht)
Oder stimmt etwas mit meinen Datenformaten nocht?

Für Tipps zu einem Lösungsansatz wäre ich recht dankbar.

Danke im Voraus
mfg
Patrick

von Aua (Gast)


Lesenswert?

Aua! C-Grundlagen: Stringvergleiche!

von Peter (Gast)


Lesenswert?

Patrick schrieb:
> Ich denke ich habe einen Fehler bei der Abfrage: if(Line == "on")

gut gedacht. Denn C kann keine strings so vergleichen, so wie du es 
geschrieben hast vergleichst du adressen.

schau dir mal die funktion strcmp an.

von Patrick (Gast)


Lesenswert?

Dankeschön jetzt weiß ich wonach ich suchen muss

von Christopher G. (cbg)


Lesenswert?

In jedem C Buch bzw Tutorial wirst du strcmp() finden. Wenn deine 
Vergleichsstrings sich nicht ändern, dann lass sie am besten im Flash. 
Das spart RAM.
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#gae3a7686c2e207b543be3b402d919761a

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Das mit dem Vergleichen hat nun geklappt.
Allerdings wenn ich den String über die RS232 Schnittstelle einlese 
klappt das ganze noch immer nicht wie gewünscht.
Muss ich etwa das /n bzw /0 mit vergleichen?

Als Rückgabe erhalte ich allerdings:  (siehe auch Anhang)
Empfangen wurde: on
Empfangen wurde: on

mfg
Patrick

von Christopher G. (cbg)


Lesenswert?

Für Rückgabewert 0 müssen bei strcmp() die Strings ident sein. Also 
gleich lang und gleicher Inhalt (nur bei strcasecmp() ist Groß- und 
Kleinschreibung egal).
Also entweder \r und \n mit \0 überschreiben, oder gleich nur die ersten 
2 Zeichen mit strncmp_P überprüfen. Bei letzterer Methode würde dann 
aber auch ein Vergleich von "online" mit "on" den Rückgabewert 0 
liefern, da ja die ersten beiden Zeichen stimmen.

von Patrick (Gast)


Lesenswert?

so schluss für heute.

ich habe es zwar geschafft die Position von \r im string zu bestimmen 
wie ich diesen aber durch \0 ersetze weiß ich noch nicht.
Vielleicht hat hier noch wer einen Tipp für mich.

Mein Programm funktionier nun aberer trotzdem da ich den empfangenen 
String einfach mit "on\r" vergleiche.

        char Line[40];      // String mit maximal 39 zeichen
        char Line2[4]="on\r";
        char Line3[5]="off\r";
        uart_gets( Line, sizeof( Line ) );

        if(strcmp(Line,Line2)==0)
        {

             PORTC &= ~(1<<0);
        }
        if(strcmp(Line,Line3)==0)
        {

             PORTC |= (1<<0);
        }

Dankeschön und noch einen schönen Abend
mfg Patrick

von Peter (Gast)


Lesenswert?

empfange doch einfach bis zum \n und speicher das \n nicht erst im 
string.

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.