Hola, voy a empezar en algo parecido, lo tengo hecho en ASM y lo voy a pasar en C, pero recien empiezo en esto, te comento como lo hago: no uso interrupcione, primero busco la recepción del carácter, luego verifico si hay, la guardo y vuelvo a buscar, si no empiezo una rutina de delay por el ancho del byte decrezco un contador, que va a servir de veces para buscar, y vuelvo a buscar el dato en la recepción, así si por el byte 5, como ejemplo, se deja de transmitir el contador que decrezco con el delay llega a 0 y me saca de la función y me advierte de un error en la recepción.
No puedo comentarte sobre tu programa ya que estoy verde en C pero espero que lo que te comente te ayude a resolverlo.
Saludos