C# Linux/Mono中通过USB控制传输的错误数据

C# Linux/Mono中通过USB控制传输的错误数据,c#,mono,usb,libusb-1.0,libusbdotnet,C#,Mono,Usb,Libusb 1.0,Libusbdotnet,我们这里有一个USB设备,上面有一个EZ-USB FX芯片,我们通过libusb-1.0使用LibUsbDotNet与之“交谈”。使用Windows一切正常,但在Ubuntu 14.04下使用Mono3.12.1是行不通的。我做了一些调查和测试,发现它不能初始化设备,我们使用以下逻辑(这是从我的测试程序,但“真正的逻辑”是等效的): 然后,我使用USB分析器分析通过USB端口发送的命令。 使用Windows,我可以获得以下信息: 这是正确的,正如您所看到的,可以使用设备重置,但在使用Linux

我们这里有一个USB设备,上面有一个EZ-USB FX芯片,我们通过
libusb-1.0
使用
LibUsbDotNet
与之“交谈”。使用Windows一切正常,但在Ubuntu 14.04下使用Mono3.12.1是行不通的。我做了一些调查和测试,发现它不能初始化设备,我们使用以下逻辑(这是从我的测试程序,但“真正的逻辑”是等效的):

然后,我使用USB分析器分析通过USB端口发送的命令。
使用Windows,我可以获得以下信息:
这是正确的,正如您所看到的,可以使用设备重置,但在使用Linux时,我得到以下信息: 现在,命令不再发送
01
00
,而是发送
68
A8
,因此设备不做任何操作


有人知道这是什么原因吗?为什么它在Linux下发送了错误的数据包?

这似乎是LibUsbDotNet的一个Bug(很可能是一个Bug),因为当前的
主干(v2.2.9)的构建确实解决了这个问题

protected bool ResetDevice(UsbDevice Device)
{
    Console.WriteLine("First ensure that the EZ-USB 8051 is RESET (CPUCS=1)");
    if (!ControlTransfer(Device, new byte[] { 1 }))
        return false;

    Console.WriteLine ("Then allow the EZ-USB CPU to 're-enumerate' (CPUCS=0)");
    if (!ControlTransfer(Device, new byte[] { 0 }))
        return false;

    Console.WriteLine("Reset done...");
    return true;
}

public bool ControlTransfer(UsbDevice Device, byte[] data, short? value = null)
{
    int written;
    var setupPacket = SetupPacket(value);
    return Device.ControlTransfer(ref setupPacket, data, data.Length, out written);
}
internal UsbSetupPacket SetupPacket(short? value = null)
{
    var controlPacket = new UsbSetupPacket();
    controlPacket.Request = 0xA0;
    controlPacket.RequestType = 64;
    controlPacket.Value = value ?? 0x07F92;
    controlPacket.Index = 0;

    return controlPacket;
}