No, y la solucion es casi correcta, solo una cosa te dejo para que investigues..
....
mmmm tienes razón, si no lo hay, el pic se queda en es estado indefinido?
Ok, estoy usando un fragmente del código que me recomendaste anteriormente sobre de capturar una trama GPRMC
$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*4
#DEFINE SIZE_BUFFER_UART1 200 // Serial Buffer Size
#DEFINE SIZE_BUFFER_GPRMC 80 // Serial Buffer Size
enum letras
{
PRIMER_LETRA, // $
LETRA_G, // G
LETRA_P, // P
LETRA_R, // R
LETRA_M, // M
LETRA_C, // C
RESTANTE // .....
};
enum letras estado;
int counter_read2 = 0x00; // Serial Buffer Counter
char c=0x00;
char GPRMC_buff[SIZE_BUFFER_GPRMC];
char Receive_String_uart1[SIZE_BUFFER_UART1]; // Serial Buffer
#INT_RDA
void RDA_isr1() {
switch(estado){
case PRIMER_LETRA
: if(getchar(GPS
)=='$') estado
= LETRA_G
; break; case LETRA_G
: if(getchar(GPS
)=='G') estado
= LETRA_P
; break; case LETRA_P
: if(getchar(GPS
)=='P') estado
= LETRA_R
; break; case LETRA_R
: if(getchar(GPS
)=='R') estado
= LETRA_M
; break; case LETRA_M
: if(getchar(GPS
)=='M') estado
= LETRA_C
; break; case LETRA_C
: if(getchar(GPS
)=='C') estado
= RESTANTE
; counter_read2 = 0x00; break;
case RESTANTE:
if(c == '$'){ // Proximo "$"
disable_interrupts(INT_RDA);
memcpy(GPRMC_buff
,Receive_String_uart1
,SIZE_BUFFER_UART1
); estado = LETRA_G;
break;
}
Receive_String_uart1[counter_read2]=c;
counter_read2++;
break;
default: estado = PRIMER_LETRA; break;
}
}
Como resultado final obtengo, por ejemplo:
GPRMC_buff[]=",141538.00,A,0723.38675,N,07518.57989,W,43.536,23.45,240117,,,D*7D\n\r"
¿Cómo excluyo ese \n\r justo en llenado?
se me ocurre ir comparando con un if, pero no sé, corrígeme si estoy mal, tengo la idea de que tantos if es una mala practica de programación... mmm
if(c == '\n')||(c == '\r'{
Receive_String_uart1[counter_read2]='\0';
counter_read2++;
}