Question

J'ai un Arduino qui envoie et reçoit des instructions avec un script Python via un port série.

L’Arduino prend l’état d’un bouton et lorsqu’il est enfoncé, il envoie un message via le port série à un script Python et attend une réponse. (via Serial.available () ). Cela fonctionne assez bien.

Cependant, si le script Python s'est écrasé pour une raison quelconque (idéalement, il fonctionnera en arrière-plan, afin de ne pas pouvoir le vérifier facilement), l'Arduino attendra indéfiniment et ne sera pas disponible même au redémarrage du script.

Existe-t-il un moyen pour mon Arduino de vérifier s’il ya quelque chose d’écoute sur le port série? (et alertez-moi avec des lumières clignotantes, etc. si ce n'est pas le cas) ou n'est-ce pas ainsi que fonctionne le port série? Dans le pire des cas, je pense que je pourrais utiliser un délai d’attente, bien que ce ne soit pas idéal.

Était-ce utile?

La solution

Vous avez une capacité limitée à détecter s'il y a une écoute de l'autre côté à l'aide des broches DSR / DTR.

Lorsque vous ouvrez le port série sur la machine sur laquelle vos scripts sont exécutés, il doit afficher sa broche DTR (ou vous devriez pouvoir le convaincre de le faire: la documentation de la bibliothèque que vous utilisez pour gérer le port COM doit indiquer vous comment).

Ensuite, sur votre Arduino, vous pouvez vérifier sa broche DSR (en supposant un câblage null-modem avec handshaking, où la broche PC DTR est câblée sur DSR + CD sur l'Arduino) à intervalles réguliers, et gérer le "personne connectée" scénario comme bon vous semble.

Un problème avec cette approche est que votre script PC peut ne pas fermer le port série quand il se bloque / cesse de répondre, laissant la broche DTR activée comme si tout était toujours OK. De plus, il est possible que votre script manque simplement le message de l’Arduino à cause d’erreurs sur la ligne série.

Pour cette raison, vous devez toujours implémenter un délai d’attente dans vos routines de réception: même s’il ya une partie à votre écoute, rien ne garantit qu’elle a reçu votre message (ou que son la réponse vous parviendra intacte).

Le fait de renvoyer le message au moins une fois (en supposant que DSR soit déclenché) en cas d'expiration du délai rend votre protocole plus fiable.

Autres conseils

L’Arduino n’utilise ni la ligne DSR ni aucune autre ligne de liaison, vous ne pouvez donc pas faire ce que vous suggérez.

Je suis d’accord avec mdb sur le fait que des délais d’expiration sont nécessaires, mais j’aimerais aussi ajouter que vous voudrez peut-être mettre en place un système simple de challenge / réponse qui vérifie périodiquement si quelqu'un écoute. (J'aime l'analogie de Ping-Pong d'ircd).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top