Pourquoi le démarrage du moniteur série redémarre-t-il l'esquisse?

31

Si je télécharge un croquis qui envoie des données série, je vois immédiatement les LED TX / RX clignoter une fois le croquis téléchargé. Si je démarre ensuite le moniteur série, l'esquisse semble redémarrer.

Une simple esquisse minimale qui montre ce comportement:

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

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

Testé avec plusieurs cartes et versions Mac et Windows de l'IDE.

Exemple de sortie - il revient à "Setup" lorsque j'ouvre le moniteur série:

Redémarrer

Pourquoi est-ce?

Cybergibbons
la source
5
Je n'ai jamais vu un croquis qui utilise la série ne le fait pas, donc littéralement n'importe quel croquis.
Cybergibbons
J'ai un problème distinct. Le leostick Arduino (et d'autres) ne se réinitialise plus automatiquement. Comment puis-je le renable?
CMCDragonkai

Réponses:

33

L'Arduino utilise les signaux RTS (Request To Send) (et je pense que DTR (Data Terminal Ready) ) pour se réinitialiser automatiquement. Si vous obtenez un terminal série qui vous permet de modifier les paramètres de contrôle de flux, vous pouvez modifier cette fonctionnalité.

Le terminal Arduino ne vous donne pas beaucoup d'options et c'est la valeur par défaut. D'autres vous permettront d'en configurer beaucoup plus. Régler le contrôle de flux sur aucun vous permettra de vous connecter / déconnecter de la série sans réinitialiser votre carte. il est très utile pour le débogage lorsque vous souhaitez pouvoir simplement brancher le connecteur et voir la sortie sans avoir à recommencer l'esquisse.

Une autre façon de désactiver la réinitialisation automatique consiste à placer une résistance de rappel sur la broche de réinitialisation.

Désactivation de la réinitialisation automatique sur la connexion série

sachleen
la source
2
Arduino Unos peut être fixé avec un condensateur de 10 µF entre RESET et GND. Cela fonctionne pour l'installation pour laquelle je l'ai utilisé jusqu'à présent…
scruss
1
J'ai essayé d'utiliser PuTTY , en me connectant au port COM sur lequel l'Arduino apparaît (COM16 dans mon cas). Il réinitialise toujours l'Arduino si "Contrôle de flux" dans Connexion / Série est réglé sur "Aucun" (les autres options sont "XON / XOFF", "RTS / CTS" et "DSR / DTR"). J'ai utilisé la version 0.60 de PuTTY.
Peter Mortensen
-cont: Il a été essayé sur un Arduino Uno R3.
Peter Mortensen
Le Duemilanove et Uno ont une trace intitulée "EN RESET" qui contrôle ce comportement. Grattez cette trace pour désactiver la réinitialisation automatique. Souder un fil entre les plots pour le réactiver.
mhopeng
12

La vérité est toujours dans les fiches techniques, les schémas et le code:

L'Arduino UNO utilise en fait la /DTRligne pour déclencher une réinitialisation, comme vous pouvez le voir sur la fiche technique suivante:

réinitialiser le schéma

zmo
la source
Le lien vers votre image schématique est rompu.
linhartr22
1
Merci, je l'ai réparé! En fait, je pensais que SO mettait en cache des images, mais il semble que ce ne soit pas le cas, donc je m'assurerai de le garder toujours activé.
zmo
Encore une fois, c'est cassé. Peut-être pouvez-vous l'ajouter en tant qu'image en utilisant l'option imgur de StackExchange? Cliquez simplement sur l'option 'image' dans la barre d'outils de l'éditeur.
fait, merci pour l'astuce (j'avais en fait mon propre site en panne pendant 10 jours parce que je faisais de la maintenance, qui était juste temporaire)
zmo
1
Oui, mais que se passe-t-il réellement? Est-ce dû à la façon dont l'ATmega16U2 est programmé (affirmer PD7 bas lorsqu'un port COM est ouvert par un programme?)? Ou en suivant une norme pour DTR?). Et quelle est l'implication de C5? - va-t-il réinitialiser le processeur principal pour les deux transitions (basse à haute et haute à basse)? Quelle est la largeur d'impulsion approximative (en microsecondes) sur la broche de réinitialisation du processeur principal et à quoi ressemble-t-elle?
Peter Mortensen
1

Cela résout le problème

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
la source