11

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

正直なところ、PHP をリスナーとして使用してみましたが、うまくいきました。残念ながら、スクリプトをレシーバーとして機能させるために必要な無限ループにより、CPU が 25% に負荷されます。したがって、それは実際には最良の選択肢ではありません。

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

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

cat /dev/ttyS2

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

echo "command to send" > /dev/ttyS2

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

ありがとう

4

4 に答える 4

19

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

while read -r line < /dev/ttyS2; do
  # $line is the line read, do something with it
  # which produces $result
  echo $result > /dev/ttyS2
done
于 2012-10-20T21:35:37.627 に答える
1

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

于 2012-10-21T05:42:30.933 に答える
0

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

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

于 2012-10-21T05:34:48.097 に答える