Android USB主机 - bulkTransfer()正在丢失数据

时间:2012-02-02 07:24:49

标签: android usb host

我正在尝试从基于FTDI 2232H芯片的自定义设备接收数据。

我使用简单的异步FIFO模式,输入数据速率为3.2MB /秒。

一切都与我的电脑上的测试代码完美配合,但我在东芝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'开始?

5 个答案:

答案 0 :(得分:3)

@Greg我对全速usb设备遇到同样的问题,修复是在每次轮询到ANdroid内部usb缓冲区之间包含50ms的延迟。

答案 1 :(得分:3)

UsbConnection.bulktransfer(...)是错误的。使用UsbRequest.queue(...)Api。许多人报告说,使用bulktransfer直接失败了大约1%或2%的输入传输。

答案 2 :(得分:2)

只是为了澄清我尝试的一些方法...... USB代码在它自己的线程中运行并被赋予最高优先级(没有运气) - 我尝试了API调用,libUSB,本机C和其他方法(没有运气) - 我缓冲,轮询和排队(没有运气) - 最终我决定Android无法以“高速”处理USB数据(恒定的3.2MB /秒w /无流量控制)。我在我的设计中构建了一个8MB的硬件FIFO缓冲区来弥补它。 (如果您认为自己有答案,请提出以3.2MB /秒的速度提供数据的内容,看看Android是否可以在没有任何打嗝的情况下处理数据。我很确定它不能。)

答案 3 :(得分:1)

在Nexus Media Importer中,我可以持续推进大约9MB / s,因此它是可能的。我不确定你是否控制了源代码,但是你可能想要使用某种顺序标题将提要分解为16K块,以便检测丢失的块和损坏。

另外,你没有检查len&lt; 0.如果底层堆栈从另一端获得NAK或NYET,我不确定会有什么。我得到足够的,我有恢复代码来处理这个。

我看起来很长很难找到一种方法来抵消bulkTransfer目标缓冲区,但我还没有找到它。仅供参考:USBRequest.queue()不尊重ByteBuffer.position()。

我很惊讶我们无论如何都可以在bulkTransfer上做16K。根据USB 2.0规范,对于bulkTransfer端点,max应该是512字节。 Android捆绑了bulkTransfers,还是我们违反了规则?

答案 4 :(得分:0)

您必须确保在同一条公交车上没有其他流量 - 优先级高于您的流量。