【问题标题】:usb4java USB error 4: Unable to open USB device:usb4java USB 错误 4:无法打开 USB 设备:
【发布时间】:2014-11-18 17:07:38
【问题描述】:

我正在尝试连接 PS3 的 DS3 控制器。我已经设法在C# 中使用libusb 的实现来做到这一点,但我决定将我的实现移至java。不幸的是,我转向 java 并不是那么顺利。该设备似乎在设备列表中找到,但是当我尝试打开它时,我收到以下错误 “USB 错误 4:无法打开 USB 设备:没有此类设备(可能已断开连接)”

public class Main {
private static final short VID = 0x054c;
private static final short PID = 0x0268;

Context context;

public Main() {
    context = new Context();
    int result = LibUsb.init(context);

    if (result != LibUsb.SUCCESS) {
        throw new LibUsbException("Unable to initialize libusb.", result);
    }

    ByteBuffer data = ByteBuffer.allocate(49);
    DeviceHandle ds3Handle = getDeviceHandle(findDevice(VID, PID));
    LibUsb.controlTransfer(ds3Handle, (byte)0xa1, (byte)0x1, (short)0x101, (short)0, data, 1000L);

    LibUsb.exit(context);
}

private Device findDevice(int vid, int pid) {
    Device UsbDevice = null;
    DeviceList list = new DeviceList();
    int result = LibUsb.getDeviceList(context, list);

    if (result < 0) {
        throw new LibUsbException("Unable to get device list", result);
    } 

    try {
        for(Device device: list) {
            DeviceDescriptor descriptor = new DeviceDescriptor();
            result = LibUsb.getDeviceDescriptor(device, descriptor);

            if (result != LibUsb.SUCCESS) {
                throw new LibUsbException("Unable to read device descriptor", result);
            } 

            if (descriptor.idVendor() == vid && descriptor.idProduct() == pid) {
                UsbDevice = device;
                System.out.println("found");
            }
        }
    } finally {
        LibUsb.freeDeviceList(list, true);
    }

    return UsbDevice;
}

private DeviceHandle getDeviceHandle(Device device) {
    DeviceHandle handle = new DeviceHandle();
    int result = LibUsb.open(device, handle);

    if (result != LibUsb.SUCCESS) {
        throw new LibUsbException("Unable to open USB device", result);
    }

    return handle;
}

public static void main(String [] args){
    new Main();
}
}

【问题讨论】:

    标签: java usb libusb usb4java


    【解决方案1】:

    LibUsb.freeDeviceList(list, true);

    true 是问题所在。 “最终布尔 unrefDevices”显示在 javadoc 中。您的代码在您有机会打开设备之前释放它。

    【讨论】:

    • 可以确认,这是解决OP问题的方法。刚刚使用来自usb4java 页面的相同示例代码遇到了同样的问题。非常感谢!
    • 他们的网站在 GitHub 上。发布了 PR。 github.com/usb4java/usb4java.github.io/pull/2
    • 看来这个错误确实是由设备的发布引起的,但我该如何解决这个问题呢?当我将 true 更改为 false 时,它​​会给出另一个错误。
    【解决方案2】:

    仅更改为 false 还不够,您还需要使用需要返回的设备调用 refDevice 示例:

        } finally {
            // Ensure the allocated device list is freed
            LibUsb.freeDeviceList(list, false);
        }
    
        if (deviceFound != null) {
            // Device found
            LibUsb.refDevice(deviceFound);
        }
        return deviceFound;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2014-05-07
      相关资源
      最近更新 更多