2008-10-12 11 views
5

Ich habe ein Arduino Senden und Empfangen von Anweisungen mit einem Python-Skript über eine serielle Schnittstelle.Überprüfen Sie, ob der serielle Port überwacht

Der Arduino nimmt einen Schaltflächenstatus und wenn er gedrückt wird, sendet er eine Nachricht über den seriellen Port an ein Python-Skript und wartet auf eine Antwort. (über Serial.available()). Es funktioniert gut genug.

Wenn jedoch das Python-Skript aus irgendeinem Grund abgestürzt ist (idealerweise wird es im Hintergrund ausgeführt, so dass es nicht einfach überprüft werden kann), wartet der Arduino für immer und ist auch bei einem Skriptneustart nicht verfügbar.

Gibt es eine Möglichkeit für meinen Arduino zu überprüfen, ob etwas an der seriellen Schnittstelle zu hören ist? (und warne mich mit blinkenden Lichtern usw., falls nicht) oder funktioniert das nicht so? Im schlimmsten Fall könnte ich ein Timeout verwenden, obwohl das nicht ideal ist.

Antwort

6

Sie haben eine eingeschränkte Fähigkeit zu erkennen, ob etwas auf der anderen Seite mit den DSR/DTR-Pins zu hören ist.

Wenn Sie den seriellen Port auf dem Rechner öffnen, auf dem Ihre Skripte laufen, sollte er seinen DTR Pin anheben (oder Sie sollten ihn dazu überreden können: die Dokumentation der Bibliothek, die Sie zum COM Port benutzen) sag dir wie).

Dann auf Ihrem Arduino, können Sie überprüfen, seine DSR-Pin (unter der Annahme Null-Modem-Verkabelung mit Handshake, wo der PC-DTR-Pin mit DSR + CD auf dem Arduino verdrahtet ist) in regelmäßigen Abständen, und behandeln die "niemand verbunden 'Szenario in irgendeiner Weise, die Sie für richtig halten.

Ein Problem mit diesem Ansatz ist, dass Ihr PC-Skript die serielle Schnittstelle möglicherweise nicht schließt, wenn es abstürzt/nicht mehr reagiert und den DTR-Pin aktiviert lässt, als wäre alles noch in Ordnung. Außerdem kann das Skript die Nachricht vom Arduino aufgrund von Fehlern auf der seriellen Leitung einfach verpassen.

Aus diesem Grund sollten Sie immer implementieren ein Timeout in Ihren Empfangsroutinen: auch wenn es eine Partei am anderen Ende hört, gibt es keine Garantie, dass Ihre Nachricht erhalten hat (oder dass ihre Antwort Sie erreichen wird intakt).

Erneutes Senden der Nachricht mindestens einmal (unter der Annahme, DSR ausgelöst wird), wenn eine Zeitüberschreitung auftritt, macht Ihr Protokoll zuverlässiger.

+0

Prost Mate. Als einen interessanten Punkt hat Google Ihre Antwort 3 Minuten nach Ihrer Veröffentlichung ausgewählt. – Hyposaurus

+0

Jeff Atwood twitterte, dass Google fast 50% des Traffics auf dieser Website ist. (Dang kann den Tweet nicht finden, mein google foo funktioniert heute nicht) –

+0

Hey danke für den Starthinweis, aber leider kann ich dazu nicht mehr finden. Können Sie einen Beispielcode für den Zugriff auf den DSR-Pin für Arduino bereitstellen? Prost! – RngTng

0

Ich stimme mit mdb überein, dass Timeouts notwendig sind, würde aber auch hinzufügen, dass Sie ein einfaches Challenge/Response-System implementieren möchten, das regelmäßig überprüft, ob jemand zuhört. (Ich mag IRCDs Ping-Pong-Analogie).

1

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