Interfaz serie / Verificación de respuesta AT entre los módulos MCU y SIM808 / SIM800C

0

Tengo dos placas que usan un microcontrolador PIC32MX [470F512L, que funciona a 100MHz], una tiene un SIM808 (GPRS + GPS) y la otra tiene un módulo SIM800C (solo GPRS).

El microcontrolador usa 2 puertos serie (ambos UARTs @ 115200bps), uno para ellos, módulo SIM y otro para la interfaz con una PC usando un convertidor de USB a serie. Como esa es la primera vez que tengo que conectar la MCU con un módulo SIM, hice lo siguiente para las pruebas iniciales con comandos AT: cada byte que recibe la MCU desde la PC se retransmite al módulo SIM, y cada byte que la MCU recibir desde el módulo SIM se retransmite a PC. Así es como el PIC32MX es una puerta de enlace de puerto serie entre la PC y el módulo SIM. Puedo enviar comandos AT desde el terminal serial de la PC al módulo SIM y observar sus respuestas, como [0x0D 0x0A "OK" 0x0D 0xA]. Eso está bien para pruebas simples. El módulo SIM se conecta correctamente a GPRS y obtiene una IP. Además, puedo enviar SMS y hacer llamadas.

Mi duda es cuando quiero conectar la MCU directamente con la SIM, analizando sus respuestas. Vi respuestas para comandos AT con patrones como [0x0D 0x0A "respuesta" 0x0D 0xA] y [0x0D 0x0A "respuesta" 0x0D 0xA 0x0D 0xA]. Además, el módulo puede enviar un URC para el MCU en cualquier momento, y me gustaría distinguir un URC de una respuesta AT normal. Una duda: ¿existe la posibilidad de recibir un URC entre el comando enviado por la MCU y la respuesta para el comando?

Estaba pensando en cómo debería tratar la recepción en serie en la MCU:

  • Puedo usar un búfer en la RAM para almacenar los bytes recibidos de la tarjeta SIM y luego analizar las respuestas almacenadas, pero aquí podemos tener respuestas AT + URC juntos.
  • En realidad, actualmente estoy usando un búfer en la RAM de MCU para almacenar los bytes recibidos de la SIM, y tengo una función de tiempo de espera, es decir, la SIM envía la respuesta AT, y puedo esperar un tiempo de espera de recepción de alrededor de 10 ~ 50 ms (después de que la tarjeta SIM complete la respuesta) y verifíquela, pero no estoy seguro de que sea una buena manera de manejar las respuestas.
  • No quiero usar, entre 2 comandos AT, funciones de retardo como DelayMs (), que bloquean / detienen el flujo del programa esperando que el dalay termine. Ya tengo una función de retardo que no detiene / detiene el flujo del programa, usando el método de sondeo para la función de retardo.

He visto algunos ejemplos de códigos y explicaciones en Internet como estos:

"Lo primero que debes hacer después de haber leído una línea es verificar si es un código de resultado final". ¿Qué quería decir con esto?

// ********************************************* ***********

char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
    response[i] = Serial.read();
}

if(strstr(responce, "OK"){
   /*Do your code to handle OK response*/
}
else if(strstr(responce, "ERROR"){
   /*Do your code to handle ERROR response*/
}
else {
   /* You got some other response*/
}
  • No entiendo qué es 'strstr' ...

// ********************************************* ***********

String getResponse() {
    String response = "";
    while(mySerial.available()!=0){
        response += mySerial.read();
    }
    return response;
}

Este es un código de ejemplo para Arduino, pero no estoy usando un Arduino y no sé cómo implementan el tipo de datos 'String' en C. ¿Cómo podría hacer eso con el compilador XC32?

// ********************************************* ***********

Por lo tanto, me gustaría llegar a una forma buena y confiable de conectar el puerto serie de la MCU con los módulos SIM y no estoy seguro de cómo hacerlo. ¡Ayuda!

Saludos.

    
pregunta abomin3v3l

0 respuestas

Lea otras preguntas en las etiquetas