WebUSB和Web串行API都可以用来与连接到计算机上的设备进行通信,设备可以通过网络浏览器的USB插头进行通信。
我对用硬件/微控制器编程完全陌生(以前只有网络开发),但我已经广泛地尝试去找出一个设备是否可以被这两个API-中的哪一个读取。大写串行总线毕竟是串行的,不是吗?!因此,我的问题如下:
如果它能启发前面的问题,下面是我探索USB的故事:
我有来自同一制造商的两种不同类型的设备(两种设备都用于读取用于赛跑计时的电子标签),在Chrome浏览器中,一种出现在Serial的弹出窗口中,另一种出现在为两个API实现基本功能时出现在弹出的WebUSB中。在串行API中,我可以通过流API发送和接收字节与之通信,但我需要通过大量传输来通信的WebUSB。在Serial传输中,我似乎从未丢失过数据,但在WebUSB中的批量传输中,如果拉得不够快,我似乎会丢失数据(也就是说,在再次提取之前对已经提取的数据进行大量处理)。因此,它们在我看来都是相当“连续”的,这让我感到困扰的是,我不能同时使用SerialAPI (而且我也不明白为什么),这似乎更可靠,并且使用了方便的Streams。
我在OSX上(10.14.6)。
当我对这两个设备执行ioreg -l -p IOUSB时,结果是:
+-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"
} +-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"
}发布于 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协议与特定设备自由通信吗?
不怎么有意思。您的本机程序也将取决于所安装的驱动程序。不同的是,用于安装本机程序的安装程序也可以安装必要的驱动程序。
https://stackoverflow.com/questions/63327407
复制相似问题