Hallo Leute, ich hab mir ein kleines programm geschrieben, indem die strings empfangen und mit einem wort verglichen werden. Das funktioniert auch alles aber mein problem ist nach einigen versuchen, dass ich nur einmal vergleichen kann und entsprechende antwort senden kann. Was mache ich falsch bzw. wie kann ich das ändern? Das C code befindet sich im Anhang Danke im Vorraus! Michael
i ist exakt einmal global definiert - und nicht als "volatile", obwohl sowohl im Interrupthandler als auch anderswo verwendet. Außerden setzt Du i nie zurück. In uart_put veränderst Du es zwar, aber nach dem Senden des Strings bleibt es auf dem Stringendindex. Das nächste empfangene Zeichen wird im Interruphandler also an den String angehängt ... Außerdem solltest Du Deinen Quelltext zur besseren Verständlichkeit sinnvoll formatieren. Die Einrückungen in Deiner main/Endlosschleife sind das nicht.
Hallo Rufus, danke für deinen Antwort. Hab den Code geändert und jetzt funktioniert es. Gruss, Michael
Michael wrote:
> Hab den Code geändert und jetzt funktioniert es.
Das mag vielleicht so aussehen. Dein Programm enthält trotzdem
noch viele Fehler.
Der schwerwiegenste von allen ist sicherlich, dass du das Array
buffer in clear_buffer überläufst.
Wenn du ein Array mit einer bestimmten Größe definierst
char buffer[50];
dann enthält dieses Array 50 Elemente. Diese sind durchnummeriert
von 0 bis 49. Zähl nach, von 0 bis 49 sind es 50 Elemente.
Daher kann eine clear_Schleife nicht so aussehen
for( i = 0; i <= 50; i++ )
denn diese Schleife greift auf das Array Element mit dem Index
50 zu, welches es aber nicht gibt.
NB: Um einen String in einem Array zu löschen, genügt es das
erste Array Element auf '\0' zu setzen. Ein String endet per
Definition beim ersten '\0'. Es ist nicht notwendig alle
dahinter liegenden Array Elemente explizit auf '\0' zu setzen
(aber auch nicht wirklich falsch).
Hallo Karl, danke für deinen beitrag. Ich hab die clear_buffer funktion nochmal geändert. Jetzt sieht es bei mir so aus: for( i = 0; i <= 5; i++ ) Sie haben geschrieben, dass mein code noch viele andere fehler enthält. Da ich vor kürzem angefangen habe µC zu programmieren, sehe ich viele fehler nicht. Können Sie mir diese fehler aufschreiben, wenn natürlich geht, ich bin dabei das programm in einer vernünftige form umstellen :). Danke!
Michael wrote: > Hallo Karl, > > danke für deinen beitrag. Ich hab die clear_buffer funktion nochmal > geändert. Jetzt sieht es bei mir so aus: > > for( i = 0; i <= 5; i++ ) Gewöhn dir das <= in einer for Schleife gleich wieder ab. Das ist ein ständiger Quell für Fehler. #define MAX 50 char Tmp[MAX] ... for( i = 0; i < MAX; i++ ) mach was mit Tmp[i]; das sollte dein Ich-bearbeite-ein-Array-Muster sein. In C wird bei 0 zu zählen angefangen. Das hat ein paar Konsequenzen. Gewöhn dich besser daran! > > Sie haben geschrieben, dass mein code noch viele andere fehler enthält. > Da ich vor kürzem angefangen habe µC zu programmieren, sehe ich viele > fehler nicht. Na. zb. das hier unsigned char wort[5] = "lampe"; Das ist zwar im eigentlichen Sinn kein Fehler, aber ich bin mir ziemlich sicher, das du was anderes wolltest. Der String "lampe". Aus wievielen Zeichen besteht er? Aus 5! Falsch, du hast das obligatorische, abschliessende '\0' vergessen. "lampe" besteht zunächst mal aus 6 Zeichen. unsigned char wort[6] = "lampe"; Aber: du musst nicht selbst abzählen! Lass doch den Compiler die Dinge erledigen, die er besser kann. Zb. Character in einem String abzählen: unsigned char wort[] = "lampe"; Jetzt zählt der Compiler für dich. Und der Compiler verzählt sich nicht. Warum benutzt eigentlich die Funktion uart_put() nicht die Funktion uart_putchar() um einzelne Zeichen auszugeben, sondern erfindet das Rad wieder neu? PS: mit 'ziemlich viele' hab ich schamlos übertrieben.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.