c# - ControlTransfer 指令未从 LibUsbDotNet 中的设置打包器发送值参数

标签 c# .net usb libusb

我有一个 USB 设备,我需要能够与 .net 应用程序通信。该设备不是标准的 HID 设备,为了初始化它,我从 USB 协议(protocol)分析器/嗅探器获得了一些数据包痕迹,用于在另一种类型的机器上初始化它时使用的数据包。我需要从我的 .net 应用程序复制这个数据包序列来初始化设备。

在我收到特定的控制传输数据包/类类型请求之前,一切都运行良好。

我得到的跟踪表明我应该发布:

Control Transfer Class Type Request 
21 0A 00 00 00 00 00 00 
Result stall (intentional)

Control Transfer Class Tyoe Request
A1 01 01 03 00 00 40 00 
Result will initiate a 64 byte transfer of data from the device to the host.

这是我用来执行此操作的代码:

                // Transcation 6
                UsbSetupPacket setup = new UsbSetupPacket(0x21, 0x0A, 0, 0, 0);
                bool result = MyUsbDevice.ControlTransfer(ref setup, buffer, 0, out transferred);
                Console.WriteLine("Result = {0}", result);

                // Transcation 7
                setup = new UsbSetupPacket(0xA1, 0x01, 0x0301, 0x0000, 0x0040);
                result = MyUsbDevice.ControlTransfer(ref setup, buffer, 64, out transferred);

                Console.WriteLine("Result = {0}, {1}", result, transferred);

这是我从 BusHound 收到的跟踪信息,它正在嗅探此设备的 USB 数据流量:

Device  Phase  Data                      Description       Cmd.Phase.Ofs(rep)
------  -----  ------------------------  ----------------  ------------------
  46.0  CTL    21 0a 00 00  00 00 00 00  SET IDLE                20.1.0        
  46.0  USTS   c0000004                  stall pid               20.2.0        
  46.0  CTL    a1 01 01 03  00 00 00 00  GET REPORT              21.1.0        
  46.1  USTS   c0000004                  stall pid               22.1.0        

如您所见,即使我正在设置它,设置数据包中的 0x0040 值参数也没有成功。我对 USB 和 .net/LibUsbDotNet 比较陌生,我不太确定自己做错了什么。我想知道是否有人可以建议我尝试什么?

请注意,我正在使用 Visual Studio 2008 在 Windows 7 64 位计算机上进行开发。

谢谢, 丰富

最佳答案

好吧,经过大量调查,我找到了问题的根源,这实际上是我对 LibUSBDotNet 的工作原理缺乏了解,而这个优秀库的糟糕文档也无济于事。

问题是 0x0040 不应在设置数据包中手动指定 - 这个值似乎无关紧要。相反,只需在 ControlTransfer 方法中指定要传输的字节,并确保缓冲区是一个预先分配的适当大字节数组,例如:

byte[] buffer = new byte[256];
setup = new UsbSetupPacket(0xA1, 0x01, 0x0301, 0x0000, 0x0000); 
result = MyUsbDevice.ControlTransfer(ref setup, buffer, 0x0040, out transferred); 

这将生成发送到 USB 设备的正确控制传输数据包

Control Transfer Class Tyoe Request   
A1 01 01 03 00 00 40 00   

看起来 LibUsbDotNet 对各种参数做了一些验证,在缓冲区数组不够大的情况下,它只是发送其他内容(在我的例子中是 0x0000)而不是抛出适当的异常。

关于c# - ControlTransfer 指令未从 LibUsbDotNet 中的设置打包器发送值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862740/

相关文章:

库项目中的.Net app.config

c# - 有没有办法以编程方式获取任意 MemberInfo 的源文件和行号?

java - 如何连接带有RS323C接口(interface)的PC?

c# - "Nullable object must have a value"当Where使用方法时?

c# - Protobuf.net 内存使用

c# - 减少向三个表发送信息所需的 SqlCommand 数量

c++ - MFC C++ 通过 WM_DEVICECHANGE 通知区分两个设备

c# - 检索字典值最佳实践

.net - 您会在新的商业项目中使用 S#arp 架构吗?

linux - 查找带有 USB 设备 VID/PID 的/dev 条目