Я пытаюсь найти правильный способ использования USB-устройства с java. Большинство сообщений из 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).
У меня есть usb4java для работы с помощью драйвера libusb-win32. Но когда вы переходите на сайт «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. А также рекомендуется для любой новой разработки или того, что было бы для вас, похоже, слишком много поддержки USB-устройств при использовании JAVA.
UPDATE:
Благодаря dryman. Отличное объяснение. Моя проблема с usb4java в сочетании с libusb-win32 - это латентность. Мои транзакции происходят каждые 10 мс, и я не могу позволить себе потерять данные, поэтому мне пришлось начать буферизацию, и у меня есть 15 буферов, поэтому максимальная задержка будет равна 150 мс. Хотя оценка usb4java с libusb-win32 длительное время (часы), Я вижу, что время от времени у меня есть задержки более 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]
Теперь, когда вы говорите, что это может быть более надежным, я дам ему попробовать, и я постараюсь это исправить.
ОТВЕТ: Нарушение прав доступа происходит, когда я пытаюсь отправить передачу (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
Я использую изохронные массовые переводы. И Нарушение доступа происходит в коде, который я только что добавил в исходном вопросе –