Probleme mit Serieller Kommunikation

Moin,

bin gerade am verzweifeln mit meinem Arduino Mega.

Der Arduino bekommt von Serial3 eine vierstellige Zahl von einem anderen Arduino, der den Wert eines Potentiometers liest. Beispiel: Der Arduino sendet als Wert 4400. Dann empfängt auch der Mega 4400 und kann es im Seriellen Monitor ausgeben.
Da ich diesen Wert auf einem Nextion Enhanced 3.5'' ausgeben will, muss ich vorher noch "t2.txt=" und """ printen. Wenn ich das tue, dann schreibt er sechsmal "t2.txt=" und spaltet die 4400 in vier einzelne Zahlen und schreibt sie jeweils hinter "t2.txt=".

Hier der Code des Arduino Unos welcher den Wert sendet:

String potVal;
void setup() {
  Serial.begin(9600);
}

void loop() {
  int n = map(AnalogRead(0), 0, 1023, 0, 6500);
  if(n < 1000){
    Serial.print("0");
  }
  if(n < 100){
    Serial.print("0");
  }
  if(n < 10){
    Serial.print("0");
  }
  potVal = (String)n;
  Serial.println(potVal);
}

Hier der Code des Megas der den Wert empfangen soll (ohne "t2.txt="):

String readString;
void setup() {
  delay(500);
  Serial.begin(9600);
  Serial.print("baud=115200"); //ändern der Baud-Rate für das Display
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.end();
  Serial.begin(115200);
  delay(200);
  Serial2.begin(9600);
  Serial3.begin(9600);
}

void loop() {
  while(Serial3.available()>0) {
    char incommingData = Serial3.read();
    readString += incommingData;
    if(readString.length() >= 4){ 
      Serial.print(incommingData);     
    } 
  }
}

Hier der Code für den Mega (Mit "t2.txt="):

String readString;
void setup() {
  delay(500);
  Serial.begin(9600);
  Serial.print("baud=115200");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.end();
  Serial.begin(115200);
  delay(200);
  Serial2.begin(9600);
  Serial3.begin(9600);
}

void loop() {
  while(Serial3.available()>0) {
    char incommingData = Serial3.read();
    readString += incommingData;
    if(readString.length() >= 4){ 
      Serial.print("t2.txt=")
      Serial.print(incommingData);     
    } 
  }
}

Hier nochmal ein Screenshot vom Seriellen Monitor:

Vielen dank schonmal im voraus.

Du solltest nach der Ausgabe ans Nextion incommingData leer machen und Du solltest alle Zeichen von Serial3 lesen oder nur 4 Zeichen und nicht mehr senden.

Lass Dir die Zeichen mal alle als HEX ausgeben, dann siehst Du was da noch kommt.

Gruß Tommy

Du kannst nicht beide, Uno und Nextion über eine Serielle Schnittstelle bedienen.

Der Mega hat doch 3 weitere, warum nimmst du nicht eine davon für das Nextion ?

Edit:
Ups.....gerade gesehen, du definierst die seriellen doppelt.
Solltest du mal aufräumen.

Tommy56:
Du solltest nach der Ausgabe ans Nextion incommingData leer machen [...]

Also einfach incommingData = 0 ?

Tommy56:
Lass Dir die Zeichen mal alle als HEX ausgeben, dann siehst du was da noch kommt.

Da passiert nicht viel, ich bekomme nur die Zahlen als HEX.

Tommy56:
[...]Du solltest alle Zeichen von Serial3 lesen oder nur 4 Zeichen und nicht mehr senden.

Ich sende ja nur jedes mal 4 Zeichen. Ich hatte das nur so gemacht, weil ich sonst immer die vier Stellen der Zahl einzeln im Seriellen Monitor angezeigt bekommen habe. Also wenn ich 1234 gesendet habe, dann wurde mir Zeile für Zeile 1, 2, 3 und 4 angezeigt

Nein, Du sendest mehr Zeichen. Lies mal nach, was println macht.
Wie leert man einen String?

Du solltest ein paar Grundlagen lernen.

Gruß Tommy

Tommy56:
Nein, Du sendest mehr Zeichen. Lies mal nach, was println macht.
Wie leert man einen String?

Du solltest ein paar Grundlagen lernen.

Gruß Tommy

Ok, habe ich verstanden. Aber wie kann ich das Problem lösen? Mein eigentliches Problem ist ja, dass die Zahl nicht mehr zusammen im Seriellen Monitor steht, sondern jede Stelle einzeln, sobald ich irgendetwas davor oder danach schreibe...

Du könntest beim sendenden Arduino ein Erkennungszeichen anfügen (z.B. ein "&") und beim empfangenden Arduino ein Serial.readStringUntil('&') anfügen.

if(Serial3.available){
  String incommingData = Serial3.readStringUntil('&');
  Serial.print("t2.txt=");
  Serial.println(incommingData)
}

Ich hab das jetzt in tinkercad ausprobiert:

sendender Arduino:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int n = map(analogRead(0), 0, 1023, 0, 6500);
  if(n < 1000){
    Serial.print("0");
  }
  if(n < 100){
    Serial.print("0");
  }
  if(n < 10){
    Serial.print("0");
  }
  char buf[6];
  sprintf(buf, "%d&", n);
  delay(200);
  Serial.print(buf);
}

Empfangender Arduino:

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()){
    String incommingData = "t2.txt=";
    incommingData += Serial.readStringUntil('&');
    Serial.println(incommingData);
  }
}

klappt prima.

janpho:
Du könntest beim sendenden Arduino ein Erkennungszeichen anfügen (z.B. ein "&") und beim empfangenden Arduino ein Serial.readStringUntil('&') anfügen.

Normal nimmt für sowas ein Linefeed. Das wird bei println() automatisch gesendet. Und im seriellen Monitor kann man es auch einstellen

Warum kaperst Du einen fremden Thread, der bis auf das Wort seriell nichts mit Deinem Problem zu tun hat?

Mach bitte einen Eigenen auf und schreibe Nano 33 IoT gleich mit in den Titel.

Gruß Tommy