Android USB Host-bulkTransfer () perd des données
j'essaie de recevoir des données d'un appareil personnalisé basé sur une puce FTDI 2232H.
j'utilise un mode simple async FIFO, et le débit de données entrant est de 3.2 MB/sec.
Tout fonctionne parfaitement avec le code de test sur mon PC, mais j'ai des problèmes à recevoir des données sur Mon Toshiba Thrive.
le pilote Android de TDI échoue, donc je code en utilisant Java.
je peux recevoir 95%+ des données parfaitement, mais de temps en temps les données "crachent" et je reçois des portions du même 4-5K de données deux ou trois fois, puis retour aux bonnes données.
Je ne vais pas trop vite pour le Thrive ou Android, parce que j'avais précédemment les données venant à double (6,4 Mo/sec) et il a obtenu environ 95% de cela aussi bien. (Donc il ne devrait avoir aucun problème à la moitié du taux.)
il semble qu'il y ait une sorte de bug dans la mise en tampon (ou double mise en tampon) qui se produit au sein D'Android. (Il ne s'agit pas du tampon à L'intérieur de la FTDI 2232H car les données répétées sont plus grand que le tampon interne 4K de la puce.)
le code de configuration est simple, et encore il fonctionne ~presque ~ parfaitement.
La boucle où les données à saisir se produit est très simple:
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;
}
Dans le cas où vous pensez que c'est le temps de retard pour la arraycopy - je encore perdre les données, même si je commente cette ligne.
L'IN_BUFF_LEN est 16384 (bulkTransfer ne retournera pas plus que cela même si j'augmente la taille de l'inBuff).
le bigBuff est plusieurs mégaoctets.
comme question secondaire-est-ce que quelqu'un sait comment passer un pointeur à bulkTransfer qui peuplera directement bigBuff - - à un décalage (ne commençant pas à la position '0'?
5 réponses
@Greg j'ai le même problème avec un périphérique usb à pleine vitesse et le correctif était d'inclure un délai de 50ms entre chaque sondage au tampon USB interne ANdroid.
UsbConnection.bulktransfer(...) est buggé. Utilisez UsbRequest.file.(..) API. Beaucoup de gens ont rapporté que l'utilisation de bulktransfer échoue directement autour de 1% ou 2% des transferts d'entrée.
juste pour clarifier quelques unes des approches que j'ai essayées...Le code USB a fonctionné dans son propre thread et a été donné priorité max (pas de chance) - j'ai essayé les appels API, libUSB, C natif, et d'autres méthodes (pas de chance) - j'ai tamponné, et sondé, et la file d'attente (pas de chance) - finalement, J'ai décidé Android ne pouvait pas gérer les données USB à "haute vitesse" (constante 3.2 MB/sec w/ Pas de contrôle de flux). J'ai construit un tampon FIFO 8Mb hardware dans ma conception pour compenser. (Si vous pensez que vous avez une réponse, trouver quelque chose qui se nourrit données à 3,2 Mo / sec et voir si Android peut gérer sans hoquet. Je suis presque sûr qu'il ne peut pas.)
dans Nexus Media importateur je peux toujours pousser à travers environ 9MB / s, donc c'est possible. Je ne suis pas sûr que vous ayez le contrôle de la source, mais vous pourriez vouloir briser le flux en blocs de 16K avec une sorte d'en-tête séquencé afin que vous puissiez détecter les blocs manquants et la corruption.
en outre, vous ne Vérifiez pas len < 0. Je ne suis pas sûr de ce qui se passera si la pile sous-jacente obtient un NAK ou un NYET de l'autre côté. J'ai assez compris que j'ai un code de récupération à gérer. ce.
j'ai cherché longtemps et avec acharnement un moyen de neutraliser le tampon de destination de bulkTransfer, mais je ne l'ai pas encore trouvé. FYI: USBRequest.queue() ne respecte pas le ByteBuffer.position.)(
je suis un peu surpris qu'on puisse faire 16K sur bulkTransfer de toute façon. Selon la spécification USB 2.0, Le max est censé être de 512 octets pour un bulkTransfer endpoint. Est-ce que L'androïde est en train de grouper les transferts en vrac, ou est-ce qu'on enfreint les règles?
Vous devez être sûr qu'il n'y a pas de circulation autres - sur le même bus avec une priorité plus élevée que votre trafic.