Tal ves y mas que seguro es porque el tiempo consumido para :
- Generar el string que pedis, esto incluye pasar valores float a string que no es algo liviano ni rapido.
- Enviar todo el texto y encima quedarte en la interrupcion enviandolo, por que el fputs se queda encerrado alli hasta que se termine de enviar TODOS los datos que le pusiste.
Supera o posiblemente supere a la interrupcion del timer, es decir que podrian ocurrir 2 interrupciones mientras esta haciendose eso, de ocurrir esto apenas termine volveria a entrar a la interrupcion y seria algo de nunca terminar, jamas ejecutaria la parte de tu programa principal, por eso deshabilita las interrupciones.
Resumen:
Nunca pongas funciones bloqueantes y/o que consuman demasiado tiempo en una interrupcion. Para eso activa una flag y hacelo desde el programa principal.
Aclaro una cosa, no digo que no se pueda hacer, pero hay que tener cuidado.
La parte del envio si no queres que te bloquee el programa principal (por el fputs), lo podes hacer con la interrupcion del TX Y enviar desde un buffer.
Otro tema no hace falta que escribas TODO el texto cuando la mayoria son datos fijos:
"h0.val=%1.0f%c%c%c h1.val=%1.0f h2.val=%1.0f h3.val=%1.0f h4.val=%1.0f"Tenes 4 datos en fomato float, lo demas es fijo... porque darle todo el laburo de escribir todo de nuevo?