我正在尝试找到将 USB 设备与 java 一起使用的正确方法。StackOverflow 的大部分帖子都推荐使用 usb4java,它的最新活动似乎是在 2014 年初,所以我不确定它是否仍然处于活动状态。
无论如何,深入研究一下,在页面上,它说“它基于本地 libusb 1.0 库”。然后尝试安装设备驱动程序,我按照推荐使用了 Zadig(https://github.com/libusb/libusb/wiki/Windows#How_to_use_libusb_on_Windows)。
我通过使用“libusb-win32”驱动程序让 usb4java 工作。但是当你访问“libusb-win32”网站时,它会提到“libusb-win32 是 USB 库 libusb-0.1 的一个端口”,并且更多内容在这里http://libusb.org/wiki/APIs#libusb -0.1legacyAPI中提到“开发状态:libusb-0.1 已弃用,不会有进一步的更改或发布”</p>
这一切都非常令人困惑,所以首先我想知道 USB4Java 是使用 libusb 1.0 还是 0.1。而且它是否推荐用于任何新的开发或将要走的路,似乎没有太多支持使用 JAVA 的 USB 设备。
更新:
谢谢干员。很好的解释。我将 usb4java 与 libusb-win32 结合使用的问题是延迟。我的事务每 10 毫秒发生一次,而且我不能丢失数据,这就是为什么我必须开始缓冲并且我有 15 个缓冲区,所以我的最大延迟将是 150 毫秒。在长时间使用 libusb-win32 评估 usb4java 时(几小时),我看到有时我的延迟超过 1s。我确实尝试过 WinUSB,但由于某种原因,我得到了:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006b6051c2, pid=6284, tid=6836
#
# JRE version: Java(TM) SE Runtime Environment (8.0_45-b14) (build 1.8.0_45-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [libusb-1.0.dll+0x51c2]
既然你提到它可能更可靠,我会试一试,我会尝试修复它。
顺便说一句:当我尝试在下面的代码中提交传输 (LibUsb.submitTransfer(transfer);) 时,会发生访问冲突。
public static void write(DeviceHandle handle, byte[] data,
TransferCallback callback)
{
ByteBuffer buffer = BufferUtils.allocateByteBuffer(data.length);
buffer.put(data);
Transfer transfer = LibUsb.allocTransfer();
LibUsb.fillBulkTransfer(transfer, handle, OUT_ENDPOINT, buffer,
callback, null, TIMEOUT);
// System.out.println("Sending " + data.length + " bytes to device");
int result = LibUsb.submitTransfer(transfer);
if (result != LibUsb.SUCCESS)
{
throw new LibUsbException("Unable to submit transfer", result);
}
}