0

我正在使用 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 以及为什么没有数据传输到设备。我将不胜感激任何帮助。

4

0 回答 0