相关疑难解决方法(0)

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 Host API:批量传输缓冲区大小

我正在编写软件来平板电脑(摩托罗拉Xoom与Android版本4.0.3和内核版本2.6.39.4)和使用 Android提供的USB Host API的外围设备之间进行通信.我只使用两种类型的通信:

  • 控制:controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
  • 批量:bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

控制传输工作正常,但我有批量传输的问题.我只能使用32768作为bulkTransfer函数的缓冲区大小.不可能使用更少或更多.我知道由于缓冲管的限制(大小:32769字节),我不能使用更多.

此外围设备流式传输bulkTranfer功能未正确读取的数据.我想有些数据会丢失.

我发现:在Linux中如果进程尝试从空管道(缓冲区)读取,则read(2)将阻塞,直到数据可用.如果进程尝试写入完整管道,则写入(2)块,直到从管道读取足够的数据以允许写入完成.

基于此,我对该问题的解释是由于write(2)函数产生的阻塞标志,某些数据不会写入管道(缓冲区).我对么?如果这是真的,我可以改变管道缓冲区.

  1. 我对此问题的第一个解决方案是更大的缓冲.对于kernel> = 2.6.35,您可以更改管道的大小fcntl(fd, F_SETPIPE_SZ, size)但是如何找到fdUSB管道的(文件描述符)?
  2. 第二个选项是使用ulimit -p SIZEp我的内核的参数不是管道而是进程.

有没有人遇到同样的问题,任何解决方案?

usb android host

13
推荐指数
1
解决办法
2万
查看次数

标签 统计

android ×2

host ×2

usb ×2