LibUsbDotNet UsbDevice.ControlTransfer挂起

我有一个C#.Net Winforms应用程序,它使用LibUsbDotNet使用“DFU_DNLOAD”传输将固件编程到USB设备(Atmel AVR32),这是一种特殊的控制传输。 这一切都有效,但是:一种特殊的传输方式会导致设备擦除其内部闪存,但无法在正确的时间内发送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”消息),但缺lessACK是问题。 一旦发生错误,每次尝试与设备通信(即使我试图重新初始化所有内容)都会失败,直到设备断开连接并重新插入。

我希望能够在出现此错误时以某种方式重置或重新初始化USB连接。 目前我只能通过退出我的应用程序重新build立与设备的通信,并手动重新启动。

只是猜测,但如果数据是短阵列,应该调整缓冲区的大小

 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实现我自己的“DFU”在LibUSB上的协议,P / Invoke,完全避免LibUsbDotNet …这种解决方案似乎工作。