Hallo, ich habe eine library für ein text-lcd und soweit funktioniert da auch alles, also einzelne Zeichen schreiben, Shiften usw. aus der Funktion werde ich allerdings nicht schlau: void displ_print(char *text)reentrant; // Zeichenkette an Display senden // Bsp. displ_print("test"); void displ_print(char *text)reentrant //Textumwandlung in Zeichenfeld { data unsigned char k; displ_clear(); for (k=0;k<8;k++) { displ_putchar(text[k]); } } Ich dachte ich könnte nun einfach displ_print("test1"); nutzen, habe auch genug Zeit danach gelassen, also daran sollte es auch nicht liegen. Hat jemand noch eine Idee wie man die Funktion umschreiben müsste bzw. in welcher Form ich den Text an die Funktion übergeben muss? Vielen Dank schonmal im Voraus!
Wenn du "test1" (5 Zeichen) übergibst, hast du einen Pufferüberlauf in der Funktion, weil die in der for-Schleife immer 8 Zeichen (0..7) aus gibt! Abhilfe wäre, einen 8 Zeichen breiten Zwischenpuffer zu verwenden. Die Füllzeichen kann man im Prinzip frei wählen nachdem man den Puffer gefüllt hat.
1 | {
|
2 | char puffer[8]; |
3 | memset(puffer, 0, 8); // #include <string.h> erforderlich |
4 | strncpy(puffer, "test1", 8); // #include <string.h> erforderlich |
5 | // hier ggf. Nullbytes durch Füllzeichen ersetzen
|
6 | displ_print(puffer); |
7 | }
|
Siehe auch String-Verarbeitung in C
> for (k=0;k<8;k++) { displ_putchar(text[k]); }
Gewöhne dir diese Schreibweise nicht an. Da lassen sich die Breakpoints
beim zeilenweise Debuggen schlecht setzen.
1. Das "reentrant" ist völliger Quatsch, eine Ausgabe kann nicht reentrant sein. Es kann immer nur eine Task zur Zeit eine Ausgabe machen. Es sei denn, Du willst absichtlich, daß Texte mehrerer Tasks durcheinander angezeigt werden. 2. Display löschen gibt häßliches Flackern. Sinnvoller ist, den Text zu überschreiben (bei Bedarf mit Leerzeichen auffüllen). 3. Was machst Du, wenn der Text ungleich 8 Zeichen hat? Besser ist daher, einen Text einfach bis zum Endezeichen 0x00 auszugeben. Peter
Hallo vielen Dank für die Antworten. das mit dem reentrant hat mich auch ein bisschen verwundert. Habe jetz (hätte ich natürlich auch gleich machen können, sorry) im GCC tutorial geguckt und dort die Funktion genutzt und dort noch ein delay eingefügt. Jetzt funktioniert es also!
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.