![cat 损坏串行端口数据](https://linux22.com/image/25703/cat%20%E6%8D%9F%E5%9D%8F%E4%B8%B2%E8%A1%8C%E7%AB%AF%E5%8F%A3%E6%95%B0%E6%8D%AE.png)
我有一个将一些字节写入串行端口的应用程序。当我cat /dev/ttyS0
查看正在传输的内容时,我发现数据已被命令损坏cat
。有没有其他方法可以查看串行端口上正在发送的内容?
有谁知道为什么cat
要更改数据?
编辑:另一端有另一个应用程序,我想拦截数据以检查其内容,但该应用程序必须继续工作。
答案1
您确定数据没有被您的终端(或 cat 显示的任何地方)损坏吗? cat
不太可能损坏您的数据。
尝试使用od
(八进制转储)转储来自串行端口的数据,这样您就可以准确地看到遇到的情况(而不依赖于它是可打印的)。od -c
如果您需要 ASCII 数据,请使用。
如果您仍然看到损坏,也许您的串行端口配置不正确?尝试setserial
看看stty
他们是否可以更好地配置。
答案2
cat
不修改数据。可能有旧的 Unix 系统会截断包含空字节的行,但 Linux 不会,而且我认为不会有任何现代的类 Unix 系统。
另一方面,如果您尝试直接在终端上显示二进制数据,终端会将控制字符解释为控制显示的命令。这就是控制字符的用途。如果您想查看原始数据的可打印表示形式,您有多种解决方案:
- Run
cat -A
,它将打印可读但不明确的控制字符表示(例如,^A
可能是字节 0x01 或两字节序列 0x5e 0x41)。 - 运行
hexdump -C
,od -t x1
或其他一些十六进制转储程序(如果您愿意,也可以使用八进制转储)。 - 运行
less /dev/ttyS0
并按F
读取一些数据然后Ctrl+C
浏览它。在 less 内,键入-r
可在控制字符的原始显示和可打印表示之间切换。
请注意,读取/dev/ttyS0
显示的是串行端口接收的内容,而不是通过串行端口发送的内容。如果您想要这样做,请监视正在编写的应用程序,例如使用strace
调试器。
答案3
它没有损坏。发生的情况是cat
命令正在获取一些字节,并且您的应用程序正在获取其中的一些字节。因此,当您运行时cat
,应用程序会错过它读取的任何字节,并且cat
应用程序和应用程序都会看到(不同的)部分流似乎已损坏。