Bueno, pues muchas gracias a los que me habéis ayudado.
Estuve mirando lo de procesar los comandos.
He encontrado varias formas de hacerlo.
1.- Sin interrupciones, dedicando el programa principal a comprobar la recepción de comandos y a su interpretación.
Funciona, pero tiene el inconveniente de no poder hacer otra cosa mientras tanto.
2.- Mediante las interrupciones RDA. Efectivamente hay que leer el caracter en la propia interrupción.
Eso complica algo las cosas, pues la subrutina de interrupción ha de ser bastante rápida (para evitar que otras interrupciones externas que tengo activadas como el cambio de la puerta B para detectar los cambios de estado en los encoders) no sean atendidas.
Por tanto debería de limitarse a leer el caracter y almacenarlo de forma que luego el cuerpo principal del programa sea el que interpreta el comando.
El problema es que es necesario un buffer (que en mi caso podría ser grande y depende del comando recibido) o bien una especie de máquina de estado.
Encontré una forma mejor:
3.- Usando las funciones RTOS de tiempo real del CCS. Con esto, no activo la interrupción RDA, sino que dedico una tarea a procesar los comandos exclusivamente, que en puntos estratégicos va usando un rtos_await(kbhit()) para saber si se ha pulsado una tecla pero liberando el procesador y permitiendo que se ejecuten otras tareas mientras no se pulse una tecla.
Sigo usando interrupciones en la puerta B, que se limitan a incrementar o decrementar contadores cuando el encoder se mueve y otra tarea que se ocupa de hacer lo que haya que hacer cuando un contador se modifica (a la que se avisa de dicha modificación mediante un flag que se testea mediante rtos_await(flat==true)).
Parece que la cosa funciona bien por ahora.