如何防止八进制转储(od)返回?

如何防止八进制转储(od)返回?

我正在尝试在 Ubuntu 上/dev/ttyUSB0使用读取一些输出。od所以我使用了这个命令:

od -x --endian=big < /dev/ttyUSB0

当我昨天使用它时,它并没有阻塞,只是显示了一些东西,而没有像这样转义或返回:

0000000 55aa 03ff 0104 0616 835a a555 aaff 0302
0000020 1104 e0e1 025a a555 aa03 ff01 0506 8682 ...

但是当我今天使用它时,它od会在打印后停止并立即返回:

0000000

有人知道我在这里缺少什么吗?

答案1

可能该tty设备处于规范模式(tty 行规则实现简单行编辑器的模式),因此从另一端接收到的eof字符(默认情况下)会导致^Dread()默认情况下)不会返回任何内容。

这和你跑步时是一样的

od -vx --endian=big 

在终端中输入Ctrl-D.

另一种解释是规范模式已关闭,但VMINtermios 设置设置为 0。当 VMIN = 0 时,aread()设备文件上的 a 返回任何准备好立即读取的内容,否则不返回任何内容(意味着结束-file)(除非 VTIME > 0,在这种情况下,它会等待 VTIME 十分之一秒至少一个字节)。

同样,您可以在终端中尝试:

s=$(stty -g); stty -icanon min 0 time 0; od -vx --endian=big; stty "$s"

使用以下命令检查当前设置:

stty -a < /dev/ttyUSB0

如果这/dev/ttyUSB0是一个串行设备,仅用于传输数据而不是用作终端,则您应该发出

stty raw -echo < /dev/ttyUSB0

实际上,这会禁用 tty 线路规则对其的大部分影响。

每个伪终端 (PTY) 组件(软件、主机端、从机端)的职责是什么?以及您的termios(3)手册stty(1)页以获取更多信息。

相关内容