Linux 上串行设备和 USB 设备之间的区别?

Difference between Serial and USB devices on Linux?

我用 Linux 系统连接了两个 MCU,一个带有串行接口,一个带有 USB interface.Linux 系统将串行接口识别为 ttys1,将 USB 接口识别为 28。对于串行接口,我可以发送和通过 /dev/ttys1 设备文件接收数据。但是对于 USB 接口,我无法使用 /dev/usb/001/28 设备文件发送和接收数据。

  1. 为什么我们无法使用与串行接口相同的特定设备文件访问 Linux 上的 USB 设备?
  2. 我们如何向连接的 USB 设备发送数据和从连接的 USB 设备接收数据?我已经 read this post 它说我们必须使用 libusb library.If 编写代码所以我们为什么需要它?

    For serial interface:
    echo -e "[=11=]x20" > /dev/ttys1
    success
    
    For USB interface:
    echo -e "[=11=]x20" > /dev/ttys1
    write error: Invalid argument
    

/dev/bus/usb/001/28这样的文件是由Linux系统中的核心USB驱动程序创建的(参见usb/core/devio.c)。这个驱动程序对串行端口一无所知,它只知道 USB。所以你可以发送到这个文件的命令是 "read 32 bytes from endpoint 2" 或 "send 11 bytes to endpoint 3",你可以使用像 libusb 或 libusbp 这样的库来发送这些命令。

但是,如果您可以使用实际的串行驱动程序实现同样的事情,我不建议您这样做,它创建 /dev/tty* 形式的设备节点并在 /dev/serial/by-id 中创建符号链接.您也许可以像以前一样使用 shell 从这些设备读取和写入,但我经常发现它无法按我预期的方式工作。您可以使用 PuTTY 或 screen 等串行终端程序在串行端口上发送和接收 ASCII 字节(即您键入字符以发送它们)。你也可以写一个C程序给它open the port, set its serial port parameters using termios, and then read from and write