デバイスファイルからバイナリストリームをデバッグしています。出力をリアルタイムで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 -f
ttyは必要ありません。 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
答え2
複数行(9行)のソリューションが問題ない場合は、次のhextail.sh
スクリプトを確認してください。
#!/usr/bin/env bash
#par1==buffsize, par2=xxd-columns-width, par3=sleepVal; defaults: 256 16 0
size=${1:-256}; cols=${2:-16}; cnt=0; hbuff=$(eval printf '00%.0s' {1..$size})
while true; do
hbuff=${hbuff:2}$(dd bs=1 count=1 2>/dev/null | xxd -p) #shiftLeft, add 1b
printf '\033[;H'; xxd -r -p <<<$hbuff | xxd -g1 -c$cols #cursor gotoxy 1,1
echo total bytes: $((++cnt)) ; [ -z $3 ] || sleep $3 #...and buff show.
done
bash文字列変数に16進表現を格納してバイナリテーリングを実装します。バッファの最初のバイトは、新しいバイトが最後に追加されると削除されます。
テストコマンドの例:
1) cat /dev/urandom | ./hextail.sh 1024 32 0.2 ...with 200ms sleep
2) ./hextail.sh < /dev/ttyAPP2