![为什么“cat ttyUSB0”不产生输出?](https://linux22.com/image/51844/%E4%B8%BA%E4%BB%80%E4%B9%88%E2%80%9Ccat%20ttyUSB0%E2%80%9D%E4%B8%8D%E4%BA%A7%E7%94%9F%E8%BE%93%E5%87%BA%EF%BC%9F.png)
我将红外接收器连接到 USB 端口...(dmesg 的最后一行告诉设备文件)
$ dmesg
[10496.596063] usb 7-2: new full-speed USB device number 2 using uhci_hcd
[10496.751112] usb 7-2: New USB device found, idVendor=0df7, idProduct=0620
[10496.751117] usb 7-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[10496.751120] usb 7-2: Product: USB-Serial Controller
[10496.751124] usb 7-2: Manufacturer: Prolific Technology Inc.
[10496.787441] usbcore: registered new interface driver usbserial
[10496.787467] usbcore: registered new interface driver usbserial_generic
[10496.787483] usbserial: USB Serial support registered for generic
[10496.795104] usbcore: registered new interface driver pl2303
[10496.795129] usbserial: USB Serial support registered for pl2303
[10496.795160] pl2303 7-2:1.0: pl2303 converter detected
[10496.807238] usb 7-2: pl2303 converter now attached to ttyUSB0
然后我就继续尝试...
$ sudo cat /dev/ttyUSB0
但没有输出,只是挂起。尽管如此,当我按下遥控器上的任何按钮时,红外接收器设备的 LED 都会闪烁,所以这似乎确实有效。
为什么会这样呢?
笔记:
当我从 USB 端口移除设备并打印“cat: ttyUSB0: No such device”时,上述命令退出,并且 dmesg 打印 3 行:
[13707.264086] usb 7-2: USB disconnect, device number 2 [13707.264894] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0 [13707.264915] pl2303 7-2:1.0: device disconnected)
对于键盘的设备文件,这可以工作,例如:
$ sudo cat /dev/input/by-id/usb-USB_USB_Keykoard-event-kbd
当我按键盘上的任意键时,控制台上会产生许多奇怪的字符
- 其他 USB 端口也会发生同样的情况
答案1
我认为对于串行设备,您必须在执行任何操作之前设置波特率。我不确定如何从命令行执行此操作才能开始cat
工作,但您可以使用终端模拟器来处理它。
尝试minicom
或screen
(即screen /dev/ttyUSB0 115200
- 将 115200 替换为您的红外接收器的波特率。)
答案2
这可能没有帮助,但这是我过去遇到过的类似问题。当我直接为鼠标捕获设备文件时(即使用cat /dev/input/by-id/usb-<mymouse>
),我得到的输出类似于使用键盘得到的输出(即乱码)。但是,某些鼠标动作(例如左键单击)不会生成任何可打印字符,因此终端不会显示任何内容。
当然,鼠标仍然在做一些事情,只是我们通过cat
设备文件看不到它。幸运的是,内核有一个名为 usbmon 的简洁功能,有助于窃听 USB 设备的原始二进制输出。使用它,我们可以准确地看到当我们执行(例如)左键单击时发生的情况,而通过执行相同的操作/dev
通常不会显示任何内容。
同样,这可能没有帮助,但以下是使用 usbmon 的方法:
确保您的内核已启用 usbmon。的输出:
zcat /proc/config.gz | grep USB_MON
应该有=m
or=y
。如果是
=m
,则加载模块sudo modprobe usbmon
为了确保所有 USB 套接字都显示在正确的位置,请运行:
ls /sys/kernel/debug/usb/usbmon
您应该看到类似以下内容的内容:
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
不同的数字代表不同的USB端口,前面带0的数字表示所有USB端口的聚合输出。例如,运行可以cat /sys/kernel/debug/usb/usbmon/0u
准确显示设备正在执行的操作,即使在cat
文件输入/dev
没有显示任何内容的情况下也是如此。
无论这是否能解决您的问题,它在将来都可能会有所帮助,因为它通常是比/dev
.
祝你好运 :)
答案3
我遇到过同样的问题
另一方面,我的设备仅发送数据流,没有行尾
您需要将 /dev/ttyUSB0 设置为 raw,使其一次处理一个字节的流:
stty -F dev/ttyUSB0 原始
(当然,请确保正确设置速度,只需在该行末尾添加波特值即可)
答案4
对我来说,波特率太低了。当我重新配置系统(设备和端口)以使用 300 而不是 150 时,输出确实出现了。