Bueno, pues al final me he dado cuenta del fallo.
Estaba empeñado en que era el kbhit, pues contador valía 0xFF después de salir del bucle.
Pero no era así, el problema es que tal y como estaba escrito, decrementando contador después de testearlo), el programa sale del bucle cuando contador es 0, pero se decrementa una vez más pasando a ser 0xFF.
Así pues luego no podía distinguir el timeout de cuando ya hay un caracter esperando antes de iniciar el bucle.
El código correcto sería este:
inline char esperarCaracter(void)
{
byte contador= 0xFF;
while( --contador && !kbhit(rs485) );
if(contador) return rs485getc();
return '\0';
}
Donde decremento antes de la comparación, por lo tanto contador sale con valor 0 y no 0xFF.
Pues sí que me ha costado detectar este fallo. Estaba emperrado con el kbhit() y repasando las resistencias y demás que tenía puestas con el max485
Y es que depurar los programas con el debugger de mplab se me hace muuuuy complicado, debido a su falta de recurso, sólo poder poner un punto de parada, y no poder ver ni quién ha llamado a la función en curso.
Bueno, me imagino que es cuestión de ir adquiriendo experiencia con el entorno y con los pics.
De todas formas me gustaría saber si hay algún entorno de depuración claramente mejor, aunque cueste un dinero considerable, pues de continuar con estos temas de pics me plantería muy seriamente su adquisición.