Linuxでは、コマンド文字列(つまりデータ)をシリアルポート(制御文字を含む)に送信し、応答(通常は制御文字を含むこともあります)をリッスンしたいです。
Linuxでできるだけ簡単にこれを行うにはどうすればよいですか?例は大歓迎です!
Linuxでは、コマンド文字列(つまりデータ)をシリアルポート(制御文字を含む)に送信し、応答(通常は制御文字を含むこともあります)をリッスンしたいです。
Linuxでできるだけ簡単にこれを行うにはどうすればよいですか?例は大歓迎です!
回答:
Unix上のすべてのデバイスはデバイスファイルにマップされ、シリアルポートは/dev/ttyS0
/dev/ttyS1
...になり ます。
最初にそのファイルのパーミッションを見て、を使用していると仮定しましょう/dev/ttyS1
。
ls -l /dev/ttyS1
read.writeアクセスが必要になります。これが共有システムである場合、すべての人に公開することのセキュリティ上の影響を考慮する必要があります。
chmod o+rw /dev/ttyS1
ファイルに書き込む非常に単純な粗雑な方法は、単純なecho
コマンドを使用します。
echo -ne '\033[2J' > /dev/ttyS1
そして読む
cat -v < /dev/ttyS1
1つの端末でcatを実行し、2番目の端末でエコーすることができます。
すべてが意味のないものである場合、ボーレート、ビット設定は送信を開始する前に設定する必要があります。stty
それを行います。!! 注sttyは、影響を与えるデフォルトのファイル記述子としてstdinを使用します。
同等のコマンド。
stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1
これで何かをスクリプト化してログに記録することができますか?何を達成しようとしているかわからない。
よりインタラクティブにするために、デフォルト設定のアプローチは
minicom
、これまで述べてきたことをすべて実行するプログラムであることに注意してください。(Windowsのハイパーターミナルと同様に、おなじみかもしれません)。
中間ソリューションではscreen
、シリアルデバイスで動作するようなターミナルプログラムを使用します。
screen /dev/ttyS1
man screen
man minicom
man stty
詳細については
# stty -speed 38400 -f /dev/ttyUSB1
リターンstty: invalid argument '-speed'
必要なのは、2つのターミナルを開くことだけです。最初の端末でcat
は、デバイスからのすべて、例えば
cat /dev/ttyS0
他の端末では、次のように任意の16進文字とテキストを端末に送信できます。
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
このecho -e
コマンドは、バックスラッシュエスケープの解釈を有効にします。
もちろん、(i)シリアル設定(速度、ワード長、フローctrlなど)が正しく、(ii)シリアルデバイス(反対側)がブロックされていないことを確認する必要があります。
シリアルデバイスと通信するプログラム:
picocom
minicom
socat
またはシェルから次のことができます:
stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99 # this reads just a CR
read answer <&99 # this reads the answer OK
exec 99>&-
exec 99<&-
またはexec 99>&-
使用されるべきだと思います。またはおそらく両方?
これはより良いアプローチかもしれません:
stty -F /dev/ttyUSB0 115200 raw -echo #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0 #REDIRECT SERIAL OUTPUT TO FD 3
cat <&3 > /tmp/ttyDump.dat & #REDIRECT SERIAL OUTPUT TO FILE
PID=$! #SAVE PID TO KILL CAT
echo "R" > /dev/ttyUSB0 #SEND COMMAND STRING TO SERIAL PORT
sleep 0.2s #WAIT FOR RESPONSE
kill $PID #KILL CAT PROCESS
wait $PID 2>/dev/null #SUPRESS "Terminated" output
exec 3<&- #FREE FD 3
cat /tmp/ttyDump.dat #DUMP CAPTURED DATA