簡體   English   中英

WebUSB API 與串行 API

[英]WebUSB API vs Serial API

WebUSBWeb Serial API都可用於通過 ZC348CCE836 瀏覽器與通過 Z7ACA5EC618F7317328DCD7014CF9BDZCFZ 插頭連接到計算機的設備進行通信。

我對使用硬件/微控制器進行編程是全新的(之前只有 web 開發),但我已經廣泛嘗試找出決定設備是否可以被兩個 API 中的哪一個讀取的因素。 通用串行總線畢竟是串行的,不是嗎?:所以我的問題如下:

  • 什么決定了與 USB 插頭連接的設備是否與串行 API 或 WebUSB API 兼容?
  • 這是否取決於我的計算機上有哪些驅動程序? 例如,這可能與 USB CDC(我似乎經常在研究中偶然發現)和驅動程序有關嗎?
  • 同一設備能否在一台計算機上與 WebUSB 兼容,而在另一台計算機上與 Serial API 兼容? 例如,取決於可用的驅動程序或主機操作系統?
  • 如果我使用了另一種編程環境,例如使用 C 編寫本機程序,那么我是否可以自由選擇使用“串行方式”或 USB 協議與特定設備進行通信?

如果能啟發前面的問題,下面是我的USB探索故事:

我有來自同一制造商的兩種不同類型的設備(都用於讀取用於在跑步比賽中計時的電子標簽),在 Chrome 瀏覽器中,一個出現在 Serial API 的彈出窗口中,另一個出現在 WebUSB 的彈出窗口中,當實現基本兩個 API 的功能。 串行 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"
        }

什么決定了與 USB 插頭連接的設備是否與串行 API 或 WebUSB API 兼容?

這取決於驅動程序和使用的設備。 一些設備通過 USB 進行通信,而其他設備在 USB 之上使用串行協議。

在 MacOS 上,如果沒有為設備安裝驅動程序(即內核/驅動程序擴展),將使用默認的 USB 驅動程序,您可以使用 WebUSB 訪問它(但不是 Web Serial)。 如果設備在 USB 之上使用串行協議,您可以編寫自己的用戶空間串行驅動程序。

在 Windows 上,如果設備未指定特殊的 Microsoft OS 描述符,則不會加載默認的 USB 驅動程序,因此在大多數情況下,您必須安裝驅動程序才能與設備通信。

這是否取決於我的計算機上有哪些驅動程序? 例如,這可能與 USB CDC(我似乎經常在研究中偶然發現)和驅動程序有關嗎?

是的,CDC-ACM 是一種驅動程序。 還有各種其他 USB 串行芯片(例如 FTDI、Prolific、SiLabs、TI),它們都有自己的 USB 串行驅動程序。

您還有一些使用 HID over USB 的設備,您需要使用 WebHID API 與它們對話。

同一設備能否在一台計算機上與 WebUSB 兼容,而在另一台計算機上與 Serial API 兼容? 例如,取決於可用的驅動程序或主機操作系統?

對,就是這樣。 如果您知道您的目標設備有一個特定的芯片,例如 Prolific PL2303,您可以首先嘗試通過 Web Serial 連接到它。 如果失敗,您可以回退到 WebUSB 並使用運行在 WebUSB 之上的用戶空間串行驅動程序連接到它。

如果我使用了另一種編程環境,例如使用 C 編寫本機程序,那么我是否可以自由選擇使用“串行方式”或 USB 協議與特定設備進行通信?

並不真地。 您的本機程序還取決於已安裝的驅動程序。 不同之處在於用於安裝本機程序的安裝程序也可以安裝必要的驅動程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM