我试图从基于FTDI 2232H芯片的自定义设备接收数据。Android USB主机 - bulkTransfer()丢失数据
我正在使用一个简单的异步FIFO模式,并且传入数据速率是3.2MB /秒。
一切工作完美与我的电脑上的测试代码,但我遇到问题,我的东芝舒马上收到数据。
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”
任何解决方案,这一个? – 2012-11-14 16:32:41
也许android在这段时间里是垃圾收集,有些东西正在迷失。检查你的logcat,看看你是否能够在丢失数据时匹配操作系统中发生的事情。 – RightHandedMonkey 2013-01-23 02:26:23
奇怪的问题,因为如果你使用FIFO,它永远不会发生。因为当你读取一个FIFO时,数据就会消失。您是否在每次读取FIFO之前尝试清除缓冲区?即确保您没有两次读取相同的数据,而不是从FIFO中读出,而是在缓冲区中读取。 – fonZ 2013-02-01 10:13:50