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

问题描述 投票:13回答:5

我正在编写软件来平板电脑(摩托罗拉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功能未正确读取的数据。我想有些数据会丢失。

我找到了这个:In Linux If a process attempts to read from an empty pipe (buffer), then read(2) will block until data is available. If a process attempts to write to a full pipe , then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete.

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

  1. 我对此问题的第一个解决方案是更大的缓冲。 For kernel >= 2.6.35, you can change the size of a pipe with fcntl(fd, F_SETPIPE_SZ, size)但我怎样才能找到USB管道的fd(文件描述符)?
  2. 第二种选择是使用ulimit -p SIZE但我的内核参数p不是用于管道而是用于处理。

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

android usb host
5个回答
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]);
    }
}

这些线条对我来说很有用,我有完全相同的问题,这就是我修复它的方法。如果您需要,我会提供更多信息。只是评论:)。我知道这对我来说真的很令人沮丧。我使用Acer Iconia A500与Android 4.0.3顺便说一句


Transferring larger amounts of data USB

Transferring data USB


1
投票

根据同样的.pdf gfour发布,我在那里发现了这一段:

“数据包的大小会影响性能,并且取决于数据速率。对于非常高的速度,需要最大的数据包大小。对于以115200波特传输音频数据的'实时'应用程序,例如,最小的可能需要数据包,否则设备将一次保存4k数据。如果USB请求数量太大而数据速率太低(相对),这可能会产生“抖动”数据传输的影响。

我遇到了类似于带有FTDI串行设备的SmartLemon的情况,所以我最近一直在寻找缓解它的方法。这将要求我在以前使用库时从头开始编写自己的函数。

但是,在您的情况下,您可以尝试使用bulkTransfer的最低缓冲区大小而不是拍摄最大的缓冲区大小。你可能已经尝试过了,但也许没有。我看到你说32768是唯一的尺寸,但也许你只是意味着最大。它只允许一个特定的大小似乎很奇怪。


1
投票

Android SDK的UsbEndpoint对象提供了一个getMaxPacketSize()方法,允许您检查适合您设备的内容。通常,USB“全速”设备的最大允许数据包大小为64字节,“高速”设备的最大允许数据包大小为512 - 远小于您尝试的32,768。您是否可能将基础USB数据包大小与某些更高级别的协议混淆?


0
投票

根据AN232B-04_DataLatencyFlow.pdf的说法,高数据率需要流量控制:

强烈建议使用流量控制,因为无法确保始终安排FTDI驱动程序。

您是否尝试过使用其中一个流控制选项(RTS / CTS,DTR / DSR,XON / XOFF)来同步数据?


-1
投票

您可以尝试批量转移问题

byte[] buffer = new byte[4096];

            StringBuilder strIN = new StringBuilder();

            if (conn.bulkTransfer(epIN, buffer, 4096, 500) >= 0) {
                for (int i = 2; i < 4096; i++) {
                    if (buffer[i] != 0) {
                        strIN.append((char) buffer[i]);

                        textReceiveDataInfo.append(strIN + "\n");
                    } else {
                        l(strIN);
                        break;
                    }
                }

            }
© www.soinside.com 2019 - 2024. All rights reserved.