No sé si lo he entendido bien y tengo un par de dudas. ¿Pretendes mandar por el puerto serie un mensaje cada 10 milisegundos? ¿Y de qué tamaño (en bytes) es cada uno de esos mensajes?
Lo pregunto porque si se trata de transmitir por el puerto serie “un mensaje” cada 10 milisegundos a 115200 baudios, configurado a 8 bits de datos y uno de parada: en el mejor de los casos se pueden transmitir, de media, un máximo de 128 bytes en cada mensaje.
8 bits de datos y uno de parada significa que para transmitir un byte se necesita enviar 9 bits. Los 115200 baudios significa que como máximo se envían 115200 bits en un segundo, con lo que en ese segundo se transmiten 12800 bytes (115200 / 9). Por lo que en un milisegundo serían 12.8 bytes (12800 / 1000). Así que en 10 milisegundos serían 128 bytes (12.8 * 10).
Los datos que se transmiten vía serie no se envían inmediatamente, sino que se copian en un buffer y se envía un byte tras otro hasta que el buffer se vacíe.
Por lo general el Arduino no se queda esperando a que se termine de enviar un byte para enviar el siguiente, para eso es el buffer, sino que se configura para que se genere una interrupción cada vez que se termina de transmitir un byte (siempre que se trate de un puerto serie “de verdad”, por hardware, y no uno emulado por software).
La transmisión por hardware se realiza entonces “por sí sola”, mientras continúa la ejecución normal del programa. Una vez terminada la transmisión de un byte se genera la interrupción, se “aparca” lo que se estaba haciendo, pone para enviar otro byte (si lo hubiera) y continúa con lo que se estaba haciendo. Vamos, que el enviar los datos que están en el buffer apenas detiene la ejecución del resto del programa.
Repito, cada vez que se quiere enviar algo por el puerto serie, se copia todo al buffer y continúa la ejecución del programa mientras se envía cada byte “de forma autónoma” e interrumpiendo la ejecución brevemente cada vez que se termina de transmitir un byte para “poner” el siguiente a transmitir. ¿Pero qué pasa si tratamos de poner más y más datos en el buffer de transmisión sin darle tiempo a que se transmiten? Pues que el buffer “se llena”. ¿Y si se llena se desborda? Pues no. Si está lleno simplemente “se espera” a que se vacíe para poder copiar los datos al buffer y continuar.
He ahí cuando aparecen los problemas. “Se espera” es que “se espera”. Y no hace otra cosa más que esperar a que se vacíe lo suficiente el buffer para “meter” los nuevos datos y continuar. Por lo que, si está esperando, no continúa con el resto del programa (a no ser que salte alguna interrupción) y se pasa el tiempo sin hacer otra cosa.
Así que supongo que se está llenando el buffer y deteniendo la ejecución porque envías por el puerto serie demasiados datos. Y como parece que mandas los paquetes UDP a intervalos de 10 milisegundos exactos y si se ha pasado un milisegundo ya no lo mandas y te esperas a que pasen otros 9 para mandar el siguente, tienes “pérdidas” de paquetes.
¿Posibles soluciones? Aumentar más la velocidad de transmisión (que no sé si el Arduino lo soportará) o asegurarse de mandar cada 10 milisegundos por el puerto serie “mensajes” de menos de 128 bytes. Incluso, para ir sobre seguro, de menos de 100 bytes ya que los 128 bytes cada 10 milisegundos sería “en el mejor de los casos”, dando por hecho que el Arduino “no se entretiene mucho” en preparar cada byte que se ha de transmitir (téngase en cuenta que la interrupción del puerto serie se puede “bloquear” temporalmente y no tiene porqué ser atendida inmediatamente).
Esto es lo que creo que te puede estar pasando, pero tal vez me equivoco.