web-dev-qa-db-ja.com

Linuxシリアルポートリスナーとインタープリター?

私はプロジェクトにシリアルデバイスを使用しており、PC側で実行しようとしているのは、シリアルデバイスから送信されたコマンドをリッスンし、クエリを解釈し、クエリに応じてコードを実行し、結果を送信することです。 。

正直に言って、リスナーとしてPHPを使用してみましたが、残念ながら、スクリプトをレシーバーとして機能させるために必要な無限ループは、CPUを25%までロードします。したがって、実際にはそうではありません。最良のオプション。

現在cygwinを使用していますが、Linuxのネイティブコマンドを使用してbashスクリプトを作成したいと思います。

以下を使用してデータを受信できます。

cat /dev/ttyS2

そして、次のように応答を送信します。

echo "command to send" > /dev/ttyS2

私の質問は、自動リスナーを作成してデータを送受信できるようにするにはどうすればよいですか?私が抱えている主な問題は、実際には、情報を受け取ったらcat/dev/ttyS2コマンドを停止し、それを変数に入れて、スイッチと比較したり、一連のifそれ以外の場合はブロックします。その後、応答を返送して、サイクルを最初からやり直しますか?

ありがとう

9
Matt

これはあなたが探しているものではありませんか?

while read -r line < /dev/ttyS2; do
  # $line is the line read, do something with it
  echo $result > /dev/ttyS2
done
13
rici

システムにかなり依存しないようにするには、 Python のようなクロスプラットフォームプログラミング言語を使用し、: pySerial のようなクロスプラットフォームシリアルライブラリを使用して、スクリプト内で処理を行います。私はpySerialを使用しましたが、ソースコードをほとんど変更せずにスクリプトクロスプラットフォームを実行できました。 BASHを使用することで、自分自身をかなり制限することになります。

1
Aniket Inge

適切なツールを使用すると、デバイスに出力がない場合でも、実際にはCPU使用率を正確に0にすることができます。

これを実現するには、高級言語(Perl、Python、C/C++で十分ですが、bashではありません)を使用し、シリアルデバイスのファイルハンドルの上でselectループを使用する必要があります。これはPerlの例です http://perldoc.Perl.org/IO/Select.html ですが、select()syscallをサポートしている限り、他の言語を使用できます。

0
mvp