【问题标题】:How to read data from a usb peripheral?如何从 USB 外围设备读取数据?
【发布时间】:2015-10-09 00:09:39
【问题描述】:

我捡起一个即将被扔掉的wii架子鼓。它有一个 USB 端口,我想将它连接到我的 macbook 以进行项目。我的目标基本上是能够检测到何时在设备上敲击了某个鼓。根据我目前收集到的信息,我需要执行以下步骤:

  1. 连接设备并确定它在哪个 tty 端口
  2. 使用“screen”命令打印来自鼓的数据
  3. 将屏幕命令中的数据输出到一些代码中,为我的项目生成有用的输出

我想我了解如何执行第 2 步和第 3 步,但我对第 1 步感到困惑。

如果我在终端运行“ioreg -Src IOUSBDevice”,我可以识别设备已连接,但我不知道它在哪个 tty 端口上。 (见下文输出)

此外,一般来说,是否可以从任何连接到 USB 端口的 USB 外围设备将数据打印为字节流?

编辑:我应该补充一点,如果我运行“ls /dev/tty.*”,我看不到任何 tty.usb 项目,只有 tty.bluetooth 的东西。

+-o Harmonix Drum Controller for Nintendo Wii@14200000  <class IOUSBDevice, id $
  | {
  |   "sessionID" = 2111009401078
  |   "iManufacturer" = 1
  |   "bNumConfigurations" = 1
  |   "idProduct" = 5
  |   "bcdDevice" = 4096
  |   "Bus Power Available" = 250
  |   "bMaxPacketSize0" = 64
  |   "USB Product Name" = "Harmonix Drum Controller for Nintendo Wii"
  |   "iProduct" = 2
  |   "iSerialNumber" = 0
  |   "USB Address" = 4
  |   "bDeviceClass" = 0
  |   "locationID" = 337641472
  |   "bDeviceSubClass" = 0
  |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
  |   "PortNum" = 2
  |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.$
  |   "bDeviceProtocol" = 0
  |   "USB Vendor Name" = "Licensed by Nintendo of America "
  |   "Device Speed" = 1
  |   "idVendor" = 7085
  |   "Requested Power" = 50
  |   "IOGeneralInterest" = "IOCommand is not serializable"
  |   "Low Power Displayed" = No
  | }
  | 
  +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000ebe, !regis$
  +-o IOUSBInterface@0  <class IOUSBInterface, id 0x100000ebf, registered, matc$
+-o IOUSBHIDDriver  <class IOUSBHIDDriver, id 0x100000ec2, registered, matc$
  +-o IOHIDInterface  <class IOHIDInterface, id 0x100000ec4, registered, ma$
  +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x100000ec5, !regis$
  +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x100000ec7, !regis$

到目前为止,

【问题讨论】:

  • 在此期间您有没有找到一种方法来做到这一点?我也在拼命寻找这个。

标签: macos terminal usb driver device


【解决方案1】:

我没有您正在寻找的确切答案,但我在尝试从连接到我的 MacBook Pro 的 GPS 设备中读取数据时遇到了类似的问题。就我而言,发出命令后:

ioreg -w0 -l -p IOUSB 

我有(剪掉不相关的部分):

  +-o u-blox 7 - GPS/GNSS Receiver@14110000  <class IOUSBDevice, id 0x1000026b0, registered, matched, active, busy 0 (60 ms), retain 12>
  |   {
  |     "sessionID" = 17488341785377
  |     "idProduct" = 423
  |     "bNumConfigurations" = 1
  |     "iManufacturer" = 1
  |     "bcdDevice" = 256
  |     "Bus Power Available" = 250
  |     "bMaxPacketSize0" = 64
  |     "USB Product Name" = "u-blox 7 - GPS/GNSS Receiver"
  |     "iProduct" = 2
  |     "iSerialNumber" = 0
  |     "USB Address" = 12
  |     "IOUserClientClass" = "IOUSBDeviceUserClientV2"
  |     "bDeviceSubClass" = 0
  |     "bDeviceClass" = 2
  |     "bcdUSB" = 272
  |     "locationID" = 336658432
  |     "PortNum" = 1
  |     "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
  |     "bDeviceProtocol" = 0
  |     "USB Vendor Name" = "u-blox AG - www.u-blox.com"
  |     "Device Speed" = 1
  |     "idVendor" = 5446
  |     "Requested Power" = 50
  |     "IOGeneralInterest" = "IOCommand is not serializable"
  |     "Low Power Displayed" = No
  |   }
  |   

这并不能说明设备分配给了哪个tty.*,所以我所做的是在拔下设备之前和之后的ls /dev/tty.*。通过这样做,我意识到终端/dev/tty.usbmodem14111 消失了。也许您的情况下没有tty.usbmodem*,但请注意14111 部分,它与我的设备的ioreg 行的第一部分部分重合(u-blox 7 - GPS/GNSS Receiver@14110000)。也许您可以在您的情况下使用此提示来查看您是否发现了 tty 设备。

如果您找到更“通用”的方式来发现tty,请分享!祝你好运!

【讨论】:

    【解决方案2】:

    您的架子鼓似乎被识别为 HID 设备,而不是串行端口/TTY。 OSX 具有用户空间 HID 事件 API,可让您检查报告描述符并捕获 HID 报告,即事件。查看IOHIDDeviceGetReportWithCallback。或者,HID transaction API 可能更易于使用,因为它为您处理解析报告和描述符的杂乱事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多