はい

はい

デバイスファイルからバイナリストリームをデバッグしています。出力をリアルタイムで16進値で印刷したいです。

これまで私はこれを使用しましたが、tail -f /dev/ttyAPP2 | hexdump -C出力で一部のバイトを失い始めた後は、改行文字が見つかるまでデータをフラッシュしないので、これが悪い選択かもしれないことに気づきました。

非公式があるバイナリテールしかし、現時点ではその方法は利用できず、他の方法でこれを達成するための提案を探していますか?

はい

まず、ttyがrawモードに設定されます。

stty -F /dev/ttyAPP2 raw

これはデバイスを聞くときに得られるものです(これは実際の出力です)。

root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000  55 00 21 00 02 26 00 02  0b 00 09 02 06 01 00 01  
00000010  99 0c ec 45 4f 01 03 47  41 54 45 57 41 59 43 54 

ただし、予想されるパッケージは次のようになります(実際の出力ではありません)。

root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000  55 00 21 00 02 26 00 02  0b 00 09 02 06 01 00 01  
00000010  99 0c ec 45 4f 01 03 47  41 54 45 57 41 59 43 54  
00000020  52 4c 00 00 00 00 00 8b  

パッケージの他の部分は、2番目のパッケージが到着すると印刷されます。 (これは実際の出力です。)

root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000  55 00 21 00 02 26 00 02  0b 00 09 02 06 01 00 01  
00000010  99 0c ec 45 4f 01 03 47  41 54 45 57 41 59 43 54
00000020  52 4c 00 00 00 00 00 8b  55 00 21 00 02 26 00 02
00000030  0b 00 09 02 06 01 00 01  99 0c ec 45 4f 01 03 47
00000040  41 54 45 57 41 59 43 54  52 4c 00 00 00 00 00 8b

ベストアンサー1

tail -fttyは必要ありません。 EOFを送信するか、ラインバッファリングの場合はそれを設定する必要があります。

stty -F/dev/ttyAPP2 raw

今、あなたはできます...

cat /dev/ttyAPP2

...必要に応じて...

あなたは試すことができます...

</dev/ttyAPP2 \
dd bs=16 conv=sync | od -vtx1

...これはデバイスの各成功をread()16バイトの空のパッドブロックに同期させるので、ラインバッファリングされた出力が書き込まれます。(例:ターミナルへ)これはスループットに関係なくリアルタイムで機能しますが、末尾のNULLがあるとストリームが歪む可能性があります。

GNUstdbufと動的接続の使用od

stdbuf -o0 od -vtx1 </dev/ttyAPP2

...とにかく出力はリアルタイムで記録されます。

次の一時ファイルにバッファリングすることもできます。

f=$(mktemp)
exec 3<>"$f"; rm -- "$f"
while   dd >&3 of=/dev/fd/1 bs=4k count=1
        [ -s /dev/fd/3 ]
do      od -An -vtx1 /dev/fd/3
        echo
done    </dev/ttyAPP2 2>/dev/null

...他の提案ほど効率的ではありませんが、EOFを介してデバイスから読み取りを分離したい場合は、考慮する価値があります。とにかく、私はこの技術がttyで作業するときに時々役に立つと思います。

hexdumpまた、カスタム印刷形式を使用してより少ないバイトを印刷することもできます。次の例は、4バイトが利用可能になるたびに印刷します。

hexdump -e '4/1 "%02x " "\n"' < /dev/ttyAPP2

おすすめ記事