在WPF应用程序中使用USB设备,我可以成功连接并发送命令到设备。设备只接收命令,没有回复,所以我只需要一个EndpointWriter来与它通信。
MyUsbFinder = new UsbDeviceFinder(vid, pid);
MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
wholeUsbDevice = MyUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
wholeUsbDevice.SetConfiguration(1);
wholeUsbDevice.ClaimInterface(0);
}
writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);
接着是写入设备的过程:
byte[] update = { some bytes };
int bytesWritten;
if (MyUsbDevice != null)
{
ec = writer.Write(update, 2000, out bytesWritten);
}
除了在工作过程中USB设备被断开并重新连接之外,一切都很正常。该应用程序成功处理了这种情况,并重新连接到设备,继续成功发送命令:
public bool reconnect()
{
//clear the info so far
if (MyUsbDevice != null)
{
writer.Dispose();
wholeUsbDevice.ReleaseInterface(0);
wholeUsbDevice.Close();
MyUsbDevice.Close();
UsbDevice.Exit();
}
//now start over
MyUsbFinder = new UsbDeviceFinder(vid, pid);
MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
当我断开/重新连接后关闭应用程序时,出现了问题。虽然该程序在与设备成功通信了相当长时间,但在退出时会出现以下异常:
System.ObjectDisposedException was unhandled
Message="Safe handle has been closed"
Source="mscorlib"
ObjectName=""
StackTrace:
at System.StubHelpers.StubHelpers.SafeHandleC2NHelper(Object pThis, IntPtr pCleanupWorkList)
at LibUsbDotNet.Internal.Kernel32.GetOverlappedResult(SafeHandle hDevice, IntPtr lpOverlapped, Int32& lpNumberOfBytesTransferred, Boolean bWait)
at LibUsbDotNet.Internal.LibUsb.LibUsbAPI.GetOverlappedResult(SafeHandle interfaceHandle, IntPtr pOverlapped, Int32& numberOfBytesTransferred, Boolean wait)
at LibUsbDotNet.Internal.OverlappedTransferContext.Wait(Int32& transferredCount, Boolean cancel)
at LibUsbDotNet.Main.UsbTransfer.Wait(Int32& transferredCount)
at LibUsbDotNet.Main.UsbTransfer.Dispose()
at LibUsbDotNet.Main.UsbTransfer.Finalize()
InnerException:
我尝试了许多不同的Dispose和Exit方法来关闭usb设备和endpointwriter,但是迄今为止没有成功。我猜测在断开连接之前仍有一些东西保持打开状态,所以我会得到这个错误,但我不确定是什么并且也不知道如何处理。
由于这种情况只发生在关闭应用程序时,因此我甚至愿意忽略异常并让应用程序自行崩溃,但我不知道如何捕获该异常,因为Window_Closing事件返回成功后异常才会发生,所以我不能捕获它...
非常感谢您提供任何提示!