API hôte USB Android: taille du tampon de transfert en bloc
Je suis en train d'écrire un logiciel pour communiquer entre tablette (Motorola Xoom avec la version Android 4.0.3 et la version du Noyau 2.6.39.4) et un périphérique USB, Hôte de l'API fournis par Android. Je n'utilise que deux types de communication:
- contrôle:
controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
- en vrac:
bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
De contrôle de transfert fonctionne très bien, mais j'ai un problème avec le transfert en bloc. Je peux utiliser seulement 32768 comme la taille de la mémoire tampon pour bulkTransfer fonction. Il n'est pas possible d'utiliser moins ou plus. Je sais que je ne peux pas utiliser de plus en raison de la limite de la mémoire tampon de tuyau (taille: 32769 octets).
Ce périphérique flux de données qui n'est pas lu correctement par bulkTranfer fonction. Je suppose que certaines données sont perdues.
Et sur cette base, mon explication du problème, c'est que certaines données ne sont pas écrites à la pipe (tampon) en raison d'un blocage drapeau fait par write(2) de la fonction. Suis-je la corriger? Si cela est vrai, je pouvais changer la pipe de la mémoire tampon.
- Ma première solution de ce problème réside dans davantage de mémoire tampon. Pour
noyau >= 2.6.35, vous pouvez modifier la taille du tuyau avecfcntl(fd, F_SETPIPE_SZ, taille)
mais comment puis-je trouverfd
(descripteur de fichier) pour
USB tuyaux? - Deuxième option est d'utiliser
ulimit -p SIZE
mais paramètrep
pour mon noyau n'est pas pour le tuyau mais processus.
Quelqu'un a connu le même problème, toutes les solutions?
source d'informationauteur syntagma
Vous devez vous connecter pour publier un commentaire.
Vous devriez obtenir un USB de l'analyseur de données, de messagerie instantanée à l'aide de celui-ci: http://www.ellisys.com/products/usbex200/index.php
En utilisant quelque chose comme cela m'a vraiment aidé quand je faisais le même genre de chose, ce que j'ai trouvé que vous aviez à faire un peu de type de boucle while.
Pour mon appareil, j'ai eu 64 octets de données en paquets, pour moi, le paquet devrait être de deux octets de contrôle et de 62 ans pour les données, donc pour mon transfert, j'ai dû faire quelque chose comme
quelque chose d'un long de ces lignes a travaillé très bien pour moi, j'ai eu exactement le même problème et c'est la façon dont je l'ai corrigé. J'ai plus d'informations si vous en avez besoin. Juste un commentaire :). Je sais que c'est vraiment frustrant pour moi. Im en utilisant un Acer Iconia A500 avec Android 4.0.3 btw
Le transfert de grandes quantités de données USB
Transfert de données USB
Selon la même chose .pdf gfour posté, j'ai trouvé ce point là:
"La taille du paquet sur la performance et dépend du débit de données. Pour le très haut débit, la taille de paquet maximale est nécessaire. Pour "en temps réel" des applications qui sont la transmission de données audio à 115200 Bauds par exemple, le plus petit paquet de possible est souhaitable, sinon, l'appareil sera tenue jusqu'à 4k de données à la fois. Cela peut donner l'effet d'une " saccadé de transfert de données si la clé USB de la taille de la demande est trop grande et le taux de données trop faible (relativement)."
Je suis en cours d'exécution dans une situation semblable à SmartLemon avec un FTDI de Série de l'appareil, donc j'ai été récemment à la recherche des moyens de les réduire. Cela va m'obliger à peu près écrire mes propres fonctions à partir de zéro alors que, précédemment, j'ai été en utilisant une bibliothèque.
Cependant, il semble que dans votre cas, vous pouvez essayer d'utiliser bulkTransfer de plus faible taille de la mémoire tampon au lieu de tournage pour les plus grands. Vous avez essayé déjà, mais peut-être pas. Je vois que vous dites 32768 est la seule taille, mais peut-être que vous ne signifiait le max. Il semble bizarre qu'il avait seulement permettre à une taille spécifique.
Le SDK Android est UsbEndpoint objet fournit une getMaxPacketSize() méthode, vous permettant de vérifier ce qui est approprié pour votre appareil. Généralement, la limite maximale de la taille des paquets est de 64 octets pour l'USB Pleine vitesse "appareils et 512 de" Haute vitesse " appareils - moins de 32,768 vous tentent. Vous êtes peut-être la confusion du sous-jacent USB de la taille des paquets à celle de certains de protocole de niveau supérieur?
Selon AN232B-04_DataLatencyFlow.pdfle contrôle de flux est nécessaire pour des débits de données élevés:
Avez-vous essayé d'utiliser l'une des options de contrôle de flux (RTS/CTS, DTR/DSR, XON/XOFF) pour synchroniser vos données?
Vous pouvez essayer ce pour le transfert en bloc de problème