1

我正在尝试使用LibUsbDotNet C# 库的ControlTransfer方法与 USB 设备进行通信,但该方法一直返回 false。我的代码如下:

private bool writeCtrlMsg(int value, int index, byte[] buffer)
{
    if (buffer == null || buffer.Length == 0)
        throw new ArgumentException("Null or invalid length param.", "buffer");
    if (_rtlUSBDongle == null)
        throw new DongleNotOpeningException();
    if (!_rtlUSBDongle.IsOpen && !_rtlUSBDongle.Open())
        throw new DongleConnectionException();

    var shortVal = (short)value;
    var shortIndex = (short)index;

    var usbSetupPacket = new UsbSetupPacket(
        (byte)(UsbCtrlFlags.Direction_Out | UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device),
        0,
        value,
        index,
        buffer.Length
    );

    var result = _rtlUSBDongle.ControlTransfer(ref usbSetupPacket, buffer, buffer.Length, out var lengthTransferred);
    var errorCode = GetLastError();
    var errorCodeHex = errorCode.ToString("X");
    return result;
}

方法调用的一个示例是:writeCtrlMsg(0x34, 0x619, new byte[] { 0x83 }). 无论我使用什么值,该ControlTransfer方法都会返回 false。我在文档中找不到有关错误处理或此方法返回 false 的任何内容。我使用该GetLastError调用查看是否收到任何错误,并且它始终返回 31(或 0x1F),但是我在网上找不到有关此错误的任何信息。

是我能在 SO 上找到的唯一其他问题,答案建议使用 0x0 作为UsbSetupPacket构造函数调用中的最后一个参数。试过了,仍然返回false。

有任何想法吗?

4

1 回答 1

0

您是否尝试过使用以下两个:

上次错误编号

UsbDevice.LastErrorNumber

返回 LibUsbDotNet 报告的最后一个错误号。

最后错误字符串

UsbDevice.LastErrorString

http://libusbdotnet.sourceforge.net/V2/html/f3942add-f073-3881-7146-0673415cee3b.htm

于 2020-02-09T12:06:07.607 回答