我正在尝试从基于 FTDI 2232H 芯片的自定义设备接收数据。
我使用的是简单的 Async FIFO 模式,传入数据速率为 3.2MB/秒。
一切都与我的 PC 上的测试代码完美配合,但我在 Toshiba Thrive 上接收数据时遇到问题。
TDI 的 Android 驱动程序失败,所以我正在使用 Java 进行编码。
我可以完美地接收 95% 以上的数据,但每隔一段时间,数据会“中断”,我会收到两到三遍相同的 4-5K 数据的一部分,然后又恢复到良好的数据。
对于 Thrive 或 Android,我不会太快,因为我之前的数据以双倍 (6.4MB/秒) 的速度输入,而且它也获得了大约 95% 的数据。 (所以减半应该没问题。)
似乎在 Android 中发生的缓冲(或双缓冲)中存在某种错误。 (不是FTDI 2232H内部的缓冲区,因为重复的数据比芯片的4K内部缓冲区大。)
设置代码很简单,它再次运行~几乎~完美。
数据抓取发生的循环很简单:
while(!fStop)
if(totalLen < BIG_BUFF_LEN-IN_BUFF_LEN)
{
len=conn.bulkTransfer(epIN, inBuff, IN_BUFF_LEN, 0);
System.arraycopy(inBuff, 0, bigBuff, totalLen, len);
totalLen+=len;
}
如果您认为这是 arraycopy 的时间延迟 - 即使我注释掉该行,我仍然会丢失数据。
IN_BUFF_LEN 为 16384(即使我增加 inBuff 的大小,bulkTransfer 也不会返回更多)。
bigBuff 是几兆字节。
作为第二个问题 - 有没有人知道如何传递一个指向 bulkTransfer 的指针,该指针将直接填充 bigBuff --- 在一个偏移量处(不是从位置 '0' 开始?
最佳答案
UsbConnection.bulktransfer(...)
有问题。使用 UsbRequest.queue(...)
Api。
许多人报告说,直接使用批量传输会导致大约 1% 或 2% 的输入传输失败。
关于Android USB 主机 - bulkTransfer() 正在丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9108548/