Eher alles kleiner 32, denn das Leerzeichen sollte als gültiges Zeichen erhalten bleiben.
Gruß Tommy
Eher alles kleiner 32, denn das Leerzeichen sollte als gültiges Zeichen erhalten bleiben.
Gruß Tommy
Hallo,
korrekt. Formulieren wir es um. Ab 32 inkl. 32 alles einlesen. ![]()
Das wäre so wie ich mir das vorstelle. Die Funktion readLine() ist wieder verwendbar. Man kann unabhängige Datenbuffer auf unterschiedlichen Schnittstellen verwenden. Probiere es aus.
// https://forum.arduino.cc/t/ausgabe-auf-lcd-hat-sonderzeichen-am-ende/1440603
constexpr byte READ_BUFFER_SIZE {20};
struct SerialDaten {
char buffer [READ_BUFFER_SIZE + 1]; // Platz für 20 Zeichen + Null-Terminator
size_t index {0};
};
SerialDaten meineRxDaten;
void setup()
{
Serial.begin(9600);
}
void loop()
{
// liefert true wenn das LF eingelesen wurde
if (readLine(Serial, meineRxDaten) ) {
Serial.print("Eingelesen: ");
Serial.println(meineRxDaten.buffer);
}
}
bool readLine(Stream& stream, SerialDaten &rx)
{
bool status {false};
while (stream.available()) {
const char c = stream.read();
if (c == '\n') { // wenn LF eingelesen
rx.buffer[rx.index] = '\0'; // String terminieren
rx.index = 0;
status = true; // String fertig eingelesen
}
else if ( (c >= 32) && (rx.index < READ_BUFFER_SIZE) ) { // solange noch Platz im Buffer ist
rx.buffer[rx.index++] = c; // Zeichen abspeichern und Index inkrementieren
}
}
return status;
}
Danke vielmals, probiere ich aus.
Darf ich noch bei einem kleinen Problem um Hilfe bitten:
Am Ende des eingelesenen Strings steht immer ein ";", z.B. "VOL:60;". Es kommen aber auch andere Strings herein mit mehr Länge, aber am Ende steht immer das ";".
Wie bekomme ich das weg, bevor ich es an das LCD schicke?
Hallo,
probiere den Code aus, verstehe wo was gefiltert wird und ergänze es, um das ';' Zeichen rauszubekommen. Wenn es allerdings mitten im "Text" sein darf und nur am Ende nicht, muss mehr Aufwand betrieben werden. Wobei mir das nicht so gefällt, wenn in der reinen Einlesefunktion noch mehr gefiltert wird als üblich. Aber mach erstmal.
Du kannst auch die Funktionsweise verstehen und in deinem Code anpassen. Dann fällt die Struktur weg, falls dich das stört bzw. noch zu neu ist.
Vielen Dank, ich versuche mich da einzuarbeiten. Verstehe leider fast nur Bahnhof, bin noch Anfänger.
Aus Deinem dem Sketch von SJS (Sorry, falsches Antworten):
receivedChars[ndx] = '\0'; // terminate the string
if (receivedChars[ndx-1] == ';') (receivedChars[ndx-1] = '\0'
ndx = 0;
Gruß Tommy
Hallo,
der Code ist nicht von mir. ![]()
Meinen Code, die Funktion, würde ich erstmal wie folgt ändern.
bool readLine(Stream& stream, SerialDaten &rx)
{
bool status {false};
while (stream.available()) {
const char c = stream.read();
if (c == '\n') { // wenn LF eingelesen
rx.buffer[rx.index] = '\0'; // String terminieren
rx.index = 0;
status = true; // String fertig eingelesen
}
// filtere Steuerzeichen und Semikolon raus ...
else if ( (c >= 32) && (c != 59) && (rx.index < READ_BUFFER_SIZE) ) { // solange noch Platz im Buffer ist
rx.buffer[rx.index++] = c; // Zeichen abspeichern und Index inkrementieren
}
}
return status;
}
SJS, hast du keinen deinen Sketch selbst geschrieben? Du müsstest ja wissen was dein Code macht.
Das wird ja leider immer mehr zum Normalfall und selbst bei zusammen kopierten Sketchen macht sich fast keiner mehr Gedanken, wie die funktionieren.
Gruß Tommy
Hallo,
musste auch korrigieren. Ist heute irgendwie großer Korrekturtag. ![]()
Wollte "deinen Sketch" schreiben.
Wenn SJS Zeile für Zeile durchgeht, sollte er sehen, dass ist gar nicht so sehr verschieden.
Dann sollte er ihn auch verstehen. Zeit hat er dafür. ![]()
Das hat leider nicht funktioniert, das ";" ist noch bei der LCD Ausgabe da.
Leider bin ich noch nicht soweit, bin Anfänger und habe es mehr mit Hardware als Software. Den Code oben habe ich aus dem Beispiel hier im Forum, für meine Zwecke angepasst. Für viel mehr reicht mein Hirnschmalz leider nicht, fürchte ich.
receivedChars[ndx] = '\0'; // terminate the string
if (receivedChars[ndx-2] == ';') (receivedChars[ndx-2] = '\0');
ndx = 0;
newData = true;
Ich habe jetzt 2 Zeichen abgezogen, damit scheint es zu funktionieren...waren ja auch zwei Steuerzeichen, die am Ende reinkommen ![]()
Vielen Dank für den Tipp!
Dann hast Du das 2. Steuerzeichen nicht ausgeblendet, wofür Dir genügend Beispiele gegeben wurden.
Setze Dich hin und gehe den Sketch Zeile für Zeile durch. Informiere Dich, was Arrays sind und verstehe, was Du da vor Dir hast.
Immer darauf hin weisen, dass man Anfänger ist, zementiert diesen Zustand und Du bleibst das immer. Besser ist es, wenn Du lernst und den Code verstehst.
Eine kleine Hilfestellung zum Verständnis findest Du hier und als Nachschlagewerk hier.
Gruß Tommy
Naja, ich hatte oben ja geschrieben was oben mit dem Testsketch reinkommt...ich dachte halt dass Dein Beispiel das aufgreift.
Aber ja, ich lerne noch und bin für jede Hilfe dankbar. Ich bin aber schon weiter als ich dachte ![]()
Danke Euch nochmals, Thema damit erstmal gelöst!
Den eigenen Beitrag als Lösung zu kennzeichnen ist kein guter Stil, zumal der eine Lösung kennzeichnet, die in Anbetracht aller Beiträge vorher, eigentlich falsch ist. Das 2. Steuerzeichen sollte ja bereits weg sein und es ging nur noch um das ;
Gruß Tommy
Sorry, ich habe mich im Post vertan....habs korrigiert :-)