シリアルポートにデータを送信して回答を表示する方法


37

Linuxでは、コマンド文字列(つまりデータ)をシリアルポート(制御文字を含む)に送信し、応答(通常は制御文字を含むこともあります)をリッスンしたいです。

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



インターセプトをインストールしていません。
アレックス14

1
再開のために指名-それは提案されたように重複ではありません。
ペテルフ

一部の人々はあまりにも愚かすぎて、彼らは質問を二重だと示唆しているだけです。最初にわざわざ質問と答えを読んでください。
デニス

回答:


54

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


出力がまったく得られません。何かアイデアがありますか?
ゴールドネーム

ハードウェアフロー制御の可能性があります。attyコマンドでスイッチを切るか、シリアルケーブルのストラップを高くし、ヌルモデムケーブルを探します。
X天

1
# stty -speed 38400 -f /dev/ttyUSB1リターンstty: invalid argument '-speed'
プロのバックアップ

1
sttyでは、デバイスを設定するために-F(大文字のF)です。また、速度パラメータが間違っています。速度を使用してポートのボーレートを取得するか、ispeedまたはospeed(マイナス記号なし)を使用して入力速度と出力速度を設定するか、単に数値を使用して入力速度と出力速度の両方を設定できます。 dev / ttyS ....
パウルス

@Pro Backupに感謝しますが、この例を修正しました。
X Tian

11

必要なのは、2つのターミナルを開くことだけです。最初の端末でcatは、デバイスからのすべて、例えば

cat /dev/ttyS0

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

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

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

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


上記の回答を書いてから10分後にあなたはこれに回答しましたが、それ以上情報を追加していません!
Xティエン

ああ、すみません、答えを完全に読みませんでした。私の答えがあなたのものに含まれているのを見たので、あなたが私が説明したことだけを説明したように、私はあなたの答えを正しいものとして受け入れます。
アレックス14

COMポートについてあまり知りません。「(反対側の)シリアルデバイスがブロックしていない」とはどういう意味ですか?ファイアウォールに問題がありますか?
ソパラホデアリエレス

9

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

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>&-使用されるべきだと思います。またはおそらく両方?
ヤンキー

1
タイプミス。あなたは正しいです
ジブリ

7

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

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

これはプロセスを自動化するのでとても良いです!私が行う唯一の変更は、完全にオプションですが、受信したコンテンツが送信されたものと同じであることを確認することです-差分でカウントまたはフルになる可能性があります。
HiDefLoLife

4

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

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

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

終了するにはctrl-c、を実行しfgctrl-c再度実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.