Hola Badtzdizzy, gracias, ya he probado 8 ejemplos de recepción pero no conseguido nada, alguno me echa los datos del buffer cuando quiere y no todos ni en el mismo orden.
Las tramas que lanza supongo que ya las conoces, lo he programado para que salga solo esta y la echa cada segundo:
$GPGGA,204358.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*6D
$GPGGA,204400.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*67
$GPGGA,204402.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*65
$GPGGA,204404.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*63
$GPGGA,204406.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*61
$GPGGA,204408.0,4319.142,N,00823.040,W,1,04,1.85,00047,M,-019,M,,*6F
Al menos me evito todas las demás.
Pongo tambien el último ejemplo que estoy utilizando ( tomado de un código del fenomenal Red_Pic, por cierto REd-Pic ya sé que lo he roto, ¡¡no me eches a los leones!!!!!!!!pero es con intención de aprender), ya le hice muchos cambios pero no me va.
Trato de leer dos G y luego meter el resto en el buffer, pero seguro que esoy haciendo algo mal.
El ejemplo es el siguiente:
#include <18F2550.h> // Definiciones del PIC 16F876A
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(clock=8000000) // Oscilador a 4 Mhz
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
#use fast_io(A)
#use fast_io(b)
#use fast_io(c)
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=90; // Longitud de buffer, Ajustar
// a lo que desees (o te sea posible)
// VARIABLES EN RAM ///////////////////////////////////////////////////////////
int xbuff=0x00; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00; // último caracter recibido
int1 flagcommand=0; // Flag para indicar comando disponible
// Declaración de Funciones ///////////////////////////////////////////////////
void inicbuff(void); // Borra buffer
int addcbuff(char c); // añade caracter recibido al buffer
void procesa_comando(void); // Procesa comando
// INTERRUPCIONES /////////////////////////////////////////////////////////////
#int_rda
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc();
if (rcvchar == 'G')
{
{
addcbuff(rcvchar);
rcvchar=0x00;}
if (rcvchar == 'G'){
addcbuff(rcvchar);
rcvchar=0x00;}
do{
rcvchar=getc();
addcbuff(rcvchar);
}
while(rcvchar == 0x0d);
}
}
}
// Desarrollo de Funciones ////////////////////////////////////////////////////
void inicbuff(void){ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
cbuff=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el indice de siguiente
// caracter
}
int addcbuff(char c){ // Añade a cbuff -----------------------
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
flagcommand=1;
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
inicbuff(); // Borra buffer al inicio
printf("\r\n\** RS232 Buffered **\r\n\r\n"); // Presenta menú
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global); // Habilita interrupciones
do {
if(flagcommand) procesa_comando(); // Si hay comando pendiente
// de procesar ... lo procesa.
} while (TRUE);
}
// Procesador de Comandos /////////////////////////////////////////////////////
void procesa_comando(void){
int i;
char arg[lenbuff]; // Argumento de comando (si lo tiene)
flagcommand=0; // Desactivo flag de comando pendiente.
printf("\r\nProcesando "); // Monitorizo procesando ...
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
arg=0x00; // caracteres en el argumento
}
do{ // Extraemos argumento del buffer
arg[0]=cbuff; //
}while(cbuff[++i]!=0x00);
printf("Escribiendo ",arg);//
// Monitorizamos el argunmento.
inicbuff(); // Borro buffer.
}
Pues ya ves Badtzdizzy, espero que alguien me pueda ir encendiendo alguna luz porque sino los tortazos que me voy a dar me van a dejar secuelas.
Bueno a ver como veis esto.
Saludos y gracias Badtzdizzy, gracias a todos.