Error al conectar GSM sim900 con atmega32 [cerrado]

5

Hola a todos, estoy intentando conectar la interfaz GSM SIM900 con atmega32. Tengo un código escrito en el que si un usuario presiona un botón, se realizará una llamada a un número predefinido. Si queremos cambiar el número predefinido, podemos enviar un mensaje como CHANGE1234567890 donde 1234567890 es el nuevo número, de modo que si alguien presiona el botón, se llamará a este nuevo número.

En mi código he hecho la función serial_Tx que envía la cadena en serie. serial_Rx que recibe datos y uart_put que transmiten un solo carácter.

CÓDIGO:

 //serial initialize
    void serial_Init()
   {
    UCSRB = (1<<TXEN) | (1<<RXEN);
    UCSRC = (1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);
    UBRRL = 51;

  }
//serial transmission function
void serial_Tx(char *str)
{
    for (unsigned int i=0;str[i]!=0;i++)
    {
        UDR=str[i];
        while(!(UCSRA&(1<<UDRE))); 

    }

}
//serial transmission single char
void uart_put(char data)
 {
   while(!(UCSRA & (1<<UDRE)))
   {

   }
   UDR=data;
 }
//serial receive function
char serial_Rx()
 {                              

    while(!(UCSRA & (1<<RXC)))
    {

    }
return UDR;
 }

char newnum[10];

 char smscontent[200];
 int len=0; ;
 unsigned char slot;
 char smscmd[16];
 char delcmd[16];
 char cfmcall[16];
 char call[20];
 char smsindi[14];
  char data[15];
 char calldata[10];
 char confirmdata[10];
 char deldata[10];

int main(void)
{
    DDRA = 0x00;
    DDRC = 0xFF;
    PORTA = 0xFF;
    PORTC = 0x00;
    serial_Init();
   PORTA=0xFF;
  while(1)
    {
      //********FUNCTION TO GET SLOT NUMBER of received msg***********//
        if (serial_Rx() != NULL) 
        {
            //serial_Tx("done\n");

            PORTC = 0x01;
            for (int i=0;i<=14;i++)
            {
                data[i] = serial_Rx();
                if(isdigit(data[i]))
                {
                    //serial_Tx("enter\n");
                    PORTC = 0x02;
                    slot = data[i]; 
                }

            }



        }
        else
        {
            serial_Tx("nothing to read \n");
        }
        //**************LOOP END***********************//

     //************FUNCTION TO SEND SMS COMMAND**********************//
        uart_put(slot); //printing the SMS slot number
        sprintf(smscmd,"AT+CMGR=%c\r\n",slot);

        serial_Tx(smscmd);
        for(int k =0; k<=200;k++)
        {
            smscontent[k] = serial_Rx();
            uart_put(smscontent[k]);
        }
        //*****************LOOP END*******************************//

      //***************FUNCTION TO EXTRACT NEW NUMBER*************//
        for(int k =0;smscontent[k]!=NULL;k++) //smscontent[k]!=NULL
        {
            if (smscontent[k] == 'C')
            {
                if (smscontent[k+1] == 'H')
                {
                    if (smscontent[k+2] == 'A')
                    {
                        if (smscontent[k+3] == 'N')
                        {
                            if (smscontent[k+4] == 'G')
                            {
                                if (smscontent[k+5] == 'E')
                                {

                                    if(isdigit(smscontent[k+6]))
                                    {
                                        k=k+6;
                                        serial_Tx("MATCH\n");
                                        for (int i=0;i<=9;i++,k++)
                                        {

                                            newnum[i] = smscontent[k];

                                        }


                                        serial_Tx(newnum); // new number is stored in newnum


                                    }




                                }
                            }

                        }
                    }
                }


            }
        }


        //*****************LOOP END******************************//

      //*******************CALL function **********************//
        if(PINA==0xFE) // if switch pressed then:
        {


            sprintf(call,"ATD%s;\r\n",newnum);
            serial_Tx(call);

            for(int j=0;j<=9;j++)
            {
                calldata[j] = serial_Rx();

            }

            if(strstr(calldata,"OK") != NULL)
            {

                for (int i = 0;i<=20;i++)
                {
                    PORTC = 0x01; // led blink
                    _delay_ms(150);
                    PORTC = 0x00;
                    _delay_ms(150);
                }

            }
            else
            {
                PORTC = 0x02; // led 2 on

            }

        }

        //*************************LOOP END***********************************//
 }
}

Puedo obtener el número de ranura del mensaje recibido y también extraje el número de mi msg. El problema es que ahora tengo que reemplazar el número anterior por un número nuevo en call function pero no funciona correctamente e incluso cuando presiono el botón no funciona. Por favor ayuda.

    
pregunta anna carolina

1 respuesta

0

Si tiene otro adaptador UART a USB disponible, puede conectar su pin RX a su pin TX en su atmega32 para ver qué se está enviando realmente en el código que tiene (también debe conectar el GND de su mochila a su sistema GND). He visto que cuando uso un módulo SIM800, si intento transmitir mientras el sistema está esperando para completar otro comando, ignorará ese comando o generará un error. También he visto problemas si envías demasiados comandos demasiado rápido.

Básicamente, observar lo que hace de manera controlada a través de otro UART realmente ayudará a una tonelada a descubrir qué está pasando. Solo asegúrese de que su llave UART esté esperando 3.3V o algo similar por sus niveles lógicos para conectarse hasta el nivel lógico UART para el módulo atmega32 y SIM900.

Podría considerar hacer una función strcmp o usar una de una biblioteca en algún lugar en lugar de hacer lo que está haciendo con comparaciones de un solo carácter. La función strcmp es una función muy simple de hacer o obtener desde algún lugar. No he comprobado toda su lógica de matriz, pero con tantas matrices diferentes, es fácil cometer un error en su lógica. Otra cosa a mencionar es que tiene matrices que tienen una longitud de 10, pero luego su bucle for utiliza < = 9 como su comparación. Esa es una mala práctica, ya que los dos números que necesita realizar un seguimiento por separado. Mejor para # definir la longitud y el uso     

respondido por el user2188193

Lea otras preguntas en las etiquetas