我正在尝试在 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
字符(默认情况下)会导致^D
read()
默认情况下)不会返回任何内容。
这和你跑步时是一样的
od -vx --endian=big
在终端中输入Ctrl-D.
另一种解释是规范模式已关闭,但VMIN
termios 设置设置为 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)
页以获取更多信息。