C# ControlTransfer指令未从LibUsbDotNet中的安装包发送值参数

C# ControlTransfer指令未从LibUsbDotNet中的安装包发送值参数,c#,.net,usb,libusb,C#,.net,Usb,Libusb,我有一个USB设备,我需要能够从.net应用程序与之通信。该设备不是标准的HID设备,为了初始化它,我从USB协议分析器/嗅探器获得了一个数据包跟踪,用于在另一种类型的机器上初始化它时使用的数据包。我需要从.net应用程序复制此数据包序列以初始化设备 在我得到一个特定的控制传输包/类类型请求之前,一切都正常工作 我得到的跟踪说明我应该发布: Control Transfer Class Type Request 21 0A 00 00 00 00 00 00 Result stall (in

我有一个USB设备,我需要能够从.net应用程序与之通信。该设备不是标准的HID设备,为了初始化它,我从USB协议分析器/嗅探器获得了一个数据包跟踪,用于在另一种类型的机器上初始化它时使用的数据包。我需要从.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收到的跟踪,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位计算机上开发

谢谢,
Rich

好的,经过大量调查,我找到了问题的根源,这确实是因为我对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),而不是抛出一个适当的异常。

我很确定我知道你在这里有跟踪的设备是什么。。。你愿意和我分享吗?