¿Cómo interactuar GSM con el microcontrolador 8051 para enviar SMS?

0

Estoy haciendo un proyecto sobre el envío de SMS a través de GSM utilizando el módulo SIM 900 y 8051.

Mi código es:

#include<reg51.h>
unsigned char *command = "AT";
unsigned char *echo = "ATE0";
unsigned char *msgConfig = "AT+CMGF=1";
unsigned char *number = "AT+CMGS=\"8283******\"";
unsigned char *message = "hello";
unsigned char *CTRLZ = 0x1A;
void serial_init(void); 
void serial(unsigned char);
void puts(unsigned char *p );
void delay(void);

void main()
{
serial_init();  
puts(command);
delay(); // delay of approx 1 sec
puts(echo);
delay();
puts(msgConfig);
delay();
puts(number);
delay();
puts(message);
delay();
puts(CTRLZ);
while(1);

}
void serial_init(void)
{

TMOD=0x20; //timer 1, mode 2(8-bit autoreload) to set baud rate 
TH1=0xFD; //-3 to TH1 for 9600 baud rate
SCON=0x50; // 8 bit txion, 1 start 1 stop bit, REN enable for both txfr and rxve
TR1=1; // start timer
}

void puts(char *p)
{
char *temp = p; /*temp pointer so that the actual pointer is not displaced */
while(*temp != 0x00)
{
serial(*temp); 
temp++;
} 
}

void serial(unsigned char x)
{

SBUF=x;
while(TI==0);
TI=0;

}
void delay(void) // delay for approx 1 sec
{
int i;
TMOD=0x01; // timer 0 in mode 1
for(i=0;i<142;i++)
{
TL0=0x00; // starting value from 0 
TH0=0x00;
TR0=1; // sart timer
while(TF0==0); // polling TF flag for high
TR0=0; // stop timer
TF0=0; // clear flag TF0

}
}

El problema aquí es que el módulo GSM no ha enviado el SMS.

Cuando uso la función de llamada reemplazando los comandos AT, entonces la llamada funciona pero SMS no lo hace. Creo que estoy equivocado al enviar comandos AT para SMS.

    
pregunta Bob Parihar

1 respuesta

1

(Si bien esta respuesta puede parecer grosera, no debe ser así. Es solo un b) style respuesta).

¡Debería nunca, nunca, nunca, nunca usar delay , sleep o similar para esperar la respuesta del módem! De la misma manera que es de esperar que nunca piense en escribir un navegador web que ignore todas las respuestas que el servidor web le envía, nunca debe pensar en escribir un programa de comunicación por módem que ignore todas las respuestas que el módem le devuelve.

Usted DEBE cambiar su algoritmo a lo siguiente:

send_at_command("AT+WHATEVER\r");
do {
    line = read_full_line();
} while (!is_final_result_code(line));

donde read_full_line lee caracteres por caracteres hasta que recibe \n y el carácter anterior era \r (suponiendo que V1 format 1 ).

Puede consultar el código de atinout para ver un ejemplo de función is_final_result_code (también puede comparar con isFinalResponseError y isFinalResponseSuccess en ST-Ericsson's U300 RIL , aunque tenga en cuenta que CONNECT no es un código de resultado final, es un código de resultado intermedio, por lo que el nombre esFinalResponseSuccess no es 100% correcto).

También, específicamente para AT + CMGS, DEBE esperar la respuesta \r\n> del módem antes de comenzar a enviar la carga útil. Consulte la primera parte de esta respuesta para obtener más detalles.

1 Consulte 6.2.6 Formato de respuesta DCE en V.250 . No debe cambiar esto a V0, incluso si parece tentador tener que verificar solo un carácter al final de los códigos de resultados finales, pero debido a que el texto de información siempre tiene \r\n como EOL, y usted es mucho mejor. tratando todas las líneas de la misma manera.

    
respondido por el hlovdal

Lea otras preguntas en las etiquetas