Cuando se trata de puertos emulados, kbhit devuelve 1 cuando detecta el start bit y tienes que andarte rápido para inmediatamente empezar a recibir el carácter.
No es lo mismo que un puerto hardware donde kbhit devuelve 1 cuando se ha recibido un carácter y se ha almacenado en el fifo.
En tu caso en vez de poner un if (kbhit); Lo que haría sería: while(!kbhit);
Esto hará que el programa quede en espera del carácter.
Si no quieres dejar el programa ahí congelado esperando el carácter, pues acelerar un poco el barrido cambiando el if (flag == 0) por un while(flag == 0), de ese modo barrera solamente el bloque de arriba.
El de abajo no tienes por que estar comprobándolo constantemente por que está claro que flag nunca va a valer 1 a no ser que arriba se haya recibido una cadena completa.
Con un while, en cuanto flag valga 1 se corta el bucle y se continúa.
Lo de que si lee uno puerto, pero no el otro puede ser por que no le estás dando el stream al getc(); , si estás recibiendo por RF1, pon getc(RF1) de lo contrario por defecto se recibe del último puerto usado, y kbhit no hace uso del puerto, menos aún emulado.
Saludos.