小编Gre*_*reg的帖子

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

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

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

一切都与我的电脑上的测试代码完美配合,但我在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;
  }
Run Code Online (Sandbox Code Playgroud)

如果您认为这是arraycopy的时间延迟 - 即使我评论该行,我仍然会丢失数据.

IN_BUFF_LEN是16384(即使我增加了inBuff的大小,bulkTransfer也不会返回更多).

bigBuff是几兆字节.

作为第二个问题 - 有没有人知道如何传递一个指向bulkTransfer的指针,它将直接填充bigBuff--在一个偏移处(不是从位置'0'开始?

usb android host

37
推荐指数
1
解决办法
5309
查看次数

Android - 丢失传入(高速)USB数据

使用Android时,我丢失了传入USB数据流的数据,在Windows中读取相同的设备/流时我不会丢失这些数据.(我知道Android不是一个实时操作系统,但Windows也不是,而Windows在跟上数据方面没有问题.)

我使用具有内置4K缓冲区的FTDI 2232H芯片以大约3.5MB /秒的速度传输数据.libusb中的bulk_transfer调用一次可以请求16K,因此Android需要每4ms左右收集一次USB缓冲区的内容.

我试过:用Java和C语言编写,将线程(和/或进程)优先级提高到它的最高,同步和异步例程,我甚至为每个USB读取传递一个单独的缓冲区,所以我甚至不需要复制连续读取之间的数据.(在传输过程中没有垃圾收集.)我只需要缓冲20MB的数据,所以这都是RAM.

尽管如此,Android还是"没有绕过"USB数据,有时在读取之间等待长达12ms,导致一堆数据丢失.

有没有人有任何想法?DMA?对内核有某种"实时"请求?

usb android real-time

34
推荐指数
1
解决办法
2849
查看次数

标签 统计

android ×2

usb ×2

host ×1

real-time ×1