Dlaczego uruchomienie monitora szeregowego ponownie uruchamia szkic?

31

Jeśli prześlę szkic, który wysyła dane szeregowe, natychmiast widzę, że diody LED TX / RX migają po przesłaniu szkicu. Jeśli następnie uruchomię monitor szeregowy, szkic wydaje się restartować.

Minimalny szkic pokazujący to zachowanie:

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

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

Testowane z kilkoma płytkami oraz wersjami IDE dla komputerów Mac i Windows.

Przykładowe dane wyjściowe - po otwarciu monitora szeregowego wraca do „Setup”:

Uruchom ponownie

Dlaczego to?

Cybergibbons
źródło
5
Nigdy nie widziałem szkicu, który wykorzystuje serial, nie rób tego, więc dosłownie każdy szkic.
Cybergibbons,
Mam osobny problem. Leostick Arduino (i inne) już się nie resetuje automatycznie. Jak mogę to włączyć?
CMCDragonkai

Odpowiedzi:

33

Arduino używa sygnałów RTS (Request To Send) (i myślę, że DTR (Data Terminal Ready) ) do automatycznego resetowania. Jeśli otrzymasz terminal szeregowy, który umożliwia zmianę ustawień kontroli przepływu, możesz zmienić tę funkcjonalność.

Terminal Arduino nie daje wielu opcji i to jest ustawienie domyślne. Inne pozwolą ci skonfigurować znacznie więcej. Ustawienie kontroli przepływu na none pozwoli ci podłączyć się / odłączyć od portu szeregowego bez resetowania płyty. jest to bardzo przydatne do debugowania, gdy chcesz po prostu podłączyć złącze i zobaczyć dane wyjściowe bez konieczności rozpoczynania szkicu.

Innym sposobem wyłączenia automatycznego resetowania jest umieszczenie rezystora podciągającego na bolcu resetującym.

Wyłączanie automatycznego resetowania przy połączeniu szeregowym

sachleen
źródło
2
Arduino Unos można zamocować za pomocą kondensatora 10 µF przez RESET i GND. Działa w przypadku jednej instalacji, z której korzystałem do tej pory…
scruss
1
Próbowałem użyć PuTTY , łącząc się z portem COM, na którym pojawia się Arduino (w moim przypadku COM16). Nadal resetuje Arduino, jeśli „Kontrola przepływu” w Connection / Serial jest ustawiona na „None” (inne opcje to „XON / XOFF”, „RTS / CTS” i „DSR / DTR”). Użyłem wersji 0.60 PuTTY.
Peter Mortensen,
-cont: Wypróbowano na Arduino Uno R3.
Peter Mortensen,
Duemilanove i Uno mają ślad oznaczony „EN RESET”, który kontroluje to zachowanie. Zdrap ślad, aby wyłączyć automatyczne resetowanie. Przylutuj drut między elektrodami, aby go ponownie włączyć.
mhopeng
12

Prawda jest zawsze w arkuszach danych, schematach i kodzie:

Arduino UNO faktycznie używa /DTRlinii do wyzerowania, jak widać w następującym arkuszu danych:

zresetuj schemat

zmo
źródło
Link do twojego schematu jest zepsuty.
linhartr22,
1
Dziękuję, naprawiłem to! Właściwie myślałem, że SO buforuje obrazy, ale wygląda na to, że tak nie jest, więc upewnię się, że zawsze będę włączony.
zmo
Znowu jest zepsute. Być może możesz dodać go jako obraz za pomocą opcji imgur StackExchange? Wystarczy kliknąć opcję „obraz” na pasku narzędzi edytora.
zrobione, dziękuję za podpowiedź (faktycznie miałem swoją własną stronę przez 10 dni nieczynną, ponieważ przeprowadzałem konserwację, która była tylko tymczasowa)
zmo
1
Tak, ale co się właściwie dzieje? Czy wynika to ze sposobu, w jaki ATmega16U2 jest programowany (utrzymywanie niskiego poziomu PD7, gdy program jest otwierany przez port COM?)? Czy postępujesz zgodnie ze standardami dla DTR?). A jakie są implikacje C5? - czy zresetuje główny procesor dla obu przejść (od niskiego do wysokiego i od wysokiego do niskiego)? Jaka jest przybliżona szerokość impulsu (w mikrosekundach) na styku resetowania procesora głównego i jak to wygląda?
Peter Mortensen
1

To rozwiązuje 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)
Julian Lewis
źródło