Les cuento mi caso, yo trabaje con el SIM900 y de igual forma tenia muchos comandos AT y la mayoria de respuestas eran de longitud variable, pero lo que siempre tenia en cada respuesta, eran los caracteres 0x0D y 0x0A, citando un ejemplo (para el sim900)
Al enviar el comando AT+CREG?
Se tiene que recibir +CREG: 0,1
y luego se recibe un OK
Este comando sirve para saber si el modulo se conecto a la RED
los valores en HEX de +creg: 0,1 OK
0D 0A 2B 43 52 45 47 3A 20 30 2C 31
0D 0A 0D 0A 4F 4B
0D 0Asi se dan cuenta cada frase esta encerrada entre 0D 0A, es por ello que en mi codigo recibo cada byte y lo comparo con 0A que justamente es el ultimo byte en recibir, y lo discrimino creando un registro (cnttrama), el cual tiene que tener el numero de cadenas que se tiene que recibir, ya que de antemano uno tiene que saber que espera recibir, en este caso en particular (la funcion CREG) se espera recibir 2 cadenas (+CREG: 0,1 y luego OK), cada vez que se reciba un 0A el cnttrama se decrementa, cuando se hace cero, se pone un flag (flagresp=1) para que al salir de la interrupcion se analize la respuesta recibida, el valor real que tiene que ser cargado en "cnttrama" es 4 (para este comando en particular), ya que se espera recibir 4 bytes de 0x0A y este valor se carga antes de lanzar el comando AT
Aqui pedazos del codigo
#INT_RDA
void recepcion_rxd(){
if(kbhit()){ // Si hay algo pendiente de recibir ...
add_2_cbuff(getc()); // lo descargo yañado al buffer y ...
}
}
La funcion principal es "add_2_buff" que es la que recoge y une todo lo recibido
// Añade a cbuff -----------------------
void add_2_cbuff(char c){
switch(c){
case 0x0A: // Enter -> Habilita Flag para procesar comando
cnttrama--;
if(cnttrama==0){
flagresp=1;}
break;
case 0x0D:
break;
case 0x3E: //simbolo ">" que es la habilitacion para escribir SMS
break;
default: // Añade caracter recibido al Buffer
if (xbuff<=78){
cbuff[xbuff++]=c;}
else if ((xbuff>=79)&&(xbuff<=101)){
smsbuff[(xbuff++)-79]=c;}
else{
smsbuff[18]=c;}
CNTRXD++;
}
}
algunos detalles: cbuff es el buffer de recepcion (80 bytes) si lo que se recibe sobrepasa esto (en el caso de recibir SMS) todos los bytes que se desbordan solo llegan a la ultima posicion
Aqui se hace la comparacion, como se daran cuenta con la funcion "add_2_cbuff" se unen las 2 cadenas y asi es mas facil el analisis
strcpy(xcommand,"+CREG: 0,1OK");
if(!strncmp(cbuff,xcommand,12)){
// Aqui su codigo si recibieron la frase exacta.
}
else{
// Aqui su codigo si hubo error.
}
}
Si desean mas detalles o los formatos de respuesta (SIM900) o algo del codigo que no entiendan me avisan