Arduino Mega sendet keine Daten, bis Serial Monitor geöffnet wird

Hallo zusammen

Ich möchte, dass mein AHK-Skript die Nachrichten vom Arduino Mega empfangen kann. Dies funktioniert auch, aber wenn der Arduino Mega keinen Strom mehr hat oder der PC heruntergefahren wurde, empfange ich nichts mehr.

Wenn ich jedoch die Arduino IDE öffne, den Serial Monitor starte und dann wieder schließe, empfängt mein Skript die Daten vom Arduino Mega.

Meine Frage ist: Was macht der Serial Monitor der Arduino IDE beim Öffnen, und kann ich das irgendwie anders lösen?

Zeige uns, was Du wie angeschlossen hast, welcher MC verwendet wird und welchen Sketch Du verwendest. Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

Für mich ist das eindeutig. Wenn der Mega keine Strom mehr bekommt, kann der auch nichts senden. Und wenn der seine Spannung vom PC bekommt, ist das auch eindeutig.

Der Serielle Monitor eröffnet die Schnittstelle.
Wenn die nicht frei ist und im Setup() abgefragt wird, läuft sich die Schleife da tot.

Einen Reset des Mega!

Wie soll das gehen?
Merke, der Mega ist kein Leonardo.

Ich habe ein Nextion Intelligent Display an den Pins 19 und 18 des Arduino Mega angeschlossen. Mein Code nimmt die Zahl, die das Display sendet, und leitet sie an den PC weiter.

Das ist mein Code

void setup() {
    Serial.begin(9600);   // Debugging über USB
    Serial1.begin(9600);  // Nextion Display über Serial1
}

void loop() {
    if (Serial1.available()) {
        String input = "";
        while (Serial1.available()) {
            char c = Serial1.read();
            input += c;
            delay(2);  // Kurz warten, um die gesamte Nachricht zu empfangen
        }
        Serial.println(input);
    }
}

Ich meine damit, dass wenn der PC heruntergefahren und dann wieder hochgefahren wird und das AHK-Skript ausgeführt wird, der Arduino Mega nichts empfängt – erst, wenn der Serial Monitor geöffnet und wieder geschlossen wird.

Dann solltest du für den seriellen Empfang vom PC nicht die Schnittstelle für den seriellen Monitor nehmen, sondern eine der weiteren seriellen Schnittstellen, z.B. Serial2.

Darf ich fragen, wo das ominöse "AHK" ausgeführt wird?
Ist das die Empfangsseite auf dem PC oder das gezeigte auf dem Mega oder gar Code auf dem Nextion?

Das AutoHotkey (AHK) Script wird auf dem PC ausgeführt.

Hardware:

Windows 11
Arduino Mega
Nextion Intelligent 4,3-Zoll-Display

Ich verwende Serial1. Ist das falsch?

Serial1 für das Nextion und Serial2 zur Datenübertragung vom PC.

Okay.
Hast du mal hilfsweise mit einem Terminalprogramm (Putty) versucht ob es geht?
Ich vermute das Problem auf PC-Seite.

1 Like

Ich habe noch ein bisschen weiter getüftelt und vermute, dass das Problem PC-seitig liegt, da es mit Tera Term funktioniert hat. Wisst ihr vielleicht, wie man einen Arduino Mega initialisiert?

Mach es wie in Post #12 geschrieben und es funktioniert.
Der serielle Monitor hat da seine Eigenarten, die dir das Problem macht.
Fakt ist, die serielle Schnittstelle ist kein Bus, du kannst da nur 2 Endpunkte nutzen.
So wie du es machen willst, hast du drei (Arduino, AHK und serieller Monitor) Endpunkte.
Und das macht die Probleme.

Ich habe nur zwei Endpunkte das AHK-Skripte und einen Arduino Mega. Ich muss zuerst den Arduino Mega mit dem Serial Monitor initialisieren (währenddessen ist das AHK-Skript geschlossen). Wenn ich den Serial Monitor schließe und das AHK-Skript starte, funktioniert es (zwei Endpunkte: Arduino Mega und AHK-Skript). Aber die Frage ist: Wie initialisiert der Serial Monitor den Arduino?

Das ist wie schon geschrieben, die Eigenart des seriellen Monitors und hängt mit der Nutzung von USB zusammen.
Sorry, aber anders kann ich es nicht beschreiben. Evtl. kommt da noch einer, der eine genaue Beschreibung dafür hat.
Mach es mit der Serial2 und du hast jederzeit die Möglichkeit auch zu debuggen.

1 Like

Der Monitor wackelt an DTR und löst so einen Reset des Mega aus.

Aber das sagte ich doch schon:

1 Like

Ja, das habe ich probiert, aber es funktioniert nicht.

Versuche es mal so:

void setup() {
    Serial.begin(9600);   // Debugging über USB
    Serial1.begin(9600);  // Nextion Display über Serial1
}

void loop() {
    if (Serial1.available()) {        
        while (Serial1.available()) {
            Serial.print(Serial1.read());
        }        
    }
}