C# LibUsbDotNet UsbDevice.ControlTransfer挂起

C# LibUsbDotNet UsbDevice.ControlTransfer挂起,c#,windows,usb,libusb,C#,Windows,Usb,Libusb,我有一个C#.Net Winforms应用程序,它使用LibUsbDotNet将固件编程到USB设备(Atmel AVR32),使用“DFU#U DNLOAD”传输,这是一种特殊的控制传输。这一切都是可行的,但是:一种特定的传输,它导致设备擦除其内部闪存,无法在正确的时间内发送ACK 当这种情况发生时,我的LibUsbDotNet连接将无法修复地断开,这将导致一切失败 我的代码执行以下操作: int TransferToDevice(byte request, short value, byte

我有一个C#.Net Winforms应用程序,它使用LibUsbDotNet将固件编程到USB设备(Atmel AVR32),使用“DFU#U DNLOAD”传输,这是一种特殊的控制传输。这一切都是可行的,但是:一种特定的传输,它导致设备擦除其内部闪存,无法在正确的时间内发送ACK

当这种情况发生时,我的LibUsbDotNet连接将无法修复地断开,这将导致一切失败

我的代码执行以下操作:

int TransferToDevice(byte request, short value, byte[] data)
{
  var setup = new UsbSetupPacket(
                (byte)(UsbCtrlFlags.Direction_Out | UsbCtrlFlags.RequestType_Class | UsbCtrlFlags.Recipient_Interface),
                request,
                value,
                0,
                (short)data.Length);

  int n;
  IntPtr unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(data.Length);
  System.Runtime.InteropServices.Marshal.Copy(data, 0, unmanagedPointer, data.Length);
  // UsbDevice obtained else-where
  if (!UsbDevice.ControlTransfer(ref setup, unmanagedPointer, data.Length, out n))
  {
    n = 0;
  }
  System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
  return n;
}

// In order to do a "DFU_DNLOAD", the method above is used as follows:
TransferToDevice(DFU_DNLOAD, Transactions++, data); // "data" is the payload
// where DFU_DNLOAD is:
private const byte DFU_DNLOAD    = 1;
// Transactions is 
short Transaction = 0;
上述代码正常工作(设备正确接收“DFU_DNLOAD”消息),但问题在于缺少ACK。一旦发生错误,每次尝试与设备通信(即使我尝试重新初始化所有内容)都会失败,直到设备断开连接并重新插入


我想能够重置或重新初始化USB连接不知何故,当这个错误发生。目前,我只能通过退出应用程序并手动重新启动它来重新与设备建立通信。

只是猜测,但如果数据数组较短,则应调整缓冲区的大小

int numberOfValues = data.Length;
int size = Marshal.SizeOf(typeof(short)); 

IntPtr unmanagedPointer = Marshal.AllocHGlobal(numberOfValues*size);

if (unmanagedPointer == IntPtr.Zero)
    throw new OutOfMemoryException("Unable allocate memory");

这一问题从未得到满意的解决,最终使用纯C在LibUSB的p上实现了我自己的“DFU”协议,并对其进行了p/Invoke,完全避免了LibUsbDotNet。。。此解决方案似乎有效。

我编辑了显示的代码,以澄清您的建议不是问题所在。我相当确信这个问题不是由逻辑错误引起的。主要问题是:一旦出现错误,我似乎无法将LibUsbDotNet重置为“重新开始”…这是一个很好的故事。你有什么问题吗?补充了一个关于我想做什么的结束语。