Jejeje... me explico un poco mejor
Al principio lo que ponemos es lo típico pero fíjate en la palabra en
negrita:
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7,
ERRORS)
En la ayuda del CCS tenemos:
ERRORS
Used to cause the compiler to keep receive errors in the variable RS232_ERRORS and to reset errors when they occur.
If a baud rate cannot be achieved within 3% of the desired value using the current clock rate, an error will be generated. The definition of the RS232_ERRORS is as follows:
No UART:
· Bit 7 is 9th bit for 9 bit data mode (get and put).
· Bit 6 set to one indicates a put failed in float high mode.
With a UART:
· Used only by get:
· Copy of RCSTA register except:
· Bit 0 is used to indicate a parity error.
Es decir:
#int_rda
void serial_isr()
{
if ( rs232_errors & 0x04 ) // get framing error bit from Rx status reg
{
cRxErrorFlag=1;
}
if(kbhit())
{
Keypress=getc();
buffer_char(Keypress); // lo recibo y lo añado al Buffer de Recepcion
}
}
Y despues en el main puedes hacer el control del flag
cRxErrorFlagif(cRxErrorFlag==1)
{
printf("ERROR*ERROR#");
cRxErrorFlag=0;
}
Todo esto lo copié de un tio y me funcionó bien. Por el hecho de poner en el #use rs232 lo de
ERRORS la comunicación ya se reestablece sola y además... puedes descubrir que tipo de error se ha producido comprobando
rs232_errors.
0x04 para detectar el framing error y 0x02 para detectar el overrun error. Estos valores los puedes ver en el registro RCSTA. Se podría decir que es como si se copiara en la variable rs232_errors.
Este programa lo hice hace tiempo, en los que estoy haciendo ahora me gusta hacerlo a pelo con el registro RCSTA:
Los bits 0, 1 y 2 se encargan de la paridad, overrun y framing respectivamente.
Como dice Manolo lo más fácil es:
#byte RCSTA=0xFAB
Y después comprobar los bits 1 y 2 para ver el tipo de fallo.
Un cliente me volvió loco con que varios equipos se le colgaban. Hasta que no hice ese tratamiento de errores sufrí bastante. Por cierto, es muy fácil simular esos errores y comprobar como el PIC se queda KO (y como conseguimos rearmarlo, claro)
Haz un programa y en el bucle infinito estate continuamente mandando un caracter al ordenador, sin retardos y sin nada. Después pulsa una tecla del ordenador para mandarle un comando al PIC (
y mantenla pulsada). Cuando los datos empiezan a colisionar se arma la marimorena jejeje (aunque con un buen control de flujo creas que eso no puede suceder... mas vale prevenir que escuchar al cliente cabreao
)
Bueno, ya nos comentas.
Un saludo desde Alicante.