Forum: Mikrocontroller und Digitale Elektronik strings in schleife


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

Hallo Rufus,

danke für deinen Antwort. Hab den Code geändert und jetzt funktioniert 
es.

Gruss,

Michael

von Karl H. (kbuchegg)


Lesenswert?

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).

von Michael (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.