我正在使用 C# 和 LibUsbDotNet 尝试对 USB 设备(在本例中是通过 USB 电缆连接到我的开发机器的 Android 设备)进行异步写入操作。我有一个有效的 USB 连接(通过指定产品/供应商 ID)并且正在使用正确的 WriteEndpointID 写入设备。当我尝试异步字节传输时,返回的错误代码是“ErrorCode.None”,并且我收到了一个有效的 usbWriteTransfer 对象。当我尝试对 usbTransfer 对象 AsyncWaitHandle 执行 WaitHandle.WaitAll 时,该方法始终返回“false”并且 usbWriteTransfer 永远不会完成。我列出了下面的代码:
/// <summary>
/// Method for performing device write operation.
/// </summary>
/// <typeparam name="T">
/// Generic object
/// </typeparam>
/// <param name="MyUsbDevice">
/// USB device object
/// </param>
/// <param name="value">
/// Generic object
/// </param>
/// <returns>
/// If write operation is successful the return success
/// If write operaton failed then return DeviceWriteError as ErrorCode.
/// If exception occurs then retuen DeviceWriteError as ErrorCode.
/// </returns>
internal CommunicationErrorCodes Write<T>(UsbDevice MyUsbDevice, T value) where T : class
{
try
{
_log.LogInfo($"Entering {System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName} - {System.Reflection.MethodBase.GetCurrentMethod()}");
IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
//Set config #1
wholeUsbDevice.SetConfiguration(1);
//Claim interface #0
wholeUsbDevice.ClaimInterface(0);
}
string errorMessage;
var writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);
errorMessage = new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error()).Message;
ErrorCode ecWrite;
int transferredOut;
UsbTransfer usbWriteTransfer;
var bytesToSend = JSONSerializer.JsonSerialize(value);
ecWrite = writer.SubmitAsyncTransfer(bytesToSend, 0, bytesToSend.Length, 5000, out usbWriteTransfer);
if (ecWrite != ErrorCode.None)
{
_log.LogException($"{System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName} - {System.Reflection.MethodBase.GetCurrentMethod()} - EC : { CommunicationErrorCodes.DeviceWriteError} - Submit Async Write Failed.");
return CommunicationErrorCodes.DeviceWriteError;
}
var endpointbase = usbWriteTransfer.EndpointBase;
errorMessage = new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error()).Message;
bool result = WaitHandle.WaitAll(new WaitHandle[] { usbWriteTransfer.AsyncWaitHandle }, 5000, false);
errorMessage = new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error()).Message;
int transmitted = usbWriteTransfer.Transmitted;
if (!usbWriteTransfer.IsCompleted) usbWriteTransfer.Cancel();
ecWrite = usbWriteTransfer.Wait(out transferredOut);
errorMessage = new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error()).Message;
usbWriteTransfer.Dispose();
_log.LogInfo($"Exiting {System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName} - {System.Reflection.MethodBase.GetCurrentMethod()}");
return CommunicationErrorCodes.Success;
}
catch (Exception ex)
{
if (MyUsbDevice != null)
{
if (MyUsbDevice.IsOpen)
{
MyUsbDevice.Close();
}
}
_log.LogException($"{System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName} - {System.Reflection.MethodBase.GetCurrentMethod()} - EC : { CommunicationErrorCodes.DeviceWriteError} - {ex}");
return CommunicationErrorCodes.DeviceWriteError;
}
}
此示例代码与我看到的描述如何使用 libusbdotnet 写入 USB 设备的示例代码类型相同。我不确定为什么 WaitHandle.WaitAll 总是返回 false 以及为什么没有数据传输到设备。我将不胜感激任何帮助。