例子

例子

我正在调试来自设备文件的二进制流。我希望将输出作为十六进制值实时打印出来。

到目前为止,我已经使用过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

相关内容