Sto provando a ricevere dati da un dispositivo personalizzato basato su un chip FTDI 2232H.Host USB Android - bulkTransfer() sta perdendo dati
Sto utilizzando una semplice modalità FIFO asincrona e la velocità dati in ingresso è 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 utilizzando 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 arrivo 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 avviene all'interno di Android. (Non è il buffer all'interno dell'FTDI 2232H perché i dati ripetuti sono maggiori del buffer interno del chip 4K.)
Il codice di installazione è semplice, e funziona ancora ~ quasi ~ perfettamente.
Il ciclo in cui si verifica l'grab di 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 pensa che è il tempo di ritardo per l'arraycopy - Perdo ancora i dati anche se io commento che la linea fuori.
IN_BUFF_LEN è 16384 (bulkTransfer non restituirà più di quello anche se aumento la dimensione di inBuff).
Il bigBuff è di diversi megabyte.
Come una questione secondaria - qualcuno sa come passare un puntatore a bulkTransfer che popoleranno direttamente bigBuff --- ad un offset (non a partire dalla posizione '0'
qualsiasi soluzione a questo? –
Forse Android è spazzatura in quei momenti e qualcosa si sta perdendo. Controlla il tuo logcat per vedere se è possibile abbinare ciò che sta accadendo nel sistema operativo quando si perdono dati. – RightHandedMonkey
Strano problema, perché se si utilizza un FIFO non dovrebbe mai accadere. Perché quando leggi un FIFO i dati si spengono. Hai provato a cancellare il buffer ogni volta prima di leggere la FIFO? Ad esempio assicurandoti di non leggere gli stessi dati due volte, non dalla FIFO ma dal tuo buffer. – fonZ