20x4 LCD Display

Hallo,

ich habe ein 20x4 LCD Display das am Arduino hängt. Folgender Code sollte den Text der seriell kommt auf dem Display darstellen 欢迎光临-GB .
Leider stimmt etwas werden die Zeilen vertauscht. Der maximal 80 Zeichen lange Text sollte in 4 Zeilen geteilt werden, aber auf dem Dsiplay erscheint Zeile1e 1,Zeile 3, Zeile 2, Zeile 4

Auch wenn ich im Code die Reihenfolge ändere auf
...
lcd.setCursor (0,0);
..
lcd.setCursor (2,0);
..
lcd.setCursor (1,0);
...
lcd.setCursor (3,0);

Wird der Text falsch dargestellt.

P.s.: wenn ich die if-Anweisungen weglasse und den empfangenen String in eine lcd.print Anweisung packe, wird der Text auch falsch dargestellt.

Das die Zeilen Nummern durcheinander sind ist leider normal

und nun?

Habe kein 20x4 gerade mit Beschaltung aufgebaut, aber war es nicht so, dass setCursor richtig funktioniert?
lcd.setCursor(x,0); // Zeile 1
lcd.setCursor(x,1); // Zeile 2
lcd.setCursor(x,2); // Zeile 3
lcd.setCursor(x,3); // Zeile 4

Dein Problem ist, dass du die String Nachricht direkt in eins an das Display schickst. Hierbei ist der Fehler bekannt, dass er in Zeile 1, 3,2,4 nacheinander schreibt. Das ist aber überhaupt kein Problem.
Splitte deinen String! Wobei jeder Teil dann max. 20 Ziffern beinhaltet.

komika:
Wird der Text falsch dargestellt.

P.s.: wenn ich die if-Anweisungen weglasse und den empfangenen String in eine lcd.print Anweisung packe, wird der Text auch falsch dargestellt.

Falsch ist eine große, nichssagende beschreibung Deines Problems. Ich kann mir da nichts (oder sehr viel) vorstellen.
Bitte beschreibe das "falsch" besser.
Grüße Uwe

Wenn ich den Text als ganzes ins Display Schicke, zum Beispiel:

lcd.print("Wenn ich den Text als ganzes ins Display Schicke, zum Beispiel:");
kommt als Ausgabe so etwas:
Zeile 1: Wenn ich den Text al
Zeile 2: Schicke, zum Beispi
Zeile 3: s ganzes ins Display
Zeile 4: el

Wie bereits gesagt, das ist normal !
Dass die LCD library das 17. Zeichen einer Zeile nicht wegschneidet, hilft dir nichts. Es landet eben nicht da, wo du es gerne hättest.
Im "echten Leben" nutzt automatischer Zeilenumbruch nichts.
Musst schon mindestens für jede Zeile ein setCursor() aufrufen !

Das ist kein Fehler, die Zeilenanordnung ist so im Displaykontroller hinterlegt. Splitte die Daten ordentlich und gebe sie dann statisch mit lcd.setCursor() aus.

Du kannst hier z.B. mit strncpy() arbeiten:
http://www.cplusplus.com/reference/cstring/strncpy/

Das kopiert dir n Zeichen in ein anderes Array. Dein Ziel-Array muss dann 21 groß sein und es reicht ein Array für das ganze Display.

Denke auch daran dass wenn du sowas hast:

char str[] "Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah"

Du mit "str + 20" weiter nach hinten gehen kannst.

char buffer[21];
strncpy(buffer, serialBuffer + 20, 20);

Kopiert dir also 20 Zeichen ab dem 20. Zeichen

Kopieren dürfte wegen der Null-Terminierung nötig sein. Es sei denn vielleicht du schickt zwischen jedem Teil-String ein Zeichen mehr über Serial. Das kann man dann per Hand mit '\0' überschreiben. Dann kann man auch direkt das eingelesene Array von Serial Stück für Stück ausgeben.

Hallo komika

deine Zeilenzuordnung ist aber auch nicht korrekt. Wenn du das so vorgibst:

...
lcd.setCursor (0,0);
..
lcd.setCursor (2,0);
..
lcd.setCursor (1,0);
...
lcd.setCursor (3,0);

Die Zeilen werden mit der 2. Zahl in der Klammer deklariert. Die 1. Zahl deklariert die Position des Cursors in der Zeile, von 0-19.

Grüße
Fried22

Die Zeilennummern bei setCursor() sind glaube aufeinander folgend wie man es erwartet. Da stimmt was ich vorher gesagt habe nicht so ganz.

Das Problem ist wenn man einen längeren String mit einer print() Anweisung ausgibt. Dann macht ihn der Display Controller durcheinander. setCursor() passt das glaube ich korrekt an.