Textausgabe lcd c

Gast #2605933
Lesenswert?
• ▲
▼
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!
Gast #2606522
Lesenswert?
• ▲
▼
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
#2606678
Lesenswert?
• ▲
▼
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
Gast #2606897
Lesenswert?
• ▲
▼
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.