6

シリアルポートを介してPythonスクリプトで命令を送受信するArduinoがあります。

Arduinoはボタン状態になり、押されると、シリアルポートを介してPythonスクリプトにメッセージを送信し、応答を待ちます。(経由Serial.available())。それは十分に機能します。

ただし、Pythonスクリプトが何らかの理由でクラッシュした場合(理想的にはバックグラウンドで実行されるため、簡単にチェックできません)、Arduinoは永久に待機し、スクリプトを再起動しても使用できなくなります。

Arduinoがシリアルポートでリッスンしているものがあるかどうかを確認する方法はありますか?(そうでない場合は、ライトの点滅などで私に警告します)またはこれはシリアルがどのように機能するかではありませんか?最悪の場合、タイムアウトを使用できると思いますが、それは理想的ではありません。

4

3 に答える 3

7

DSR / DTRピンを使用して、反対側で何かがリッスンしているかどうかを検出する機能は制限されています。

スクリプトを実行するマシンでシリアルポートを開くと、DTRピンが上がるはずです(または、そうするように説得できるはずです。COMポートの駆動に使用するライブラリのドキュメントにその方法が記載されているはずです)。 。

次に、Arduinoで、DSRピンを定期的にチェックし(PCDTRピンがArduinoのDSR+ CDに配線されている、ハンドシェイク付きのヌルモデム配線を想定)、「誰も接続されていない」シナリオを処理できます。あなたが適切だと思う方法。

このアプローチの問題の1つは、PCスクリプトがクラッシュ/応答を停止したときにシリアルポートを閉じず、すべてがまだ問題ないかのようにDTRピンを有効にしたままにする可能性があることです。また、シリアルラインのエラーが原因で、スクリプトがArduinoからのメッセージを見逃す可能性があります。

そのため、受信ルーチンには常にタイムアウトを実装する必要があります。相手側でリッスンしているパーティがあったとしても、メッセージを受信した(またはその応答がそのまま届く)という保証はありません。

タイムアウトが発生した場合にメッセージを少なくとも1回(DSRが発生したと仮定して)再送信すると、プロトコルの信頼性が高まります。

于 2008-10-12T10:46:23.873 に答える
1

Arduino は DSR ラインやその他のハンドシェイク ラインを使用しないため、提案したことは実行できません。

于 2010-03-29T20:19:43.547 に答える
0

タイムアウトが必要であるという mdb に同意しますが、誰かがリッスンしているかどうかを定期的にチェックする単純なチャレンジ/レスポンス システムを実装することもできます。(私は ircd の Ping-Pong アナロジーが好きです)。

于 2008-10-12T11:29:23.457 に答える