Tras implementar el GPS descubro que empiezo a tener problemas de latencia variable. La latencia se mantiene en 8ms pero aparecen picos de unos 20ms.
En el programa hay un temporizador que envía los datos de los sensores cada 4ms y si hay datos GPS envía los del GPS justo después. Los datos de los sensores tardan 2.7ms en enviarse pero los del GPS tardan casi 12 ms!!!!
Pongo un esquema hecho en paint para entender mejor el asunto
Si transmito todo justo después (es lo más normal) el puerto serie se queda ocupado durante 12 ms más. El temporizador después de los 4ms vuelve a saltar y se encuentra el puerto serie ocupado y ¡se pone a esperar perdiendo 3 transmisiones de datos! La solución es fácil de decir pero difícil de implementar.
Ampliar la velocidad del puerto no puedo porque el conversor serie da problemas con el full duplex y acaba siendo peor el remedio que la enfermedad. Esperar no es aceptable pues introduce latencia variable y poner otro puerto serie aumenta la complejidad del sistema.
Sólo queda por tanto una opción: dividir la información del GPS en bloques más pequeños y transmitirlos en el slot de tiempo que nos queda libre. La velocidad de actualización de datos del GPS es menor que la de los sensores y actualmente no hay ningún módulo comercial que pase de los 10Hz.
Calculo el número de slots que necesito y me da 10 slots. Utilizando 10 slots tendría un frecuencia de actualización de 25Hz. Utilizaré 15 slots que me dará un frecuencia aproximanda de 16Hz así me aseguro que no hay problemas con la señalización y que el puerto serie está disponible para el próximo ciclo.