Serial.read() Werte zusammenfassen

Hallo,

ich bin, was die Programmiersprache angeht, noch nicht so weit.

Ich will mit einem Arduino Uno einen Wert (siehe Code) an einen Arduino Mega senden.
Das klappt auch soweit. Da ich jedoch den Wert, den der Mega empfängt später an ein Nextion-Display weiterleiten möchte, muss ich vorher noch "t2.txt=" schreiben. Und genau das ist das Problem:

Ohne die Zeile Serial.print("t2.txt=") wird im Seriellen Monitor der richtige Wert angezeigt, als Beispiel 4500... Füge ich die Zeile hinzu, wird mir im Seriellen Monitor folgendes Angezeigt:

t2.txt=4
t2.txt=5
t2.txt=0
t2.txt=0

Wie kann ich nun das was ich per Serial.read() lese, also eine Zahl mit, in meinem Fall, höchstens vier Stellen zu einem Ergebnis zusammenfassen, sodass ich es ganz normal an das Display weitergeben kann?

Hier der Code vom Uno, der Daten sendet (i++ wurde nur als Beispiel gewählt, eigentlich kommt da ein Wert von nem Poti hin...):

int i = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("Hallo Welt");
}
void loop() {
  i++;
  Serial.println(i);
  delay(250);
}

Hier der Code vom Mega, der die Werte empfängt:

int data = 0;
void setup() {
  Serial.begin(9600);
  Serial3.begin(9600);
}
void loop() {
 
  if (Serial3.available() > 0) {
    data = Serial3.read();
    Serial.print("t2.txt=");
    Serial.print((char)data);
  }
}

Lesestoff:
sprintf()
sscanf()

Übrigens:
Doppel Postings, machen nicht doppelt schlau.

read() liest nunmal nur 1 Zeichen.

Eine Möglichkeit, wenn es nur um Zahlen geht (ein Potiwert 0..1023 ) , wäre parseInt.
Eine andere wäre, das Zeilenende auszuwerten.

Du musst erst mal verstehen was du da überhaupt einliest. Also ASCII Text von Zahlen unterscheiden. Das sind zwei völlig verschiedene Dinge

Wenn du den Text nur weiterleiten willst kann man sich eigentlich auch eine Konvertierung in Integer sparen.

Text einlesen geht so:
https://forum.arduino.cc/index.php?topic=659446.msg4443056#msg4443056
Wenn man dann println() macht hat man ein CR + LF am Ende. Und auf das LF fragt man ab

combie:
Lesestoff:
sprintf()
sscanf()

Erst einmal Danke für deine Antwort.

Zum Thema sprintf() und sscanf():

Ich werde aus den Zahlreichen Ergebnissen nicht schlau... Wie soll ich aus Serial.read() damit eine zusammenhängende Zahl bekommen? Hättest du vielleicht ein Beispiel?

Wie soll ich aus Serial.read() damit eine zusammenhängende Zahl bekommen?

Serenifly sprach es schon an.

z.B. Die Eingabe bis zu dem LF in einem Buffer stopfen
Und dann sscanf() auf den Buffer los lasen.

Tipp:
Parser bauen ist gleichzeitig leicht und schwer.
?
Wenn man gewohnt ist endliche Automaten zu bauen, dann leicht.
(so weißt du schon mal was es zu üben gilt)

Du verwendest beim UNO die Serielle doppelt.
Unglücklich, sehr unglücklich......

Alternativ, verwende I2C als Schnittstelle zwischen den beiden.
Das befreit dich vom ganzen Parsen und "zusammenhängende Zahl bekommen".

Auch könntest du den CmdMessenger nutzen, wenn du weiter die UART nutzen möchtest.


Schlussendlich:
Von einigen Möglichkeiten, hast du dir eine der kompliziertesten raus gesucht.

Ich finde leider nichts zu sscanf(), was mich weiterbringt...

Mit I2C habe ich es schon probiert, hat jedoch nicht so funktioniert wie ich es gedacht hatte.

Mit Beispiel meinte ich eigentlich ein Codebeispiel, der betroffenen Stelle, wie es in anderen Themen auch möglich war...

Und noch eine Frage: Was meinst du mit LF, und wie stoppe ich den Buffer?

LF = Linefeed = Zeilenvorschub = '\n'

Dir fehlen grundlegende Kenntnisse zu Zeichenketten. Schau mal hier rein. Da ist auch ein Beispiel zum Einlesen drin.

Gruß Tommy

gerberleon:
Und noch eine Frage: Was meinst du mit LF, ...

Uh, Du bist wirklich ein totaler Anfänger.Freu Dich: Mit jedem nicht gemachten Fehler nimmt der Spaß zu. Das Schlimmste hast Du demnach ziemlich schnell hinter Dir :slight_smile:

Mit LF ist „Linefeed“ gemeint. Das ist ein einzelnes Zeichen, mit dem man das Ende einer Zeile signalisieren kann, ASCII-Code 10.

Gruß

Gregor

Tommy56:
Schau mal hier rein. Da ist auch ein Beispiel zum Einlesen drin.

Ich gehe mal davon aus, dass der Wert von BUFLEN auf "Hallo Welt" bezogen ist...

'\n' ist das "LF"? Also das Zeichen für das Ende?

Und in dem Codebeispiel enthält der char puffer alles, bis '\n'?

idx ist die Anzahl der Zeichen von puffer?

Korrigiere mich bitte.

Aber vielen Dank für den Link!

Lies es Dir in Ruhe durch, dann kannst Du Dir die Fragen selbst beantworten.

Gruß Tommy