web-dev-qa-db-ja.com

シリアルポートにデータを送信して回答を確認するにはどうすればよいですか?

Linuxでは、コマンド文字列(データなど)をシリアルポート(制御文字を含む)に送信し、応答(通常は制御文字も含まれている可能性があります)をリッスンしたいと思います。

Linuxでこれをできるだけ簡単にするにはどうすればよいですか?例は大歓迎です!

45
Alex

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 screenman minicomman stty 詳細については

60
X Tian

あなたがしなければならないすべては2つのターミナルを開くことです。最初のターミナルでは、デバイスからのすべてをcatします。

cat /dev/ttyS0

他の端末では、任意の16進文字とテキストを端末に送信できます。次のように:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

echo -eコマンドは、バックスラッシュエスケープの解釈を有効にします。

もちろん、(i)シリアル設定(速度、ワード長、フロー制御など)が正しく、(ii)シリアルデバイス(反対側)がブロックされていないことを確認する必要があります。

14
Alex

シリアルデバイスと通信するプログラム:

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>&-
12
Zibri

これはより良いアプローチかもしれません:

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
8

次のように同時にデバイスに読み書きできます。

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

メッセージはcatから2番目のstdinに送信され、最初のcatは応答をstdoutにリレーして、端末をチャットルームに変えます。

最後に、ctrl-c、次にfgを実行してからctrl-c再び。

4
diachedelic