【问题标题】:How to send vendor specific commands like "SET DATE TIME" to a usb device如何将供应商特定的命令(如“设置日期时间”)发送到 USB 设备
【发布时间】:2017-01-03 07:37:13
【问题描述】:

我在 C# 应用程序中使用 libusbdotnet 与 USB 设备进行通信。如何使用 libusbdotnet 向供应商提供特定命令,例如 SET DATE TIME

【问题讨论】:

  • 这个问题的目的是什么?是否要通过插入 USB 设备来更改系统配置?
  • 不。我必须从我的应用程序向 USB 设备发出命令。

标签: c# usb libusbdotnet


【解决方案1】:

就 USB 协议供应商而言,特定请求是常见请求(请参阅 http://www.cypress.com/file/202971/download - 使用 FX2LP 创建您自己的 USB 供应商命令),您可能会使用 控制传输 如果将请求发送到设备的 控制端点 EP0 就足够了。您必须深入了解设备的内部结构才能使其工作,您必须知道必须向设备结构中的哪个端点发出请求以及必须在请求数据包的字段中放置哪些值: address, bmRequestType, bRequest, (endpoint number),... 如果供应商特定请求不能被发送到控制端点你不能使用控制传输(http://www.beyondlogic.org/usbnutshell/usb4.shtml#Control)。

有关 USB 请求的一般信息在 http://www.beyondlogic.org/usbnutshell/usb6.shtml 中,有关供应商特定请求的信息例如在 http://www.cypress.com/file/202971/download 中 - 使用 FX2LP 创建您自己的 USB 供应商命令

控制传输的libusbdotnet方法是

public virtual bool ControlTransfer( ref UsbSetupPacket setupPacket, Object buffer, int bufferLength, out int lengthTransferred )

你必须自己构建setupPacket,参见http://www.beyondlogic.org/usbnutshell/usb6.shtml

http://libusbdotnet.sourceforge.net/V2/html/65fd96b8-6c8f-f877-22a5-15074d922485.htm

您可以使用 libusb 执行如下控制传输:

  • 在同步 I/O int libusb_control_transfer (libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout) 中无法寻址到特定端点,转到 EP0

  • 在异步 I/O 中 libusb_control_setup (libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout) 无法寻址到特定端点,转到 EP0,并且没有数据部分,这意味着它仅在控制传输中构建设置数据包(控制传输包括设置阶段,数据阶段,状态阶段) (http://libusb.org/static/api-1.0/structlibusb__control__setup.html)

如果您必须将请求发送到特定端点(不是控制端点),您可以使用 bulk transferinterrupt_transfer

http://libusb.sourceforge.net/api-1.0/group__syncio.htmlhttp://libusb.org/static/api-1.0/group__misc.html 中列出了 libusb 中可用的标准 USB 请求

【讨论】:

  • 感谢您的回答..另外我想了解libusbdotnet中是否有任何功能,如下所示******************** ****************************************************** *********** usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout)
  • 此链接中的libusbdotnet.sourceforge.net/V2/html/… 是一个示例。您必须对其进行调整,因为它仅适用于在配置 1、接口 0、端点 0x01 和 0x81 中具有环回功能的设备。
  • 批量读取(从设备到主机的数据流)来自批量端点 IN,批量写入(主机到设备)来自批量端点 OUT
  • 如果您想接受这个答案,请不要投票,因为我正在尝试获得徽章
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2012-05-28
  • 2016-10-10
  • 2017-10-03
  • 2019-08-08
相关资源
最近更新 更多