#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=20M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=64; // 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=fgetc(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
}
}
// Desarrollo de Funciones ////////////////////////////////////////////////////
void inicbuff(void){ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){
cbuff[i]=0x00;
}
xbuff=0x00;
}
int addcbuff(char c){ // Añade a cbuff -----------------------
switch(c){
case 0x0D: // Enter -> Habilita Flag para procesar
flagcommand=1; // Comando en Main
break;
default:
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
}
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
inicbuff(); // Borra buffer al inicio
printf("\r\n\Inicializando el Controladorr\r\n");
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global); // Habilita interrupciones
do {
if(flagcommand)
procesa_comando();
} while (TRUE);
}
// Procesador de Comandos /////////////////////////////////////////////////////
void procesa_comando(void){
char arg[lenbuff];
flagcommand=0;
if(cbuff[0]=='O'&&cbuff[1]=='K'){ // Comparo inicio del buffer con comando "OK"
printf(">MSG1");
}
if(cbuff[0]=='A'&&cbuff[1]=='B'&&cbuff[2]=='C'&&cbuff[3]==' '&&cbuff[4]=='O'&&cbuff[5]=='K'){ // Comparo inicio del buffer con comando "ABC OK"
printf(">MSG41");
}
if(cbuff[0]=='A'&&cbuff[1]=='B'&&cbuff[2]=='C'&&cbuff[3]==':'&&cbuff[4]=='9'&&cbuff[5]=='K'&&cbuff[6]==' '&&cbuff[7]=='O'&&cbuff[8]=='K'){ // Comparo inicio del buffer con comando "ABC:9 OK"
printf(">MSG8");
}
inicbuff(); // Borro buffer.
}
printf("%s",cbuff);
#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=20M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=64; // 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
void 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
// Si hay algo pendiente de recibir ...
rcvchar=fgetc(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
}
// Desarrollo de Funciones ////////////////////////////////////////////////////
void inicbuff(void){ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){
cbuff[i]=0x00;
}
xbuff=0x00;
}
void addcbuff(char c){ // Añade a cbuff -----------------------
switch(c){
case 0x0D: // Enter -> Habilita Flag para procesar
flagcommand=1; // Comando en Main
break;
default:
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
}
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
inicbuff(); // Borra buffer al inicio
printf("\r\n\Inicializando el Controladorr\r\n");
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global); // Habilita interrupciones
do {
if(flagcommand)
procesa_comando();
} while (TRUE);
}
// Procesador de Comandos /////////////////////////////////////////////////////
void procesa_comando(void){
flagcommand=0;
if(cbuff[0]=='O'&&cbuff[1]=='K'){ // Comparo inicio del buffer con comando "OK"
printf(">MSG1");
}
if(cbuff[0]=='A'&&cbuff[1]=='B'&&cbuff[2]=='C'&&cbuff[3]==' '&&cbuff[4]=='O'&&cbuff[5]=='K'){ // Comparo inicio del buffer con comando "ABC OK"
printf(">MSG41");
}
if(cbuff[0]=='A'&&cbuff[1]=='B'&&cbuff[2]=='C'&&cbuff[3]==':'&&cbuff[4]=='9'&&cbuff[5]==' '&&cbuff[6]=='O'&&cbuff[7]=='K'){ // Comparo inicio del buffer con comando "ABC:9 OK"
printf(">MSG8");
}
inicbuff(); // Borro buffer.
}