Usb4Java - Отправка больших команд
У меня проблемы с отправкой больших команд с использованием Usb4Java.
Если я отправляю все данные за один раз, как и для команд меньшего размера, устройство не отвечает, и я предполагаю, что это из-за слишком большого количества данных одновременно.
Затем я попытался разделить команду на 5 или 6 отдельных команд, и проблема в том, что она выполняет только первую команду и, кажется, игнорирует остальные...
Если кто-то, имеющий опыт в этом вопросе, сможет пролить свет на то, что я должен делать, я был бы очень благодарен за это. Есть ли способ потоковой передачи данных по частям до тех пор, пока все они не будут отправлены, а затем устройство выполнит их?
Ниже приведены все методы, которые я использую.
Обычный метод sendCommand(), который отлично работает для небольших команд.
public static void sendCommand(String command){
final TransferCallback callback = (Transfer transfer) -> {
LibUsb.freeTransfer(transfer);
};
write(handle, command, callback);
}
Это моя попытка отправки нескольких команд (но по какой-то причине устройство выполняет только первую).
public static void sendMultipleCommands(String COMMAND_ONE, String COMMAND_TWO, String COMMAND_THREE, String COMMAND_FOUR, String COMMAND_FIVE, String COMMAND_SIX){
// This callback is called after all commands have been sent
// The asynchronous transfer chain ends here.
final TransferCallback seven = (Transfer transfer) -> {
System.out.println("Cut complete.");
LibUsb.freeTransfer(transfer);
};
// This callback is called after command 6 is sent
final TransferCallback six = (Transfer transfer) -> {
System.out.println("Sending command: 6");
write(handle, COMMAND_SIX, seven);
LibUsb.freeTransfer(transfer);
};
// This callback is called after command 5 is sent
final TransferCallback five = (Transfer transfer) -> {
System.out.println("Sending command: 5");
write(handle, COMMAND_FIVE, six);
LibUsb.freeTransfer(transfer);
};
// This callback is called after command 4 is sent
final TransferCallback four = (Transfer transfer) -> {
System.out.println("Sending command: 4");
write(handle, COMMAND_FOUR, five);
LibUsb.freeTransfer(transfer);
};
// This callback is called after command 3 is sent
final TransferCallback three = (Transfer transfer) -> {
System.out.println("Sending command: 3");
write(handle, COMMAND_THREE, four);
LibUsb.freeTransfer(transfer);
};
// This callback is called after command 2 is sent
final TransferCallback two = (Transfer transfer) -> {
System.out.println("Sending command: 2");
write(handle, COMMAND_TWO, three);
LibUsb.freeTransfer(transfer);
};
// Sending commands asynchronously.
// The rest of the communication is handled by the callbacks defined above.
System.out.println("\nSending command: 1");
write(handle, COMMAND_ONE, two);
}
И, наконец, это метод write(), на который опираются и используют оба вышеупомянутых метода.
/**
* Asynchronously writes some data to the device.
*
* @param handle
* The device handle.
* @param data
* The data to send to the device.
* @param callback
* The callback to execute when data has been transfered.
*/
public static void write(DeviceHandle handle, String data, TransferCallback callback){
ByteBuffer buffer = BufferUtils.allocateByteBuffer(data.getBytes().length);
buffer.put(data.getBytes());
Transfer transfer = LibUsb.allocTransfer();
LibUsb.fillBulkTransfer(transfer, handle, OUT_ENDPOINT, buffer, callback, null, TIMEOUT);
// System.out.println("Sending " + data.length + " bytes to device\n");
result = LibUsb.submitTransfer(transfer);
if (result != LibUsb.SUCCESS){
throw new LibUsbException("Unable to submit transfer\n", result);
}
}
Этот пример с официальной страницы Usb4Java GitHub помог мне создать большую часть кода выше.