シリアルポートがリッスンしているかどうかを確認します

StackOverflow https://stackoverflow.com/questions/195304

  •  10-07-2019
  •  | 
  •  

質問

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

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

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

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

役に立ちましたか?

解決

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

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

次に、Arduinoで、DSRピン(PC DTRピンがArduinoのDSR + CDに接続されている場合、ハンドシェイクを使用したヌルモデム配線を想定)を定期的にチェックし、「接続されていない」シナリオはあなたが適切だと思います。

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

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

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top