Autor Tema: kbhit retorna true sin ningún caracter recibido ¿es un bug?  (Leído 5612 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ariznaf

  • PIC10
  • *
  • Mensajes: 23
kbhit retorna true sin ningún caracter recibido ¿es un bug?
« en: 14 de Mayo de 2010, 10:33:54 »
PIC: 18f886
compilador: CCS 4.104

Tengo una linea rs485 llamada rs485 en RC0 (tx) y RC1 (rx) y RC2 como activación de transmisión.
Esas lineas las tengo conectadas a un max485 y a otros pics a través de un bus 485.

La uart la tengo ocupada para otras cosas, así que la comunicación se hace por software.

Cuando los otros pics están escuchando y respondiendo, el programa funciona y transmite y recibe los caracteres.

El problema surge cuando los otros aparatos están desconectados (para simular un fallo de comunicación).
El caso es que cuando uso la función kbhit para saber si tengo un caracter de respuesta, la función retorna TRUE y entonces mi programa
se pone a leer el caracter recibido (que en realidad no ha recibido el bit de inicio y por tanto no existe ninguno) y se queda esperando indefinidamente.

Os pongo el código:

Código: [Seleccionar]
//Puerto serie para la comunicación RS485 con las estaciones
//Utilizar RC2 como pin de habilitación durante la transmisión
//de manera que el canal RS485 se ponga en modo de transmitir cuando se escribe y recibir cuando se lee
#use rs232(baud=19200,parity=N,xmit=PIN_C0,rcv=PIN_C1,bits=8,enable=PIN_C2,stream=rs485)

...................

inline char esperarCaracter(void)
{
byte contador= 0xFF;
while( !kbhit(rs485) && contador-- );
if(contador) return fgetc(rs485);
return '\0';
}


................

//Esperar por el caracter '['
do {
c= esperarCaracter();
    //Si nos devuelve '\0' es que ha habido un timeOut;
if( c== '\0') {
*pos= '\0';
comando.error= errComTimeOut;
return; //No han contestado en el tiempo esperado
}
} while(c!= '[');

..........

La función esperarCaracter() comprueba si hay un caracter decrementando el contador de cada vez.
Si el contador llega a cero, devuelvo \0 indicando un timeout.
Si kbhit() indica que hay un caracter disponible (lo que en la implementación software sin la uart debería de producirse al recibir el bit de inicio) paso a leer el caracter y devolverlo.

El caso es que cuando no hay contestación, no se produce el timeout, pues keybhit() devuelve true.

¿Sabéis el motivo?
Gracias por las respuestas. LLevo varios días bloqueado con esto.

Desconectado ariznaf

  • PIC10
  • *
  • Mensajes: 23
Re: kbhit retorna true sin ningún caracter recibido ¿es un bug?
« Respuesta #1 en: 15 de Mayo de 2010, 07:33:59 »
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:

Código: [Seleccionar]
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.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: kbhit retorna true sin ningún caracter recibido ¿es un bug?
« Respuesta #2 en: 15 de Mayo de 2010, 10:56:39 »
Hombre, felicitaciones por resolverlo
 :-/ :-/ :-/ :-/ :-/ :-/

Respecto al debug, has probado el Proteus ISIS? Es buen software de simulación. Si quieres también averigua sobre RealIce de Microchip, creo que es un debuger en tiempo real .... claro que debe costar su pasta.

Saludos
El papel lo aguanta todo

Desconectado ariznaf

  • PIC10
  • *
  • Mensajes: 23
Re: kbhit retorna true sin ningún caracter recibido ¿es un bug?
« Respuesta #3 en: 15 de Mayo de 2010, 14:43:46 »
Gracias.

El Proteus sí que lo he probado, lo usamos para el diseño de los circuitos.
Pero para simulación no lo he utilizado mucho, simplemente por que no sé manejarlo bien.
En concreto, estoy usando en este proyecto encoders, y no he sabido encontrar en el Proteus algo que me simulara un encoder y funcionara durante la depuración.

Tendré que dedicarle (en cuanto acabe este apurón) un poco de tiempo a ver si cojo los conceptos básicos.
Lo de los emuladores de Microchip, si seguimos usando pics en proyectos, sí que me lo plantearé en serio, aunque no son baratos y hay que comprar uno diferente para cada pic.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: kbhit retorna true sin ningún caracter recibido ¿es un bug?
« Respuesta #4 en: 15 de Mayo de 2010, 16:08:20 »
Enhorabuena por haber encontrado tu error (por cierto: es un error muy usual y todos hemos caído en él alguna vez)

Un método barato para depurar que yo uso mucho es montar una salida RS232 y enviar por ahí datos en los puntos que deseo testear, lo llamo mi monitor de campaña y me dice qué valor tiene esta o aquella variable en según qué circunstancias.

Aunque utilicemos PIC's con una sola USART trabajando con CCS es fácil montar una salida RS232 por software con cualquier pn que tengamos libre.  :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania