Despues de casi dos semanas tratando de atrapar al "gato negro en el cuarto negro" lo logré!
El problema se presentaba cuando a la maxima velociadad de transmision (57600 bps) la interrupcion del temporizador era llamada, por muy corta que fuera la interrupcion, se seguia presentando el problema, de forma que haciendo calculos, el resultó que el tiempo necesario para guardar el contexto para saber donde regresar era suficiente para perder un bit (y por ende, recibir ese byte incorrectamente).
La interrupcion estaba pensada para contar el tiempo transcurrido desde la llegada del ultimo byte, cuando ese tiempo excedia cierto valor (algo asi como 5 veces el tiempo de un byte) se encendia la bandera para autorizar el envío del buffer completo. En otras palabras, servia para no enviar byte por byte sino esperar antes de enviar para ver si habia mas bytes por recibir y asi transmitir el buffer completo una vez se hubiera finalizado una recepción.
Esta espera DEBIA hacerse, asi que habia que encontrar la forma de seguir contando el tiempo, en total intenté tres metodos, el que funcionó fue el que no entra a la interrupcion.
a. Cada vez que se recibe un caracter se resetea el Contador del timer, es decir, cada vez que se recibe un byte, se inicia de nuevo el conteo desde cero.
b. Cada vez que se entra a la interrupción se compara el numero previo y actual de elementos en el buffer de entrada, si son iguales quiere decir que ha pasado un tiempo razonable sin recibir ningun dato nuevo, entonces se autoriza la el envío del buffer.
c. Cada vez que se recibe un caracter se resetea el Contador del timer y en el ciclo principal se pregunta si el valor del Contador del Timer es mayor que cierto numero, cuando es afirmativo, se autoriza el envío, sino, sigue esperando bytes. Es decir, todo se hace en el ciclo principal, sin ir a atender a ninguna interrupcion, simplemente dejando contar al timer y preguntando por el en el momento que es seguro que no se esta recibiendo ningun byte
No comments:
Post a Comment
I would be glad to know your opinion about my post, please do not forget to sign it ;)