Frage

Ich habe ein Arduino Senden und Anweisungen mit einem Python-Skript über eine serielle Schnittstelle zu empfangen.

Der Arduino nimmt einen Knopf Zustand und wenn er gedrückt wird, wird es eine Meldung über die serielle Schnittstelle an einen Python-Skript und wartet auf eine Antwort senden. (Via Serial.available()). Es funktioniert gut genug.

Wenn jedoch der Python-Skript aus irgendeinem Grunde abgestürzt ist (im Idealfall wird es im Hintergrund laufen, so kann es nicht leicht überprüft werden), wird das Arduino ewig wartet und wird sogar auf einem Skript Neustart nicht zur Verfügung.

Gibt es eine Möglichkeit für meine Arduino zu überprüfen, ob es etwas hören auf die serielle Schnittstelle ist? (Und alarmiert mich mit blinkenden Lichtern, usw., wenn nicht) oder ist dies nicht, wie serielle funktioniert? Am schlimmsten Fall, dass ich glaube, ich könnte einen Timeout verwenden, aber das ist nicht ideal ist.

War es hilfreich?

Lösung

Sie haben eine begrenzte Fähigkeit, zu erkennen, ob es durch die Verwendung der DSR / DTR Pins etwas hören auf der anderen Seite ist.

Wenn Sie die serielle Schnittstelle an der Maschine öffnen Sie Ihre Skripte auf laufen, sollte es seinen DTR Stift erhöhen (oder sollten Sie davon zu überzeugen, in der Lage, dies zu tun: die Dokumentation der Bibliothek, die Sie die COM-Port-Laufwerk verwenden zu müssen sagen Sie, wie).

Dann auf Ihrem Arduino, können Sie den DSR Pin überprüfen (Nullmodem-Kabel mit Handshaking angenommen, in dem der PC DTR-Pin auf dem Arduino DSR + CD verdrahtet ist) in regelmäßigen Abständen, und behandeln den ‚niemanden verbunden‘ Szenario in irgendeiner Weise Sie für richtig halten.

Ein Problem bei diesem Ansatz ist, dass Ihr PC Skript nicht den seriellen Port schließen kann, wenn er abstürzt / nicht mehr reagiert, den DTR-Pin als aktiviert zu verlassen, wenn alles noch in Ordnung ist. Auch Ihr Skript kann einfach die Nachricht aus dem Arduino aufgrund von Fehlern auf der seriellen Leitung entgehen lassen.

Aus diesem Grunde sollten Sie immer implementieren ein Timeout in Ihren Routinen erhalten: selbst wenn es eine Partei am anderen Ende zu hören ist, gibt es keine Garantie, es Ihre Nachricht erhalten hat (oder, dass sein Antwort erreichen Sie intakt).

Re-Senden der Nachricht mindestens einmal (unter der Annahme DSR angehoben), wenn ein Timeout auftritt macht das Protokoll zuverlässiger.

Andere Tipps

Das Arduino verwendet nicht die DSR-Leitung oder eine andere Handshaking Linie, so können Sie dies nicht tun, was Sie vorschlagen.

ich mit mdb darüber einig, dass Timeouts notwendig ist, sondern würde auch hinzufügen, dass Sie einfaches Challenge / Response-System implementieren möchten, die in regelmäßigen Abständen überprüft, ob jemand zuhört. (Ich mag ircd Ping-Pong Analogie).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top