javascript - WebUSB API 与串行 API

标签 javascript serial-port webusb serialapi

两个WebUSBWeb Serial API可用于与通过 Web 浏览器通过 USB 插头连接到计算机的设备进行通信。
我对使用硬件/微 Controller 进行编程(之前只有 Web 开发)是全新的,但我已经广泛尝试找出决定设备是否可以被两个 API 中的哪一个读取的因素。通用串行总线毕竟是串行的,不是吗?!所以我的问题如下:

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

  • 如果能启发前面的问题,下面是我的USB探索故事:
    我有来自同一制造商的两种不同类型的设备(都用于读取用于在运行比赛中计时的电子标签),其中在 Chrome 浏览器中,一个出现在串行 API 的弹出窗口中,另一个出现在 WebUSB 的弹出窗口中,当实现基本两个 API 的功能。我可以通过 Streams API 发送和接收字节来与之通信的串行 API 中的那个。 ,但我需要通过批量传输进行通信的 WebUSB。在串行 API 传输中,我似乎永远不会丢失数据,但在 WebUSB 中的批量传输中,如果我拉得不够快,我似乎会丢失数据(即在再次拉取之前对已经提取的数据进行大量处理)。所以它们对我来说似乎都很“串行”,我不能同时使用 SerialAPI(而且我不明白为什么)这让我很困扰,这似乎更可靠并且使用方便的 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"
            }
    

    最佳答案

    What determines if a device that is connected with a USB plug is compatible with the Serial API or WebUSB API?


    这取决于驱动程序和使用的设备。一些设备通过 USB 进行通信,而其他设备使用 USB 之上的串行协议(protocol)。
    在 MacOS 上,如果没有为设备安装驱动程序(即内核/驱动程序扩展),将使用默认 USB 驱动程序,您可以使用 WebUSB(但不能使用 Web Serial)访问它。如果设备在 USB 之上使用串行协议(protocol),您可以编写自己的用户空间串行驱动程序。
    在 Windows 上,如果设备未指定特殊的 Microsoft OS 描述符,则不会加载默认 USB 驱动程序,因此在大多数情况下,您必须安装驱动程序才能与设备通信。

    Can this depend on which drivers I have on my computer? E.g. can this have something to do with USB CDC (which I frequently seem to stumble upon in my research) and a driver for this?


    是的,CDC-ACM 是一种驱动程序。还有各种其他 USB 串行芯片(例如 FTDI、Prolific、SiLabs、TI),它们都有自己的 USB 串行驱动程序。
    您还有一些使用 HID over USB 的设备,您需要在其中使用 WebHID API 与它们通信。

    Can the same device be compatible with WebUSB on one computer, but Serial API on another? E.g. depending on available drivers or the host OS?


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

    If I had used another programming environment, e.g. used C to write a native program, could I then choose freely to communicate with a particular device with either the "serial way" to do it or the USB protocol?


    并不真地。您的 native 程序还取决于已安装的驱动程序。不同之处在于用于安装 native 程序的安装程序也可以安装必要的驱动程序。

    关于javascript - WebUSB API 与串行 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63327407/

    相关文章:

    javascript - 由于 header 导致 scrollto 偏移 javascript 的问题

    embedded - 位被扰乱

    javascript - WebUSB 按 deviceClass 和 deviceSubClass 过滤

    javascript - webUSB api 工作但接收到的数据未正确解码

    reactjs - 带有 webusb 的指纹扫描仪

    javascript - 取消按钮与 jQuery 加载事件的行为不正确

    javascript - 'variable1/variable2 = NaN' 其中两个变量都是数字 2

    javascript - JQuery选择没有id的内部元素

    Python将字符串转换为字节

    python - 使用Python通过串口发送文件