首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibUsbDotNet UsbDevice.ControlTransfer挂起

LibUsbDotNet UsbDevice.ControlTransfer挂起
EN

Stack Overflow用户
提问于 2012-10-11 22:22:54
回答 2查看 1.5K关注 0票数 3

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

当这种情况发生时,我的LibUsbDotNet连接就会不可修复地断开,从而导致一切都失败了。

我的代码执行以下操作:

代码语言:javascript
复制
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“消息),但是缺少确认是问题所在。一旦发生错误,每次尝试与设备通信(即使我尝试重新初始化所有内容)都会失败,直到设备断开连接并重新插入...

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-26 11:08:15

只是猜测,但如果数据是短整型数组,那么缓冲区的大小应该调整

代码语言:javascript
复制
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");
票数 0
EN

Stack Overflow用户

发布于 2013-02-22 23:02:15

这个问题从来没有得到令我满意的解决,最终使用纯C语言在LibUSB上实现了我自己的"DFU“协议,并对此进行了P/Invoke,完全避免了LibUsbDotNet……这个解决方案似乎起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12841794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档