// CONTROL DEL BUFFER ORIGINAL DE RED_PIC Y "destrozado por Santipic"
// Por el puerto serie me entra esta secuencia de caracteres cada 2 segundos
// $GPGGA,194345.0,,,,,0,02,,,,,,,*74 y quiero meterla en el buffer y de ahí poder
// recuperla y enviarla otra vez por el puerto serie.
#include <18f2550.h> // Definiciones del PIC 18F2550
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(clock=8000000) // Oscilador a 8Mhz
#include <stdlib.h>
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=100; // 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 echos(char c); // Eco selectivo sobre RS232
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(); // lo descargo y ... addcbuff(rcvchar); // lo añado al buffer y ...
}
}
// Desarrollo de Funciones ////////////////////////////////////////////////////
int addcbuff(char c){ // Añade a cbuff -----------------------
switch(c){
case 0x0D: // Enter -> Habilita Flag para procesar
flagcommand=1; // Comando en Main
break;
case 0x08: // Del -> Borra último caracter del Buffer
if(xbuff>0) cbuff[--xbuff]=0x00;
break;
case 0x01B: // Esc -> Borra el Buffer completamente
inicbuff();
break;
default:
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
}
}
void inicbuff(void){ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
cbuff[i]=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el indice de siguiente
// caracter
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
printf("\r\n\** prueba buffer **\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, xv;
char arg[lenbuff]; // Argumento de comando (si lo tiene)
disable_interrupts(int_rda);
flagcommand=0; // Desactivo flag de comando pendiente.
printf("\r\nProcesando ... "); // Monitorizo procesando ...
xbuff=0x00; //Lo que necesito hacer es scanear el buffer para
for (cbuff[0];xbuff='$';xbuff=0x4A){ //extraer la cadena de caracteres que me interesa
printf("\r\nfor ... "); // Prueba de que pasa por aquí i=0;
do{
// Extraemos argumento del buffer
arg[0]=xbuff ; //
}while(cbuff[++i] == 0x4A);
printf("Escribiendo %s %u ... ",arg
,xv
); } // Monitorizamos el argunmento.
inicbuff(); // Borro buffer.
printf("Procesado.\r\n\r\n"); // Monitorizo procesado. enable_interrupts(int_rda);
}