Domanda Android USB Host - bulkTransfer () sta perdendo dati


Sto cercando di ricevere dati da un dispositivo personalizzato basato su un chip FTDI 2232H.

Sto usando una semplice modalità FIFO asincrona e la velocità dei dati in entrata è di 3.2 MB / sec.

Tutto funziona perfettamente con il codice di prova sul mio PC, ma sto avendo problemi a ricevere dati sul mio Toshiba Thrive.

Il driver Android di TDI non funziona, quindi sto codificando con Java.

Riesco a ricevere perfettamente il 95% + dei dati, ma di tanto in tanto i dati "sputter" e ottengo parti dello stesso 4-5K di dati due o tre volte, quindi di nuovo a dati buoni.

Non sto andando troppo veloce per il Thrive o per Android, perché in precedenza avevo i dati in entrata al doppio (6,4 MB / sec) e ne ho ottenuto anche il 95%. (Quindi non dovrebbe avere problemi a metà del tasso.)

Sembra che ci sia una sorta di bug nel buffering (o double-buffering) che accade in Android. (Non è il buffer all'interno di FTDI 2232H perché i dati ripetuti sono più grandi del buffer interno del chip 4K.)

Il codice di installazione è semplice, e di nuovo funziona ~ quasi ~ perfettamente.

Il ciclo in cui si verifica la cattura dei dati è molto semplice:

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;
  }

Nel caso in cui si ritenga che sia il ritardo temporale per la copiatrice della matrice, io continuo a perdere i dati anche se commento quella linea.

IN_BUFF_LEN è 16384 (bulkTransfer non restituirà più di quello anche se aumento la dimensione di inBuff).

Il bigBuff è di diversi megabyte.

Come domanda secondaria: qualcuno sa come passare un puntatore a bulkTransfer che popolerà direttamente bigBuff --- a un offset (non partendo dalla posizione '0'?


35
2018-02-02 07:24


origine


risposte:


@Greg Ho lo stesso problema con un dispositivo USB a piena velocità e la correzione includeva un ritardo di 50 ms tra ciascun polling al buffer USB interno ANdroid.


3
2017-08-23 17:01



UsbConnection.bulktransfer (...) è bacato. Usa UsbRequest.queue (...) Api. Molte persone hanno riferito che l'utilizzo di bulk transfer non riesce direttamente attorno all'1% o al 2% dei trasferimenti di input.


3
2017-08-29 15:42



Giusto per chiarire alcuni degli approcci che ho provato ... Il codice USB ha funzionato nella sua stessa thread e gli è stata data priorità massima (nessuna fortuna) - Ho provato le chiamate API, libUSB, nativo C e altri metodi (senza fortuna) - I bufferizzato, interrogato e messo in coda (senza fortuna) - alla fine ho deciso che Android non poteva gestire i dati USB ad "alta velocità" (costante 3.2 MB / sec senza controllo di flusso). Ho costruito un buffer FIFO hardware da 8 MB nel mio progetto per rimediare. (Se pensi di avere una risposta, immagina qualcosa che alimenta i dati a 3.2MB / sec e vedi se Android può gestirli senza NESSUN singhiozzo. Sono abbastanza sicuro che non sia possibile.)


2
2018-02-18 06:28



In Nexus Media Importer posso spingere costantemente circa 9 MB / s, quindi è possibile. Non sono sicuro che tu abbia il controllo della sorgente, ma potresti voler interrompere il feed in blocchi di 16K con una sorta di intestazione in sequenza in modo da poter rilevare blocchi mancanti e danneggiamenti.

Inoltre, non stai controllando la presenza di len <0. Non sono sicuro di cosa succederà se lo stack sottostante ottiene un NAK o un NYET dall'altra parte. Ne ho abbastanza che ho il codice di ripristino per gestire questo.

Ho guardato a lungo e duramente per un modo per compensare il buffer di destinazione bulkTransfer, ma devo ancora trovarlo. A proposito: USBRequest.queue () non rispetta il ByteBuffer.position ().

Sono un po 'sorpreso che possiamo fare 16K su bulkTransfer in ogni caso. Secondo la specifica USB 2.0, il massimo dovrebbe essere 512 byte per un endpoint bulkTransfer. Android raggruppa i bulkTransfer o stiamo violando le regole?


1
2017-07-02 20:52



Devi essere sicuro che non ci siano altri tipi di traffico - sullo stesso bus - con priorità più alta del tuo traffico.


0
2018-02-18 03:02