Warum startet der serielle Monitor die Skizze neu?


31

Wenn ich eine Skizze hochlade, die serielle Daten sendet, blinken die TX / RX-LEDs sofort, sobald die Skizze hochgeladen wurde. Wenn ich dann den seriellen Monitor starte, scheint die Skizze neu zu starten.

Eine einfache Minimalskizze, die dieses Verhalten zeigt:

void setup()
{
    Serial.begin(9600);
    Serial.println("Setup");
}

void loop()
{
  Serial.println("Loop");
  delay(1000);
}

Getestet mit mehreren Boards sowie Mac- und Windows-Versionen der IDE.

Beispielausgabe - beim Öffnen des seriellen Monitors wird auf "Setup" zurückgegriffen:

Neustart

Warum ist das?


5
Ich habe noch nie eine serielle Skizze gesehen, die dies nicht tut, also buchstäblich jede Skizze.
Cybergibbons



Ich habe ein separates Problem. Der Arduino-Leostick (und andere) werden nicht mehr automatisch zurückgesetzt. Wie kann ich es erneuern?
CMCDragonkai

Antworten:


33

Der Arduino verwendet die RTS- Signale (Request To Send) (und ich denke, DTR- Signale (Data Terminal Ready) ) zum automatischen Zurücksetzen. Wenn Sie ein serielles Terminal erhalten, mit dem Sie die Einstellungen für die Flusskontrolle ändern können, können Sie diese Funktionalität ändern.

Das Arduino-Terminal bietet Ihnen nicht viele Optionen, und das ist die Standardeinstellung. Mit anderen können Sie viel mehr konfigurieren. Wenn Sie die Flusskontrolle auf "Keine" einstellen, können Sie die serielle Verbindung herstellen oder trennen, ohne die Karte zurücksetzen zu müssen. Dies ist sehr nützlich für das Debuggen, wenn Sie nur den Konnektor anschließen und die Ausgabe anzeigen möchten, ohne die Skizze erneut beginnen zu müssen.

Eine andere Möglichkeit, den automatischen Reset zu deaktivieren, besteht darin, einen Pull-Up-Widerstand auf den Reset-Pin zu legen.

Deaktivieren der automatischen Rücksetzung bei serieller Verbindung


2
Arduino Unos können mit einem 10 µF Kondensator zwischen RESET und GND fixiert werden. Es funktioniert für die eine Installation, für die ich es bisher verwendet habe…
Scruss

1
Ich habe versucht, mit PuTTY eine Verbindung zum COM-Port herzustellen, an dem der Arduino angezeigt wird (in meinem Fall COM16). Der Arduino wird immer noch zurückgesetzt, wenn "Flusskontrolle" in Verbindung / Seriell auf "Keine" gesetzt ist (die anderen Optionen sind "XON / XOFF", "RTS / CTS" und "DSR / DTR"). Ich habe die Version 0.60 von PuTTY verwendet.
Peter Mortensen

-cont: Es wurde auf einem Arduino Uno R3 ausprobiert.
Peter Mortensen

Duemilanove und Uno haben eine mit "EN RESET" gekennzeichnete Ablaufverfolgung, die dieses Verhalten steuert. Entfernen Sie diesen Trace, um das automatische Zurücksetzen zu deaktivieren. Löten Sie einen Draht über die Pads, um ihn wieder zu aktivieren.
Mhopeng

12

Die Wahrheit ist immer in den Datenblättern, den Schaltplänen und dem Code:

Der Arduino UNO verwendet die /DTRLeitung tatsächlich , um einen Reset auszulösen, wie Sie auf dem folgenden Datenblatt sehen können:

Schaltplan zurücksetzen


Die Verknüpfung zu Ihrem Schaltplanbild ist unterbrochen.
Linhartr22

1
Danke, ich habe es behoben! Ich dachte tatsächlich, dass SO Bilder zwischenspeichert, aber es sieht so aus, als wäre es nicht so, also werde ich sicherstellen, dass es immer eingeschaltet bleibt.
Zmo

Wieder ist es kaputt. Vielleicht können Sie es mit der imgur-Option von StackExchange als Bild hinzufügen? Klicken Sie einfach auf die Option "Bild" in der Symbolleiste des Editors.

erledigt, danke für den tipp (ich hatte meine eigene
seite

1
Ja, aber was passiert eigentlich? Liegt es an der Art und Weise, wie der ATmega16U2 programmiert ist? Oder einem Standard für DTR folgen?). Und was bedeutet C5? - Wird der Hauptprozessor für beide Übergänge zurückgesetzt (niedrig zu hoch und hoch zu niedrig)? Wie ist die ungefähre Impulsbreite (in Mikrosekunden) auf dem Reset-Pin des Hauptprozessors und wie sieht sie aus?
Peter Mortensen

1

Dies behebt das Problem

import os
import sys
import termios
import fcntl

        self.fd = sys.stdin.fileno()

        # Stop resetting the arduino on serial connect

        self.newattr = termios.tcgetattr(self.fd)
        self.newattr[2] = self.newattr[2] & ~termios.HUPCL
        termios.tcsetattr(self.fd, termios.TCSANOW, self.newattr)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.