Es muy sencillo, el PIC por el rx puede recibir muchos caractares provenientes del SIM800L, necesitaría una ram muy extendida para almacenarlos todos, yo lo que hice fue configurar un array con 20 variables que se llama dato_recibido, cada que entra un caracter un contador se va incrementando y el dato recibido es llevado a este array en la posición correspondiente al contador, siempre se compara el caracter que llega con el ASCII '*', si son iguales se reinicia el contador, cuando llega el ASCII '#' se finaliza la recepción y se llama la rutina decodificar, donde se compara los datos del array con mis palabras claves y si son iguales realiza la función.
Debes ir verificando el valor del contador, ya que si se pasa de 20 se desborda el array
Yo hice mis pruebas llevando primero los datos del SIM a mi PC y verificando que llegue el dato enviado, luego desde el PC le envié datos al PIC, por último conecté el SIM800L con el PIC, como no me funcionó fue entonces que descubrí que era un tema de niveles lógicos, yo lo resolví con transistores para pasar los niveles de 2.8V a 5V.
No sé si alguien más haya tenido este inconveniente y como lo solucionaron
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx() //por el usart
{
int respaldo;
respaldo = getc();
if(respaldo == '*')
{con_recepcion = 0; modo_recepcion = 0;}
dato_recibido[con_recepcion] = respaldo;
if(respaldo == '#')
{decodificar();}
con_recepcion++;
if(con_recepcion == 19)
{con_recepcion = 0;}
}
///////////////////////////////////////////////////////////////////////////////
void decodificar()
{
if(dato_recibido[1] == 'S' && dato_recibido[2] == 'I')
{
output_high(buzzer);
}
if(dato_recibido[1] == 'N' && dato_recibido[2] == 'O')
{
output_low(buzzer);
}
}