Hola!! Tengo el problema que cuando quiero almacenar los caracteres lanzados por un celular por puerto serie el programa se cuelga.
Uso el proteus con un Virtual terminal y un compim (simulador de puerto serie) conectados
que quizas pueda haber problemas aqui!!! DUDO AL CONECTARLOS!!
El PIC conectado al COMPIM y al VT para ver que es lo que se envia y lo que almacena pero
larga el comando inical pero no almacena nada!!!!
Correctamente le mando AT+CNMI? y el celular responde con (CR) +cnmi:3,0,0,0,0 (CR) OK (CR)
yo solo quiero almacenar algo!! por eso que cuando aparece una ,(coma) quiero ver que sale!!
El codigo funciona si lo lo pruebo directo apretando teclas, por eso, no entiendo en que le pifio
quizas no sea el comando adecuado o este mal la conexion!!
Les dejo parte a ver si me ayudan con una solución!!!
#include <16f628.h> // Definiciones del PIC 16F628
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(clock=4000000) // Oscilador a 4 Mhz
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)// RS232 Estándar
// CONSTANTES //
int const lenbuff=10; // Longitud de buffer, Ajustable
// 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/Inicializa buffer
int addcbuff(char c); // añade caracter recibido al buffer
void echos(char c); // Eco sobre RS232 (CON ESTO QUIERO VER POR VT )
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(); // recibo y almaceno en rcvchar
addcbuff(rcvchar); // agrego al buffer
echos(rcvchar); // hago eco
}
}
// Desarrollo de Funciones //
void echos(char c){ // Echo selectivo ----------------------
switch(c){
default: putc(rcvchar); // Echo de cualquier otro caracter
}
}
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 -----------------------
switch(c){
case 0x2c : // 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
delay_ms(500);
printf("at+cnmi?"); // Presenta menú
putc(0x0d);
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.
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
arg=0x00; // caracteres en el argumento
}
// if(cbuff[0]==0x0d && cbuff[1]==0x0a ){ // Esto es para comparar y tomar acciones
// segun el SMS que llega.... A FUTURO!!!
printf("\r\n\Ingresado %s\r\n\ ",cbuff); // Muestro lo almacenado (AQUI el problema no me
// muetra nada e el Virtual terminal
inicbuff(); // Borro buffer.
}
Desde ya muchas Gracias!!!
Hernanfire