Probleme mit Serial 1+2+3 bei Arduino MEGA 2560

Hallo. Ich arbeite gerade mit dem Arduino MEGA 2560 und möchte damit eine Prüfeinheit realisieren, daß eine Baugruppe von uns überprüft. Das Monitoring mit den Messdaten sowie die Ansteuerungsausgänge funktionieren schon. Ich kann ein Befehl über den Serial Monitor eingeben, dann läuft die Testprozedur los.

Aber ich möchte für das Gerät ein Display (Nextion 7") anschließen und die Befehle damit eingeben. Das funktioniert nicht, obwohl der Nextion den richtigen String herausgibt.

Bei der Spannungsmessung habe ich gesehen, daß ich den Pegel noch anpassen muss von 3,3V (Nextion) auf 5V (Arduino Mega). Das habe ich gemacht.

Wenn ich aber einen Befehl vom Nextion schicke, funktioniert das einfach nicht.

Wenn ich den String über eine weitere serielle Schnittstelle vom PC (mit Umsetzer auf TTL Pegel) auf Serial2 schicke, dann funktioniert das nur, wenn ich die Software neu draufprogrammiere.

Sobald ich die Schaltung aber mal spannungslos mache, geht das auch nicht. Bei diesem Problem hänge ich erst mal fest.

Bei der Loop Funktion sperrt der Arduino die Lauscher auf bei Serial2 und ruft dann die Funktion readinputbuffer auf, sobald was anliegt. Mit Status_Reset setzt er Error und OK Flags im Nextion zurück, damit die im Testdurchlauf neu gesetzt werden können. Mit Serial.print(inputbuffer) habe ich (nur zu Testzwecken) den inputstring noch mal ausgeben wollen.

Hier der Code:

void loop() {  //Main
 //int Befehl; //Befehl vom Display in integer
 //String inputbuffer="";

 //Lesen serielle Schnittstelle
 if (Serial2.available() >0){
   Serial2.setTimeout(20);
   //String auslesen und anschließend auswerten
   //Beispiel: "!01;2;2;1;3;1*"
   inputbuffer = Serial2.readString(); 
   //Serial.println(inputbuffer);
   readinputbuffer(inputbuffer); //Auswertung von dem, was das Nextion gesendet hatint commandInt;
   Status_Reset();
   Command_Auswertung();
 }
 //Inhalt von inputbuffer ausdrucken testweise
 Serial.print(inputbuffer);
 //Inputbuffer leeren
 inputbuffer="";
 delay(60); 
}

Bei der Überprüfung hat sich ergeben, daß der Arduino in die if Bedingung nicht reingeht. Er erkennt also nicht, daß etwas anliegt. Am Oszilloskop kann ich aber erkennen, daß er Nextion sein String schickt.

Hatte jemand von Euch schon mal so einen Fehler?

Danke für Eure Hilfe.

Zuerst mal gib uns einen lauffähigen Sketch und nicht nur Teile damit wir Dein Problem nachvollziehen können.

Dann kontrollierst Du ob mindestens 1 Zeichen im Buffer ist und liest dann den gesamten String der möglicherweise gar nicht ganz angekommen ist.

Grüße Uwe

Wenn Serial2.available() immer nur 0 liefert, stimmt vielleicht etwas mit der Baudrate o.ä. nicht. Du kannst auch warten bis mehr Zeichen available sind, und dann erst readString() aufrufen.

DrDiettrich: Du kannst auch warten bis mehr Zeichen available sind, und dann erst readString() aufrufen.

Komischer Tipp und ein Holzweg (meiner unmaßgeblichen Meinung nach).

Baue eine vernünftige char[] basierende Einleseroutine und benutze readString() nie.

Hallo zusammen,

da ich so ziemlich genau das gleiche Problem habe, grabe ich dieses Topic noch einmal aus.

Ich bin ebenfalls an der Entwicklung einer Art Prüfeinrichtung, die über ein 7" Nextion Display gesteuert wird. Bis dato wurde diese Prüfeinrichtung mit einem Arduino Micro betrieben, da der Programmspeicherplatz aber so gut wie voll ist und noch einige neue Funktionen hinzugefügt werden sollen wird jetzt auf ein Arduino Mega 2560 umgestellt. Weil es auf der Platine Platz mäßig am besten gepasst hat, soll die serielle Kommunikation über Serial3 erfolgen. Hardwarefehler auf der Platine sind auszuschließen, da ich den Arduino Micro über Jumper-Kabel angeschlossen habe und mit diesem alles einwandfrei läuft (bei ihm natürlich über Serial1). Sobald ich den Arduino Mega 2560 anschließe (im Programm die Serials natürlich alle auf Serial3 geändert) funktioniert die Serielle Kommunikation gar nicht.

Beide Arduinos funktionieren auf 5V Logik, den Pegel des Nextions habe ich nicht hochgesetzt sollte aber ja kein Problem darstellen, da es mit dem Micro schließlich funktioniert...

Weiß jemand ob der Mega2560 im Vergleich zum Micro irgendwelche Besonderheiten in der seriellen Kommunikation aufweißt?

Ich habe auch einen kurzen Sketch geschrieben um Fehler im großen auszuschließen(auch wenn er auf dem Micro funktioniert):

#include "Nextion.h"

#define Sperrventil 27

NexButton b0 = NexButton(0,1,"b0");



NexTouch *nex_listen_list[]= {
  &b0,
  NULL
};

void b0PopCallback(void *ptr)
{
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(Sperrventil, HIGH);
  delay(2000);
}


void setup() {
  // put your setup code here, to run once:
  Serial3.begin(9600);
  delay(200);

  nexInit();
  b0.attachPop(b0PopCallback, &b0);

  pinMode(Sperrventil, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(Sperrventil, LOW);

  nexLoop(nex_listen_list);

}

Ich weiß das einige sich über die Nextion Bib aufregen, aber ich hatte bis dato keine Probleme damit und mein Projekt ist eigentlich zu groß um es komplett umzuschreiben..

In der Nextion.h musst du per define Serial3 auswählen.

Ah ja stimmt da war was, musste ich für den Micro ja auch ändern ich Dummerchen xD

Für alle die einen anderen Serial Port nutzen wollen: Ihr müsst in der NexConfig.h die Zeile define nexSerial ändern.

Danke @Whandall!!