Linuxでは、コマンド文字列(データなど)をシリアルポート(制御文字を含む)に送信し、応答(通常は制御文字も含まれている可能性があります)をリッスンしたいと思います。
Linuxでこれをできるだけ簡単にするにはどうすればよいですか?例は大歓迎です!
Unix上のすべてのデバイスはデバイスファイルにマップされ、シリアルポートは/dev/ttyS0
/dev/ttyS1
..。
最初にそのファイルの権限を確認し、/dev/ttyS1
。
ls -l /dev/ttyS1
これが共有システムである場合は、読み取りと書き込みのアクセス権が必要になります。そのため、すべての人がアクセスできるようにした場合のセキュリティ上の影響を考慮する必要があります。
chmod o+rw /dev/ttyS1
ファイルに書き込むための非常に単純な粗雑な方法では、単純なecho
コマンドを使用します。
echo -ne '\033[2J' > /dev/ttyS1
そして読む
cat -v < /dev/ttyS1
1つの端末で猫を走らせ、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
詳細については
あなたがしなければならないすべては2つのターミナルを開くことです。最初のターミナルでは、デバイスからのすべてをcat
します。
cat /dev/ttyS0
他の端末では、任意の16進文字とテキストを端末に送信できます。次のように:
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
echo -e
コマンドは、バックスラッシュエスケープの解釈を有効にします。
もちろん、(i)シリアル設定(速度、ワード長、フロー制御など)が正しく、(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>&-
これはより良いアプローチかもしれません:
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
次のように同時にデバイスに読み書きできます。
cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411
メッセージはcat
から2番目のstdin
に送信され、最初のcat
は応答をstdout
にリレーして、端末をチャットルームに変えます。
最後に、ctrl-c
、次にfg
を実行してからctrl-c
再び。