5 votos

Error de interfaz GSM sim900 con atmega32

Hola a todos estoy tratando de interfaz GSM SIM900 con atmega32. He escrito un código en el que si un usuario pulsa un botón, puede hacer una llamada a un pre número definido. Si queremos cambiar el pre número definido, podemos enviar mensaje como CHANGE1234567890 donde 1234567890 es el nuevo número, así que si alguien presiona el botón, la llamada se hará en este nuevo número.

En mi código me han hecho serial_Tx función que enviar cadena en serie. serial_Rx que reciben los datos, y uart_put que transmitir un único 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***********************************//
 }
}

Soy capaz de conseguir el número de la ranura de mensaje recibido y también he extraído el número de mi msg. El problema es que ahora tengo que reemplazar el antiguo número con un nuevo número en call function , pero no su trabajo correctamente y de que incluso cuando me oprime el botón de no función. Por favor, ayudar.

-1voto

Pete Finch Puntos 23

Tal vez comience con esta página y ver si están emitiendo los mismos comandos en los mismo plazos: http://tronixstuff.com/2014/01/08/tutorial-arduino-and-sim900-gsm-modules/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X