Error al conectar GSM sim900 con atmega32 [cerrado]

Hola a todos, estoy tratando de conectar 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 para que si alguien presiona el botón, se realice la llamada a este nuevo número.

En mi código, he creado serial_Txuna función que envía una cadena en serie. serial_Rxque reciben datos y uart_putque 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 mensaje. El problema es que ahora tengo que reemplazar el número anterior con el número nuevo, call functionpero no funciona correctamente e incluso cuando presiono el botón no funciona. Por favor ayuda.

Tal vez comience con esta página y vea si está emitiendo los mismos comandos en los mismos marcos de tiempo: tronixstuff.com/2014/01/08/…
Gracias Secto por compartir el enlace. Pero ese enlace es para arduino. En arduino hay muchas bibliotecas preconstruidas para que puedas usarlas directamente. Pero definitivamente lo leeré.
¿Su función de llamada funciona para un número predefinido? Además, no estoy seguro PINA==0xFEde si es la forma correcta de verificar un botón, ¿debe verificar que al menos algo debería haber sucedido?
El punto no es usar su código. Mi punto es que su código contiene claramente los detalles de la información intercambiada y el tiempo involucrado. Debe comparar su algoritmo de comunicación lógica con el suyo.
¿El botón es un interruptor momentáneo? Configure la entrada de pulsación de botón para que sea una interrupción. La forma en que el bucle está escrito actualmente no garantiza que la prensa se vea a menos que se mantenga presionada.
Esto se ha abandonado durante un año sin ningún seguimiento para reducir el problema. Votar para cerrar ya que la pregunta no está en un estado de respuesta.

Respuestas (1)

Si tiene otro dongle 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 necesita conectar el GND en su dongle a su sistema GND) . He visto que cuando uso un módulo SIM800 si trato de transmitir mientras el sistema está esperando para completar otro comando, simplemente ignorará ese comando o generará un error. También he visto problemas si envía demasiados comandos demasiado rápido.

Entonces, básicamente, ver lo que hace de manera controlada a través de otro UART realmente ayudará mucho a descubrir qué está pasando. Solo asegúrese de que su dongle UART esté esperando 3.3V o algo similar para que sus niveles lógicos se conecten al 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 u obtener de algún lugar. No he comprobado toda la lógica de su 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 ciclo for usa <= 9 como su comparación. Esa es una mala práctica ya que los dos números deben seguirse por separado. Mejor #definir la longitud y el uso

¿Envió accidentalmente su respuesta demasiado pronto? Parece que has perdido al menos parte de la última oración, si no más contenido.