从设备文件跟踪二进制流

The*_*eer 6 pipe tail binary

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

到目前为止,我已经使用过,tail -f /dev/ttyAPP2 | hexdump -C但是在我开始在输出中丢失一些字节之后,我明白这可能是一个糟糕的选择,因为它在找到换行符之前不会刷新数据。

有一个非官方的二进制尾,但我目前无法使用这种方法,我正在寻找如何用其他方式实现这一目标的建议?

例子

首先将 tty 设置为原始模式。

stty -F /dev/ttyAPP2 raw
Run Code Online (Sandbox Code Playgroud)

这是我在听设备时得到的(这是真实的输出)

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 
Run Code Online (Sandbox Code Playgroud)

但是,预期的包应该是(这不是真正的输出):

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  
Run Code Online (Sandbox Code Playgroud)

包裹的另一部分在第二个包裹到达时打印出来(这是真正的输出)

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
Run Code Online (Sandbox Code Playgroud)

mik*_*erv 7

你不需要tail -ftty。如果它向您发送 EOF,或者如果它是行缓冲,那么您需要对其进行配置。

stty -F/dev/ttyAPP2 raw
Run Code Online (Sandbox Code Playgroud)

现在你可以...

cat /dev/ttyAPP2
Run Code Online (Sandbox Code Playgroud)

...如所须...

你可以试试...

</dev/ttyAPP2 \
dd bs=16 conv=sync | od -vtx1
Run Code Online (Sandbox Code Playgroud)

...这会将read()您设备中的每个成功同步到 16 字节的空填充块中,因此无论吞吐量如何,都会实时写入行缓冲输出(例如到您的终端),尽管任何尾随空值都可能扭曲你的流。

使用 GNUstdbuf和动态链接od:

stdbuf -o0 od -vtx1 </dev/ttyAPP2
Run Code Online (Sandbox Code Playgroud)

...无论如何都会实时写入输出。

您还可以缓冲到临时文件,例如...

stty -F/dev/ttyAPP2 raw
Run Code Online (Sandbox Code Playgroud)

...虽然可能不如其他建议那么有效,但如果您想通过 EOF 分隔从您的设备读取,可能值得考虑。无论如何,我发现该技术有时在使用 ttys 时很有用。

还可以hexdump使用自定义打印格式强制打印出更少的字节。下面的示例将在每次有 4 个可用字节时打印:

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