Android USB主机 – bulkTransfer()正在丢失数据
我试图从基于FTDI 2232H芯片的定制设备接收数据。
我正在使用一个简单的asynchronousFIFO模式,input数据速率是3.2MB /秒。
一切工作完美与我的电脑上的testing代码,但我有问题接收我的东芝茁壮成长的数据。
TDI的Android驱动失败,所以我使用Java编码。
我可以完美地获得95%以上的数据,但是每隔一段时间,数据就会“飞溅”,并且将相同的4-5K数据的一部分分两次或三次,然后返回到正确的数据。
对于Thrive或者Android来说,我不会太快,因为之前我的数据是双倍的(6.4MB / sec),而且也有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; }
如果你认为这是arrays拷贝的时间延迟 – 即使我发表评论,我仍然会丢失数据。
IN_BUFF_LEN是16384(即使增加inBuff的大小,bulkTransfer也不会返回更多的值)。
bigBuff是几兆字节。
作为第二个问题 – 有谁知道如何传递一个指向bulkTransfer的指针,直接填充bigBuff —在一个偏移量(不是从位置'0'开始?
@Greg我有一个全速USB设备相同的问题,并修复包括每个轮询之间的延迟50毫秒的ANdroid内部USB缓冲区。
UsbConnection.bulktransfer(…)是越野车。 使用UsbRequest.queue(…)Api。 很多人报告说,使用批量转运直接失败了约1%或2%的投入转移。
只是澄清了一些我尝试的方法… USB代码运行在它自己的线程,并给予最大优先级(没有运气) – 我尝试API调用,libUSB,原生C和其他方法(没有运气) – 我缓冲和轮询,并排队(没有运气) – 最终我决定Android无法处理USB数据“高速”(恒定3.2MB /秒瓦特/无stream量控制)。 我在我的devise中构build了一个8MB的硬件FIFO缓冲区来弥补它。 (如果你认为你有一个答案,拿出一些以3.2MB /秒的速度提供数据的东西,看看Android是否可以处理它没有任何打嗝,我敢肯定它不能)。
在Nexus Media Importer中,我可以始终如一地推动大约9MB / s的速度,所以这是可能的。 我不确定是否有源代码的控制权,但是您可能需要使用某种sorting标题将代码分割为16K块,以便可以检测到丢失块和损坏。
此外,你没有检查len <0。我不知道如果底层栈从另一端获得NAK或NYET会有什么。 我得到这个足够的,我有恢复代码来处理这个。
我已经很长时间的努力来弥补bulkTransfer目标缓冲区,但我还没有find它。 仅供参考:USBRequest.queue()不尊重ByteBuffer.position()。
无论如何,我有一个惊喜,我们可以在bulkTransfer上做16K。 根据USB 2.0规范,bulkTransfer端点的最大值应该是512字节。 Android是否捆绑了bulkTransfers,还是我们违规?
您必须确保没有其他交通 – 在同一辆公交车上 – 比交通拥有更高的优先级。