Android USB Host API:批量传输缓冲区大小

syn*_*gma 13 usb android host

我正在编写软件来平板电脑(摩托罗拉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我的内核的参数不是管道而是进程.

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

Fab*_*ook 2

你应该买一个 USB 数据分析仪,我正在使用这个:http ://www.ellisys.com/products/usbex200/index.php

当我做同样类型的事情时,使用这样的东西确实对我有帮助,我发现你必须做某种类型的 while 循环。

对于我的设备,我有 64 字节的数据以数据包形式发送给我,该数据包将是两个控制字节和 62 个数据字节,因此对于我的传输,我必须执行类似的操作

StringBuilder sb = new StringBuilder();
while(bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) > 2){
    for(int i = 2; i < buffer.length(); i++){
        sb.append((char) buffer[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这些行很长,对我来说很有用,我遇到了完全相同的问题,这就是我解决它的方法。如果您需要的话,我有更多信息。只是评论:)。我知道这对我来说真的很令人沮丧。我使用的是带有 Android 4.0.3 的 Acer Iconia A500 顺便说一句


USB 传输大量数据

USB 传输数据