首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebUSB API与串行API

WebUSB API与串行API
EN

Stack Overflow用户
提问于 2020-08-09 14:18:10
回答 1查看 1.8K关注 0票数 4

WebUSBWeb串行API都可以用来与连接到计算机上的设备进行通信,设备可以通过网络浏览器的USB插头进行通信。

我对用硬件/微控制器编程完全陌生(以前只有网络开发),但我已经广泛地尝试去找出一个设备是否可以被这两个API-中的哪一个读取。大写串行总线毕竟是串行的,不是吗?!因此,我的问题如下:

  • 如何确定与USB插头连接的设备是否与Serial或WebUSB API兼容?
  • 这取决于我电脑上的驱动程序吗?这与USB (我在研究中经常遇到的)和驱动这件事有关吗?
  • 同一设备能否与一台计算机上的WebUSB兼容,而在另一台计算机上兼容串行API?例如,取决于可用的驱动程序还是主机操作系统?
  • 如果我使用了另一个编程环境,例如使用C编写本机程序,那么我可以选择使用“串行方式”或USB协议与特定设备自由通信吗?

如果它能启发前面的问题,下面是我探索USB的故事:

我有来自同一制造商的两种不同类型的设备(两种设备都用于读取用于赛跑计时的电子标签),在Chrome浏览器中,一种出现在Serial的弹出窗口中,另一种出现在为两个API实现基本功能时出现在弹出的WebUSB中。在串行API中,我可以通过流API发送和接收字节与之通信,但我需要通过大量传输来通信的WebUSB。在Serial传输中,我似乎从未丢失过数据,但在WebUSB中的批量传输中,如果拉得不够快,我似乎会丢失数据(也就是说,在再次提取之前对已经提取的数据进行大量处理)。因此,它们在我看来都是相当“连续”的,这让我感到困扰的是,我不能同时使用SerialAPI (而且我也不明白为什么),这似乎更可靠,并且使用了方便的Streams。

我在OSX上(10.14.6)。

当我对这两个设备执行ioreg -l -p IOUSB时,结果是:

  • 串行API兼容设备:
代码语言:javascript
复制
    +-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兼容设备:
代码语言:javascript
复制
    +-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"
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 09:00:23

如何确定与USB插头连接的设备是否与Serial或WebUSB API兼容?

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

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

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

这取决于我电脑上的驱动程序吗?这与USB (我在研究中经常遇到的)和驱动这件事有关吗?

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

您也有一些设备使用,在这些设备中,您需要使用WebHID API来与它们交谈。

同一设备能否与一台计算机上的WebUSB兼容,而在另一台计算机上兼容串行API?例如,取决于可用的驱动程序还是主机操作系统?

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

如果我使用了另一个编程环境,例如使用C编写本机程序,那么我可以选择使用“串行方式”或USB协议与特定设备自由通信吗?

不怎么有意思。您的本机程序也将取决于所安装的驱动程序。不同的是,用于安装本机程序的安装程序也可以安装必要的驱动程序。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63327407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档