web-dev-qa-db-ja.com

Linuxコマンドラインからシリアルポートへの書き込み

Windowsでは、次のコマンドを使用してシリアルポートデバイスと通信できます。

mode com1: baud=9600 data=8 parity=n stop=1
copy con com1
alt+18alt+2ctrl+z

デバイスは要求された操作を開始します。

スタンドアローンのdebianボックスまたは同じWindowsマシンのdebian virtualboxインスタンスから同じ操作を実行しようとすると、これまでのところ運がありませんでした。

同等のLinuxコマンドを次に示します(少なくともそう思う)。

stty -F /dev/ttyS0 speed 9600 cs8 -cstopb -parenb
echo '\x12\x02' > /dev/ttyS0

何も起こりません。

誰かが正しい方向に私を導くことができますか?

42
erin c
echo '\x12\x02'

解釈されず、文字列\x12\x02(および改行を追加)指定されたシリアルポートに。代わりに使用

echo -n ^R^B

次のように入力して、コマンドラインで作成できます CtrlVCtrlR そして CtrlVCtrlB。または、エディターを使用してスクリプトファイルに入力する方が簡単です。

別のプログラムが干渉しない限り、sttyコマンドは機能するはずです。よくある原因はgpsdです。これは、接続されているGPSデバイスを探します。

17
wallyk

16進コードを使用する場合は、-eオプションを追加して、エコーによるバックスラッシュエスケープの解釈を有効にする必要があります(ただし、結果はechoと同じです)CtrlRCtrlB)。また、wallykが言ったように、-nを追加して、改行の出力を防ぐことができます。

echo -en '\x12\x02' > /dev/ttyS0

また、/dev/ttyS0が目的のポートであることを確認してください。

33

スクリーン:

[〜#〜] note [〜#〜]:私の知る限り、画面は実際に16進数を送信できません。これを行うには、echoまたはprintfを使用します

私はこの投稿の提案を使用してシリアルポートに書き込み、別の post からの情報を使用してポートから読み取り、結果が混在していました。 screenを使用すると、そのポートでターミナルセッションが直接開かれるため、「簡単な」ソリューションであることがわかりました。 (画面には非常に奇妙なインターフェイスIMOがあり、それを理解するためにさらに読む必要があるため、引用符で簡単に説明します。)

このコマンドを発行してスクリーンセッションを開くと、入力したものがポートに送信され、その下に戻り値が出力されます。

screen /dev/ttyS0 19200,cs8

(速度、パリティ、ストップビットなどのニーズに合うように上記を変更してください。)投稿が具体的に求めているように、画面は「Linuxコマンドライン」ではないことを理解していますが、それは同じ精神だと思います。さらに、毎回echoやquotesを入力する必要はありません。

ECHO:

プレトリアのドロイドの答えに従ってください。しかし、これはcatコマンド(cat < /dev/ttyS0whileechoコマンドを送信していました。

PRINTF:

Printfの '%x'コマンドも使用できることがわかりました。

c="\x"$(printf '%x' 0x12)
printf $c >> $SERIAL_COMM_PORT

繰り返しますが、printfの場合は、cat < /dev/ttyS0コマンドを送信する前。

7
MrUser