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 sobre 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. Sugiérame formas de obtener la información a través de SMS.
Editar
Con respecto a los comentarios de Loongcat
Recibo 20 caracteres después del comando "AT+CBC", entonces debería recibir eso. este es el buclefor(int x = 0;x<20;x++)
1) AT+CMGS debe ir antes del cuerpo del 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"
AT+CMGS
mensaje AT+CBC
, el envío del mensaje puede verse interrumpido debido al nuevo comando AT.Veo los siguientes problemas en tu código:
bat()
función, almacena la información de la batería en una cadena local ( char battery[16];
)
for(int x = 0;x<20;x++)
) en ella. Si espera 20 caracteres, debe usar una matriz con un tamaño de 20 + 1 , más uno para el carácter nulo de terminación: \0
.uart_send
función espera unsigned char
como parámetro, por lo que esta llamada es incorrecta: uart_send(*battery);
debería seruart_send(battery[x]);
En el estado actual de su programa no habrá ningún problema ya que transmite esta cadena en la bat()
función, pero debe transmitirla después del AT+CMGS
comando, donde esta cadena no estará disponible.
Si solo llama a la bat()
función después de AT+CMGS
, causará problemas, porque el AT+CBC
comando se enviará al módulo, que responderá. Creo que interrumpirá la ejecución del AT+CMGS
comando.
Por lo tanto, le sugiero que primero guarde la información de la batería en una variable que no se pierda y la envíe en el momento correcto. Una secuencia correcta de envío de mensajes debería verse así:
AT+CMGS="+9195xxxxxxxx"
comando.>
, 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].>
personaje, puede enviar la información de la batería al módulo.<CTRL>-<Z>
carácter, 0x26
en ASCII.+CMGS: 62
Bence Kaulics
Ravi Kumar