我正在試圖找到正確的方式來使用與java的USB設備。大多數來自StackOverflow的帖子都建議使用usb4java,因爲最新的活動似乎在2014年初,因此我不確定它是否仍然活躍。USB4Java是libusb 1.0還是0.1的包裝?是否推薦用於新的Java開發?
無論如何,在頁面上挖一點點,它會說「它基於本地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被棄用並將沒有進一步的變化或發佈「
這是非常混亂,所以首先我想知道如果USB4Java使用libusb 1.0或0.1。而且,它也被推薦用於任何新的開發或者要走的路,在使用JAVA的USB設備上似乎沒有太多的支持。
UPDATE:
感謝dryman。很好的解釋。 usb4java與libusb-win32結合的問題是延遲。我的交易每10ms發生一次,我承擔不起數據丟失的費用,這就是爲什麼我必須開始緩衝,而且我有15個緩衝區,所以我的最大延遲時間爲150ms。雖然長時間使用libusb-win32評估usb4java ),我不時看到我有超過1秒的延遲。我也嘗試了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]
既然你提到,它可能是更可靠的,我會給它一個嘗試,我會嘗試修復它。
BTW:當我嘗試在下面的代碼中提交傳輸(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);
}
}
你作爲傳輸模式使用什麼?對於可靠的帶寬和響應時間,您應該使用等時傳輸。當然,該設備必須支持。 – dryman
關於訪問違規:我不知道那裏發生了什麼。你可能會發布觸發這個錯誤的示例代碼? – dryman
我正在使用等時批量傳輸。並且訪問衝突發生在我剛剛在原始問題 –