我花了相当长的时间试图找出使用usb4java (Libusb)的低级函数连续读取大量数据的最佳方法。
在全速设备中,我需要读取的数据量是640千字节/秒,理论上是可能的,而且我使用的带宽应该少于可用带宽的一半。我遇到的问题是,我正在读的数据有一些小故障,可能来自丢失或损坏的数据。
我已经尝试过同步和异步的类似结果。在这里,我发布了我在异步模式下使用的代码,任何帮助都是非常感谢的。
public Void doInBackground() {
loop = true;
handle = comm_device_async.gethandle();
buffer = BufferUtils.allocateByteBuffer(PacketSize).order(ByteOrder.LITTLE_ENDIAN);
Transfer transfer = LibUsb.allocTransfer();
LibUsb.fillBulkTransfer(transfer, handle, IN_ENDPOINT, buffer, read_callback, null, TIMEOUT);
int result = LibUsb.submitTransfer(transfer);
if (result != LibUsb.SUCCESS) {
throw new LibUsbException("Unable to submit transfer", result);
}
while (loop) {
synchronized (synchObj) {
while (!transfercompleted) {
try {
synchObj.wait();
} catch (InterruptedException ex) {
Logger.getLogger(GraphPanel_JChart2D.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
transfercompleted = false;
multipledatashort[readcyclecount] = read_callback_data;
readcyclecount++;
if (readcyclecount == readcycles) {
synchronized (dataListShort) {
dataListShort.add(multipledatashort);
dataListShort.notify();
}
readcyclecount = 0;
}
}
return null;
}
TransferCallback read_callback = new TransferCallback() {
ByteBuffer buffer;
long startTime = 0;
@Override
public void processTransfer(Transfer transfer) {
System.out.println("ReadCallback loop time " + (System.nanoTime() / 1000 - startTime));
startTime = System.nanoTime() / 1000;
read_callback_data = new short[transfer.buffer().capacity() / 2];
for (int i = 0; i < read_callback_data.length; i++)
read_callback_data[i] = transfer.buffer().getShort();
synchronized (synchObj) {
transfercompleted = true;
synchObj.notify();
}
buffer = BufferUtils.allocateByteBuffer(PacketSize).order(
ByteOrder.LITTLE_ENDIAN);
LibUsb.fillBulkTransfer(transfer, collectWorker_usb4java_async_fast.handle, IN_ENDPOINT, buffer,
read_callback, null, TIMEOUT);
int result = LibUsb.submitTransfer(transfer);
if (result != LibUsb.SUCCESS) {
throw new LibUsbException("Unable to submit transfer", result);
}
}
};发布于 2014-05-07 14:59:04
我找到了一条描述类似问题的帖子
http://libusb.6.n5.nabble.com/Fwd-FT2232H-asynchronous-maximum-data-rates-td4519549.html
有两个要点
因此,基本上对于大量的数据,我们需要提交一个事务缓冲区,所以在最后一个数据结束时总是有一个待处理的数据。
我将致力于这方面的工作,但我还没有找到任何关于如何使用usb4java来完成这一工作的好例子。同样,任何帮助都是非常感谢的。
https://stackoverflow.com/questions/23493915
复制相似问题