我正在调试来自设备文件的二进制流。我希望将输出作为十六进制值实时打印出来。
到目前为止,我已经使用过tail -f /dev/ttyAPP2 | hexdump -C
,但在我开始在输出中丢失一些字节之后,我明白这可能是一个糟糕的选择,因为它不会刷新数据,直到找到换行符。
有一个非官方的二元尾但我目前无法使用该方法,并且正在寻找如何通过其他方式实现此目的的建议?
例子
首先,tty 设置为原始模式。
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
包裹的另一部分在第二个包裹到达时打印出来(这是真实的输出)
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 字节、空填充块中,因此将写入行缓冲输出(例如到您的终端)无论吞吐量如何,都可以实时进行,但任何尾随的空值都可能会扭曲您的流。
使用 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 来分隔设备的读取,则可能值得考虑。无论如何,我发现该技术有时在使用 ttys 时很有用。
还可以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 字符串变量中来实现二进制尾部。 buff 中的第一个字节在末尾附加新字节时被删除。
测试命令示例:
1) cat /dev/urandom | ./hextail.sh 1024 32 0.2 ...with 200ms sleep
2) ./hextail.sh < /dev/ttyAPP2