WebUSB API 与串行 API

问题描述 投票:0回答:1

WebUSBWeb Serial API 都可用于通过 Web 浏览器与通过 USB 插头连接到计算机的设备进行通信。

我对硬件/微控制器编程完全陌生(之前只进行过 Web 开发),但我已经广泛尝试找出决定设备是否可以被两个 API 中的哪一个读取的因素。通用串行总线毕竟是串行的,不是吗?!所以我的问题如下:

  • 什么决定了连接 USB 插头的设备是否与 Serial API 或 WebUSB API 兼容?
  • 这是否取决于我的计算机上有哪些驱动程序?例如。这可能与 USB CDC(我在研究中经常偶然发现)和驱动程序有关吗?
  • 同一个设备可以在一台计算机上兼容WebUSB,但在另一台计算机上兼容Serial API吗?例如。取决于可用的驱动程序或主机操作系统?
  • 如果我使用了其他编程环境,例如使用 C 编写本机程序,然后我可以自由选择使用“串行方式”还是 USB 协议与特定设备进行通信?

如果能对前面的问题有所启发,这是我的USB探索故事:

我有来自同一制造商的两种不同类型的设备(两者都用于读取电子标签以在跑步比赛中计时)。在 Chrome 浏览器中,当实现这两个 API 的基本功能时,一个出现在串行 API 的弹出窗口中,另一个出现在 WebUSB 的弹出窗口中。使用串行 API,我可以通过Streams API 发送和接收字节来进行通信,但使用 WebUSB,我需要通过批量传输进行通信。在串行 API 传输中,我似乎永远不会丢失数据,但在 WebUSB 中进行批量传输时,如果拉取速度不够快,我似乎会丢失数据(即,如果我在再次拉取之前对已拉取的数据进行过多处理) )。所以,它们对我来说看起来都很“串行”,而且令我困扰的是我不能同时使用串行 API(而且我不明白为什么),因为它似乎更可靠并且使用方便的 Streams API。

我使用的是 OSX (10.14.6)。

当我对两个设备执行

ioreg -l -p IOUSB
时,结果如下:

  • 串行 API 兼容设备:
    +-o USB <-> Serial@14200000  <class AppleUSBDevice, id 0x10000d0b3, registered, matched, active, busy 0 (10 ms), retain 28>
        {
          "sessionID" = 210143274448224
          "iManufacturer" = 1
          "bNumConfigurations" = 1
          "idProduct" = 24577
          "bcdDevice" = 1024
          "Bus Power Available" = 250
          "USB Address" = 30
          "bMaxPacketSize0" = 8
          "iProduct" = 2
          "iSerialNumber" = 0
          "bDeviceClass" = 0
          "Built-In" = No
          "locationID" = 337641472
          "bDeviceSubClass" = 0
          "bcdUSB" = 272
          "USB Product Name" = "USB <-> Serial"
          "PortNum" = 1
          "non-removable" = "no"
          "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
          "bDeviceProtocol" = 0
          "IOUserClientClass" = "IOUSBDeviceUserClientV2"
          "IOPowerManagement" = {"DevicePowerState"=0,"CurrentPowerState"=4,"CapabilityFlags"=32768,"MaxPowerState"=4,"DriverPowerState"=4}
          "IOBusyInterest" = "IOCommand is not serializable"
          "Device Speed" = 1
          "USB Vendor Name" = "FTDI"
          "idVendor" = 1027
          "kUSBCurrentConfiguration" = 1
          "IOGeneralInterest" = "IOCommand is not serializable"
          "IOClassNameOverride" = "IOUSBDevice"
        }
  • WebUSB 兼容设备:
    +-o Emit eScan@14200000  <class AppleUSBDevice, id 0x10000d0d8, registered, matched, active, busy 0 (10 ms), retain 23>
        {
          "sessionID" = 210198267509902
          "iManufacturer" = 1
          "bNumConfigurations" = 1
          "idProduct" = 768
          "bcdDevice" = 274
          "Bus Power Available" = 250
          "USB Address" = 31
          "bMaxPacketSize0" = 8
          "iProduct" = 2
          "iSerialNumber" = 3
          "bDeviceClass" = 2
          "Built-In" = No
          "locationID" = 337641472
          "bDeviceSubClass" = 0
          "bcdUSB" = 512
          "USB Product Name" = "Emit eScan"
          "PortNum" = 2
          "non-removable" = "no"
          "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
          "bDeviceProtocol" = 0
          "IOUserClientClass" = "IOUSBDeviceUserClientV2"
          "IOPowerManagement" = {"DevicePowerState"=0,"CurrentPowerState"=4,"CapabilityFlags"=32768,"MaxPowerState"=4,"DriverPowerState"=4}
          "IOBusyInterest" = "IOCommand is not serializable"
          "Device Speed" = 1
          "USB Vendor Name" = "EMIT AS"
          "idVendor" = 8263
          "kUSBCurrentConfiguration" = 1
          "IOGeneralInterest" = "IOCommand is not serializable"
          "USB Serial Number" = "0969395112001500"
          "IOClassNameOverride" = "IOUSBDevice"
        }
javascript serial-port webusb serialapi
1个回答
4
投票

什么决定了连接 USB 插头的设备是否与 Serial API 或 WebUSB API 兼容?

这取决于所使用的驱动程序和设备。有些设备通过 USB 进行通信,而其他设备则使用 USB 之上的串行协议。

在 MacOS 上,如果设备没有安装驱动程序(即内核/驱动程序扩展),则将使用默认的 USB 驱动程序,您可以使用 WebUSB(但不能使用 Web 串行)访问它。如果设备使用 USB 之上的串行协议,您可以编写自己的用户空间串行驱动程序。

在 Windows 上,如果设备未指定特殊的 Microsoft 操作系统描述符,则不会加载默认 USB 驱动程序,因此在大多数情况下您必须安装驱动程序才能与设备通信。

这是否取决于我的计算机上有哪些驱动程序?例如。这可能与 USB CDC(我在研究中经常偶然发现)和驱动程序有关吗?

是的,CDC-ACM 是一种驱动程序。还有各种其他 USB 串行芯片(例如 FTDI、Prolific、SiLabs、TI),每个芯片都有自己的 USB 串行驱动程序。

您还有一些使用 USB 上的 HID 的设备,您需要使用 WebHID API 与它们通信。

同一个设备可以在一台计算机上兼容WebUSB,但在另一台计算机上兼容Serial API吗?例如。取决于可用的驱动程序或主机操作系统?

是的,完全正确。如果您知道您的目标设备具有特定芯片,例如Prolific PL2303,您可以首先尝试通过 Web 串行连接到它。如果失败,您可以退回到 WebUSB 并使用在 WebUSB 之上运行的用户空间串行驱动程序连接到它。

如果我使用了其他编程环境,例如使用 C 编写本机程序,然后我可以自由选择使用“串行方式”还是 USB 协议与特定设备进行通信?

其实不然。您的本机程序还取决于安装的驱动程序。不同之处在于,用于安装本机程序的安装程序还可以安装必要的驱动程序。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.