Cómo esperar '>' en formato de mensaje SIM900

Hola a todos, estoy tratando de enviar sms usando SIM900y PIC18F2520. Tengo un botón adjunto al pin de MCU. Entonces, cada vez que se presiona el botón, se debe enviar un sms. El siguiente es el código que estoy usando para enviar SMS:

if(PORTCbits.RC1==1)
{
  DelayMs(10);
  if(PORTCbits.RC1==1)
  {
    UARTsend("AT+CMGS=\"99********\"\r ");
    DelayMs(100);
    UARTsend("Hello World");
    DelayMs(10);
    UARTsend("\x1A ");
    DelayMs(10);
 }
}

Ahora, cuando lo ejecuto en modo de depuración, recibo sms. Pero cuando programo el dispositivo, lo que sucede es que envía AT+CMGSun comando y luego envía Hello worldy \x1A. Después de enviar todas estas cosas, se muestra >, lo que significa que ahora espera el contenido del mensaje. No sé por qué está sucediendo. He dado el retraso adecuado después de AT+CMGS. Intenté aumentar la demora pero nuevamente no hubo cambios. Como esperar >al enviar sms. Por favor ayuda

ingrese la descripción de la imagen aquí

La forma más fácil es escribir una función que devuelva el último carácter recibido en UART. Y luego bloquee con un bucle while: while(GSM_uart_recieve() != '>');. Por supuesto, se puede mejorar con un temporizador para crear una funcionalidad de tiempo de espera simple para garantizar que no se quede atrapado en el ciclo while si el módulo no responde.
También puede manejarlo con ISR, si desea una solución sin bloqueo. Por lo tanto, puede verificar todos los bytes recibidos en la interrupción completa de recepción de UART y establecer un indicador si >se recibe, y así sucesivamente.
Sí, he intentado recibirlo usando if(ReadUSART()=='>')y luego enviar sms. pero nunca entra en la condición if. He leído en alguna parte que sim900 también envía algunos <CR><LF> tal vez debido a que no entran en la condición if. Cómo procesarlos
¿ Cuál es el valor de retorno de ReadUSART()?
ReadUSART() devuelve un byte de UART. He resuelto parcialmente el problema al aumentar la demora a 5 segundos después del envío, AT+CMGSpor lo que ahora funciona, pero creo que esa no es la solución adecuada. Debería verificar si lee >y luego enviar el mensaje. lo estoy intentando
intente agregar un "\n" como este:"AT+CMGS=\"99********\"\r\n "

Respuestas (1)

Si está interesado en recibir cierto carácter en UART independientemente de la hora, consulte la sección de interrupción de UART. Puede hacer esto, - Habilitar la interrupción de recepción de UART. - En while (1) - Bucle infinito - Tan pronto como reciba datos, compruebe si se espera o no. (En su caso, será '>') -Y cuando reciba los datos esperados, puede deshabilitar la interrupción, detener la comunicación o continuar con otra tarea.