¿Cuál es la mejor manera de recibir una respuesta no solicitada de GSM SIM900 en PIC18?

Estoy usando PIC18F2520y tratando de comunicarme con GSM SIM900. Estoy usando la interrupción UART para recibir datos del GSM. Estoy guardando cada byte en rxData. Ahora la mayoría de los comandos terminan con la respuesta OK. Pero hay algunos comandos que no responden OKcomo cuando recibimos una notificación de SMS de GSM, GSM envía la siguiente notificación

 +CMTI: "SM",2

Ahora bien, esta respuesta no tiene ningún OK. Cómo recibir datos en este caso. En mi aplicación necesito verificar los sms recibidos. Estoy usando el siguiente código:

void rx_handler(void)
{
  rxData[index] = ReadUSART();

  if(<some condition>)    //condition to check for sms notification
  {
    rxFlag = 1;        //set flag to process it in main loop

  }
  index++;

PIR1bits.RCIF==0;

}

Me estoy confundiendo sobre cómo verificar la notificación de sms. Hasta ahora, para otros comandos, estaba configurando la condición para OK, pero esto no tiene ninguna respuesta OK. Por favor ayuda.

ingrese la descripción de la imagen aquí

Tal vez todos los comandos (tanto las respuestas OK como las no solicitadas) realmente terminen con una nueva línea ('\n' o '\r' o "\r\n"). Entonces será fácil saber cuándo termina cada mensaje. .
sí, he intentado verificar \r \npero lo que sucede es que digamos que envío, AT\rpor lo que se detiene después de este comando y no espera una respuesta. Revisé el búfer durante la depuración y descubrí que almacena `AT \r \r \n`, por lo que debido a lo último se \r \ndetiene después de enviar el comando y no espera la respuesta de sim900
Del manual de comandos AT : "Los comandos generalmente van seguidos de una respuesta que incluye <CR><LF><response><CR><LF>"
@m.Alin He agregado una imagen. Puedes ver que tengo AT+CMGF?\rel comando enviar. Después del comando agrega \r \n. Entonces, si lo verifico, \r\nse detendrá aquí solo y no continuaré.
Así que simplemente ignora el primero \r\ny busca el segundo par que \r\nrecibes.
El SIM900 repite el comando que recibió, esta función se puede desactivar. Lo encontré bastante molesto en algunos casos. Pero de todos modos, habrá dos \r\nsecuencias, reconoce la primera y detente y la segunda como te ha dicho Alin.
Hasta donde yo sé, SIM900 tiene un pin llamado RI. El módulo da una señal específica (descrita en la hoja de datos) cuando se da una respuesta no solicitada.
@BenceKaulics @m.Alin Gracias. Usé este método de verificación doble para los comandos normales y está funcionando. Solo quiero confirmar que para los comandos no solicitados, todavía tengo que verificar el segundo par \r\no esos comandos solo responderán con \r\nsolo.
Supongo que esas respuestas también son las mismas, así que deberías comprobarlo. Por favor, si ha implementado una solución funcional, publíquela como respuesta, lo mismo para sus preguntas anteriores.
@BenceKaulics He agregado el código en la respuesta. Por favor, eche un vistazo a la lógica. Aunque funciona bien, pero si encuentra algún error, dígamelo.

Respuestas (1)

Gracias a @Bence Kaulics y @m.Alin. He resuelto el problema comprobando dos veces el archivo \r \n. El siguiente es el código que usé:

volatile int flag = -1;   
volatile int sFlag = 0; 
volatile int uFlag = 0;

void rx_handler(void)
{
    rxData[index] = ReadUSART();

    if(rxData[index]=='\n' && rxData[index-1]== '\r' )
    {
      flag = flag + 1;

      if(flag == 1)    
      {
         sFlag = 1;
      }
    }

}

index++;

PIR1bits.RCIF==0;

}

he usado un flag = -1. Entonces, cuando obtuve \r \nel valor de la bandera por primera vez, es 0. Y nuevamente, cuando obtuve \r \neso, significa que hemos detectado un final de línea y esto es lo que esperamos, así que configure sFlag = 1. Cuando sFlag = 1eso significa que hemos recibido los datos y ahora podemos procesarlos.

El código se ve bien. Pero creo que las respuestas no solicitadas solo tienen una \r\n. También tendrás que añadir una condición para ello.