ich habe hier ein seltsames Phänomen und brauche Eure Hilfe - ich bin leider eher Anfänger:
Ich lese über die serielle Schnittstelle SERIAL1 Daten von einem externen Gerät ein (exakt nach dem Beispiel hier im Forum (Serial Input Basics - updated - Projects / Tutorials - Arduino Forum), welches z.B. "VOL:60;" oder "VOL:50;" ausgibt, das funktioniert im seriellen Monitor auch einwandfrei. Gebe ich diesen in einem Array eingelesenen String jedoch auf dem angeschlossenen 20x4-LCD per lcd.print() aus, dann ist hinter dem ";" immer ein undefinierbares Zeichen.
Wenn ich einen festen String auf dem LCD ausgebe, passt alles, z.B. lcd.print("Test")...dort ist dieses Zeichen nicht am Ende zu sehen.
Kann das jemand erklären? Es hängt wohl irgendwie mit dem letzten (Steuer-)Zeichen im Array zusammen, was mit auf dem LCD ausgegeben wird.
Wahrscheinlich ist von der Eingabe noch ein Zeilenvorschub / Wagenrücklauf hinten dran, denn musst Du entfernen. Mit welcher Einstellung sendest Du aus dem seriellen Monitor?
Ansonsten lass Dir doch mal receivedChars zeichenweise als HEX ausgeben.
Bitte schreibe nicht nach jeder Codezeile eine Leerzeile. Das stört den Lesefluss.
So etwas in der Art habe ich mir auch gedacht, ich habe auch schon versucht einfach ein Zeichen weniger auszugeben:
`lcd.print(receivedChars - 1);`
Das hat aber nichts gebracht, auch nicht mit zwei Zeichen. Dann steht das Sonderzeichen auf einmal am Anfang der Ausgabe auf dem LCD. Auch der Test mit verschiedenen Sonderzeichen als Endmarker hat bisher nicht geholfen.
Hmm, hatte ich doch oben geschrieben: die Daten kommen von extern an Serial und werden in ein Array eingelesen. Diese werden danach einmal auf dem seriellen Monitor ausgegeben und parallel dazu auf das LCD geschrieben.
schau dir einmal die ASCII Tabelle an. Man sollte, macht man eigentlich immer, alle nicht benötigten Steuerzeichen, nicht verwechseln mit Sonderzeichen, beim einlesen vorm in den Buffer schreiben filtern. Das heißt alles bis dezimal 32 kann weg.
Mach das so bitte nicht. Ändere die Einlesefunktion, also dort am dem Ort wo es passiert.
Na siehste - wie @Tommy56 schon in #2 und wieder in #9 schrub: Da sind sie ja, die CR LF Bytes.
Versuch mal (habe ich nur so "trocken" ohne Test runtergetippt):
char endMarker = 0x0A; // '\n';
char rc;
while (Serial1.available() > 0 && newData == false) {
rc = Serial1.read();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
// es ist jetzt ein 0x0D als letztes Byte im Puffer receivedChars
// Ganeu das kann mit der \0 überschrieben werden.
ndx--; // also ein Byte zurück und weiter gehts.
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
}
...
Ist "minimal-invasiv", denn...
Das leistet meine kleine Änderung natürlich nicht...
Danke Euch nochmals, ich hatte das so gelöst mit der trim()-Funktion:
void showNewData() {
if (newData == true) {
Serial.println(receivedChars);
mystring = (receivedChars);
mystring.trim(); //entfernt die Sonderzeichen am Ende vor der LCD Ausgabe
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(mystring);
newData = false;
}
Spricht etwas dagegen? Funktioniert jedenfalls :-)
Das macht etwas ganz anderes, als Du denkst.
Nehmen wir an, in Deinem Speicher steht:
0x80x99Hallo0xd0xa0x0
Dein receivedChars ist ein Zeiger, der auf den Anfang von Hallo zeigt. Mit Zeigern kann man auch rechnen. Also zeigt receivedChars-2 auf 2 Zeichen davor, also auf 0x8 und das ist nicht das, was Du Dir vorgestellt hast.