www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik strings in schleife


Autor: Michael (Gast)
Datum:
Angehängte Dateien:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rufus,

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

Gruss,

Michael

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

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

Autor: Michael (Gast)
Datum:

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

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

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

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.