Estoy tratando de recibir datos de un dispositivo personalizado basado en un chip FTDI 2232H.Android USB Host - bulkTransfer() está perdiendo datos
Estoy utilizando un modo Async FIFO simple, y la velocidad de datos entrantes es de 3.2MB/seg.
Todo funciona perfectamente con el código de prueba en mi PC, pero estoy teniendo problemas para recibir datos en mi Toshiba Thrive.
El controlador de Android de TDI falla, entonces estoy codificando usando Java.
Puedo recibir el 95% + de los datos perfectamente, pero de vez en cuando los datos 'sputters' y yo recibimos porciones de los mismos 4-5K de datos dos o tres veces, luego regresamos a buenos datos.
No estoy yendo demasiado rápido para Thrive o Android, porque previamente tenía los datos en doble (6.4MB/seg) y obtuvo aproximadamente el 95% de eso también. (Así que no debería tener ningún problema a la mitad de la velocidad).
Parece que hay algún tipo de error en el almacenamiento en búfer (o doble buffering) que ocurre dentro de Android. (No es el buffer dentro del FTDI 2232H porque los datos repetidos son más grandes que el buffer interno 4K del chip).
El código de configuración es simple, y de nuevo está funcionando ~ casi ~ perfectamente.
El bucle donde se produce la apropiación de los datos es muy 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;
}
En caso de que creo que es el tiempo de retardo para el arraycopy - Todavía perder los datos, incluso si comento esa línea.
El IN_BUFF_LEN es 16384 (bulkTransfer no devolverá más que eso, incluso si aumente el tamaño del inBuff).
El bigBuff es de varios megabytes.
Como una cuestión secundaria - ¿alguien sabe cómo pasar un puntero a bulkTransfer que poblarán bigBuff directamente --- en un desplazamiento (no comienza en la posición '0'
alguna solución a esta? –
Quizás Android es la recolección de basura durante esos tiempos y algo se está perdiendo. Compruebe su Logcat para ver si puede coincidir con lo que está sucediendo en el sistema operativo cuando pierde datos. – RightHandedMonkey
Problema extraño, porque si usa un FIFO nunca debería suceder. Porque cuando lee un FIFO, los datos se apagan. ¿Has intentado borrar el buffer cada vez antes de leer el FIFO? es decir, asegurarse de no leer los mismos datos dos veces, no fuera del FIFO sino de su búfer. – fonZ