Dos problemas con tu codigo, en realidad es ilogico lo que estas haciendo, y una ves que te lo explique espero que te des cuenta del error que tenes.
Veamos que haces:
- Llamas a la funcion SendATCommand
- Limpias el buffer de recepcion
- Envias el comando "AT\r"
Y luego esperas por un flag que se ponga en 1.
Aca es donde comienza a fallar todo. Por que no recibis TODO completo en una interrupcion, recibis caracter a caracter. El problema esta en esto:
#int_rda
void serial_isr() {
if(kbhit()){
}
flag_RptaCommand = 1;
}
Segun el codigo apenas entre a la interrupcion, reciba o no algo procede a poner en 1 el flag.
Al ponerlo en 1 solo recibiste 1 caracter y no todo el string!
Este es el primer errorLa funcion Add_bufferRX, tambien posee un error:
void Add_bufferRX(char c){
switch(c){
case 0x0D:
break;
case 0x0A:
break;
default:
bufferRX[indBufferRX++]=c;
}
}
Un string en C se espera que termine con un caracter nulo, es decir si esperas un OK en tu array deberias tener 'O','K','\0', para poder compararlo, pero en ningun momento terminas ese el array en nulo, tal ves porque pensaste que al ponerlo a todos como caracter nulo iba a servir, lo cual es cierto, pero nos trae a otro problema.
En ningun momento indBufferRX vuelve a 0. Es decir si recibis "AT\r\nERROR\r\n" en tu array vas a tener "ATERROR" y asi hasta que se desborde el array y tengas un problema aun mayor.
Este es tu segundo errorSeguido recien alli comparamos. y vemos si se cumplio o no.
-------------------------------------------------------------
Mejoras
En ves de usar:
void Ini_buff_rec(void){
int i;
for(i=0;i<maxLongBuffRX;i++){
bufferRX[i]=0x00;
}
indBufferRX=0x00;
}
Podes usar:
memset ( bufferRX
, 0, sizeof bufferRX
); indBufferRX = 0;
---------------------
Esto:
Se puede resumir en :