web-dev-qa-db-ja.com

オクタールダンプ(od)が戻るのを防ぐ方法は?

Ubuntuでodを使用して、/dev/ttyUSB0からの出力を読み取ろうとしています。だから私はこのコマンドを使用しました:

od -x --endian=big < /dev/ttyUSB0

私が昨日それを使用したとき、それはブロックされておらず、このように逃げたり戻ったりせずに物を見せただけでした:

0000000 55aa 03ff 0104 0616 835a a555 aaff 0302
0000020 1104 e0e1 025a a555 aa03 ff01 0506 8682 ...

しかし、今日使用すると、odは停止し、印刷直後に戻ります。

0000000

誰かが私がここで欠けているものを知っていますか?

1
user206420

おそらく、ttyデバイスは正規モード(ttyラインディシプリンが単純なラインエディターを実装するモード)であるため、もう一方の端からeof文字(デフォルトでは_^D_)を受信します。 read()は何も返しません。

それはあなたが走るときと同じでしょう

_od -vx --endian=big 
_

ターミナルでタイプします Ctrl-D

もう1つの説明は、正規モードはオフですが、VMINtermios設定が0に設定されていることです。VMIN= 0の場合、デバイスファイルのread()は、準備ができているものをすべて返します。すぐに読み取られ、それ以外は何も読み取られません(ファイルの終わりを意味します)(VTIME> 0の場合を除きます。この場合、少なくとも1バイトはVTIMEデシ秒まで待機します)。

繰り返しになりますが、次の端末で試すことができます。

_s=$(stty -g); stty -icanon min 0 time 0; od -vx --endian=big; stty "$s"
_

次のコマンドで現在の設定を確認します。

_stty -a < /dev/ttyUSB0
_

その_/dev/ttyUSB0_が、データの転送にのみ使用され、端末としては使用されないシリアルデバイスである場合は、

_stty raw -echo < /dev/ttyUSB0
_

事実上、それはそれに対するttyライン規律の効果のほとんどを無効にします。

各擬似端末(PTY)コンポーネント(ソフトウェア、マスター側、スレーブ側)の責任は何ですか? およびtermios(3)およびstty(1)のマニュアルページを参照してください。詳細については。

2