为什么“cat ttyUSB0”不产生输出?

为什么“cat ttyUSB0”不产生输出?

我将红外接收器连接到 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工作,但您可以使用终端模拟器来处理它。

尝试minicomscreen(即screen /dev/ttyUSB0 115200- 将 115200 替换为您的红外接收器的波特率。)

答案2

这可能没有帮助,但这是我过去遇到过的类似问题。当我直接为鼠标捕获设备文件时(即使用cat /dev/input/by-id/usb-<mymouse>),我得到的输出类似于使用键盘得到的输出(即乱码)。但是,某些鼠标动作(例如左键单击)不会生成任何可打印字符,因此终端不会显示任何内容。

当然,鼠标仍然在做一些事情,只是我们通过cat设备文件看不到它。幸运的是,内核有一个名为 usbmon 的简洁功能,有助于窃听 USB 设备的原始二进制输出。使用它,我们可以准确地看到当我们执行(例如)左键单击时发生的情况,而通过执行相同的操作/dev通常不会显示任何内容。

同样,这可能没有帮助,但以下是使用 usbmon 的方法:

  1. 确保您的内核已启用 usbmon。的输出:
    zcat /proc/config.gz | grep USB_MON
    应该有=mor =y

  2. 如果是=m,则加载模块sudo modprobe usbmon

  3. 为了确保所有 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 时,输出确实出现了。

相关内容