0

我正在尝试将 C++ 库移植到 .NET,但我无法让它工作,而且我不明白出了什么问题。我看到的唯一重大变化是,在带有 libusb 的 C++ 库中,我必须将 alt 接口设置设置为 1,但在 LibUsbDotNet 中,这在 Windows 上是不可能的,因为 WinUsbDevice 没有任何用于 alt 接口的设置器,只有一个吸气剂(它报告它是 0,与 libusb 不同)。

这是一个最小的代码,这在 interruptEndpointWriter.Write 上失败,返回 Win32Error:

      foreach (UsbRegistry usbRegistry in UsbDevice.AllDevices)
            {
                if (usbRegistry.Pid == HELIOS_PID && usbRegistry.Vid == HELIOS_VID)
                {
                    if (usbRegistry.Open(out UsbDevice dac))
                    {
                        IUsbDevice libUsbDevice = dac as IUsbDevice;
                        if (libUsbDevice != null)
                        {
                            // (This code doesn't run because WinUsb devices do not implement these this interface, even though it's possible with C++ libusb)
                            libUsbDevice.ClaimInterface(0);
                            libUsbDevice.SetAltInterface(1);
                        }

                        using (var interruptEndpointWriter = dac.OpenEndpointWriter(WriteEndpointID.Ep06, EndpointType.Interrupt))
                        {
                            var errorCode = interruptEndpointWriter.Write(new byte[] { 0x03, 0 }, 16, out int writeTransferLength);
                            if (errorCode == ErrorCode.Ok && writeTransferLength == 2)
                            {
                                Console.WriteLine("OK");
                            }
                        }
                    }
                }
            }

这是原始的c ++代码。这工作正常。

      int result = libusb_init(NULL);

    libusb_device** devs;
    ssize_t cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0)
        return (int)cnt;

    for (int i = 0; i < cnt; i++)
    {
        struct libusb_device_descriptor devDesc;
        int result = libusb_get_device_descriptor(devs[i], &devDesc);
        if (result < 0)
            continue;

        if ((devDesc.idProduct != HELIOS_PID) || (devDesc.idVendor != HELIOS_VID))
            continue;

        libusb_device_handle* devHandle;
        result = libusb_open(devs[i], &devHandle);
        if (result < 0)
            continue;

        result = libusb_claim_interface(devHandle, 0);
        if (result < 0)
            continue;

        result = libusb_set_interface_alt_setting(devHandle, 0, 1);
        if (result < 0)
            continue;

              int actualLength = 0;
           std::uint8_t ctrlBuffer[2] = { 0x03, 0 };
           int transferResult = libusb_interrupt_transfer(devHandle, 0x06, ctrlBuffer, 2, &actualLength, 16);
               if (transferResult == LIBUSB_SUCCESS)
              {
                     // ok
               }
    }

我究竟做错了什么?

4

0 回答 0