Enviando información de batería adjunta con GSM a través de SMS

1

Estoy escribiendo un código C para recibir la batería usando el módem GSM SIM 800E. Estoy usando AtMega16 uC. Aquí he usado comandos AT para obtener información de la batería.

void uart_send(unsigned char ch)     //Function to send via UART
{
    while(!(UCSRA &(1<<UDRE)));
    UDR=ch;
}

void bat()                         //Function to get battery info and send SMS via UART
{   
    int x;
    char battery[16];
    UCSRB &= ~(1<<UDRIE);
    writecommand("AT+CBC");        //AT command to get battery status(My program stuck here)
    for(int x = 0;x<20;x++)        //Reading 20 characters by the response of AT+CBS
    {
        while(!(UCSRA & (1<<RXC)));
        battery[x] = UDR;
    }

    UCSRB |= (1<<RXCIE);

    for(int x=1;x<20;x++)          //sending 20 characters to UART
    {
       uart_send(*battery);
    }
}

int main()
{

    DDRB=0xff;                     //PORT as output port for LCD
    uart_init();                   //initializing UART
    _delay_ms(1000);
    writecommand("AT");
    writecommand("AT+CMGF=1");      //setting GSM to Text Mode
    writecommand("AT+CNMI=2,0,2,0,0");

    while(1)
    {
        bat();
        transmit("AT+CMGS=\"+9195xxxxxxxx\"\r");  //Sending SMS with values in UART buffer
        _delay_ms(10);
        uart_send(26);    // command to send SMS
}

Cuando ejecuto el código, se atasca en la función bat () (en "AT + CBC") muestra la información de la batería en la pantalla LCD y en el terminal, pero no la envía por SMS y el programa no continúa. . Por favor, sugiéreme las maneras de obtener la información a través de SMS.

Editar

Con respecto a los comentarios de Loongcat

Estoy recibiendo 20 caracteres después del comando "AT + CBC", entonces debería recibir eso. este es el bucle for(int x = 0;x<20;x++)

    
pregunta Ravi Kumar

2 respuestas

2

1) AT + CMGS debe ir antes del cuerpo de sms (colocar bat () después de transmitir ())

2) No está detectando el final de la respuesta al comando AT + CBC, esa es una mala manera. Debes recibir símbolos hasta que obtengas "OK"

    
respondido por el Looongcat
2

Veo los siguientes problemas en tu código:

  1. En la función bat() , almacena la información de la batería en una cadena local ( char battery[16]; )
    • El tamaño de esta matriz es 16 pero está guardando 20 caracteres ( for(int x = 0;x<20;x++) ) en ella. Si está esperando caracteres 20 , debe usar una matriz con un tamaño de 20 + 1 , más uno para el carácter nulo de terminación: uart_send .
    • Una variable local se asigna en la pila y, por lo tanto, no está disponible una vez que la función finaliza la ejecución. Es posible que aún pueda alcanzar el valor almacenado, pero no hay ninguna garantía de ello, ya que se marcará como espacio libre en la memoria y alguna otra función puede sobrescribir.
    • Su función unsigned char espera uart_send(*battery); como parámetro, por lo que esta llamada es incorrecta: uart_send(battery[x]); debería ser bat()

En el estado actual de su programa, no habrá ningún problema ya que transmite esta cadena en la función AT+CMGS , pero debe transmitirla después del comando bat() , donde esta cadena no estará disponible.

Si solo llama a la función AT+CMGS después de AT+CBC , causará problemas, ya que el comando AT+CMGS se enviará al módulo, que responderá. Creo que interrumpirá la ejecución del comando AT+CMGS="+9195xxxxxxxx" .

Por lo tanto, le sugiero que primero guarde la información de la batería en una variable que no se perderá y la envíe en el momento correcto. Una secuencia correcta de envío de mensajes debería tener este aspecto:

  1. Obtenga la información de la batería del módulo y guárdela para su uso posterior.
  2. Envía el comando > .
  3. Espere a que el módulo responda con: > , esto significa que el módulo ha procesado el número de teléfono y ahora está listo para recibir el cuerpo del SMS, [información de la batería].
  4. Cuando recibió el carácter <CTRL>-<Z> , puede enviar la información de la batería al módulo.
  5. Ahora, envíe el mensaje utilizando el carácter 0x26 , +CMGS: 62 en ASCII.
  6. En una entrega exitosa, el módulo devolverá un ID de mensaje como: %code%
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas