1 votos

Error al interconectar GSM con Atmega32 usando UART Interrupt?

Estoy interconectando GSM con atmega32 usando interrupciones uart. Estoy usando una interrupción externa que se dispara cuando un usuario pulsa un interruptor y uart recibir interrupción para recibir la respuesta de GSM.

CÓDIGO:

int main(void)
{

   DDRC = 0xFF; //output led
   PORTD = 0x04; //PD2 high for switch interrupt
   serial_Init();
   GICR = (1<<INT0);
   sei();
   while(1)
    {

     }
}
ISR (INT0_vect)
{

   serial_Tx("ATD<number>;\r\n");
}

ISR(USART_RXC_vect)
{

}

Mi pregunta es que cada vez que pulso el interruptor, el ISR se dispara y el comando se ejecuta pero no recibo ninguna llamada. ¿Cual puede ser el error? Esto es porque cuando presiono el interruptor, en mi terminal obtengo una serie de comandos ATD en lugar de un solo comando. Y también estoy confundido por qué tengo una serie de ATD comando en lugar de un solo comando.

Mi siguiente pregunta es ¿cómo puedo recibir la respuesta de GSM. sólo podemos leer solo, byte que significa que tengo que usar para el bucle para almacenarlo en una matriz de caracteres.

Función Serial_Tx:

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

Función Serial_Rx:

char serial_Rx()
{
while(!(UCSRA & (1<<RXC)));
return UDR;
}

SALIDA:

enter image description here

1voto

Kratz Puntos 193

Mi pregunta es que cada vez que pulso el botón swi se ejecuta el comando pero no recibo ninguna llamada.

Imprima los bytes recibidos de la UART ISR en la terminal, para ver la respuesta del comando AT de llamada, si obtiene 'OK', entonces el número que escribió en el comando AT es llamado, si no su número no es llamado y está haciendo algo mal.

¿Esto se debe a que cuando pulso interruptor, en mi terminal obtengo una serie de ATD en lugar de un único comando?

Siempre obtienes una respuesta del módulo GSM, independientemente de si está bien o no, en forma de matriz de bytes y antes de que quieras imprimirla en algún sitio, necesitas almacenar todos esos datos.

Mi siguiente pregunta es cómo puedo recibir la respuesta de GSM. sólo podemos leer solo , byte que significa ¿tengo que usar para bucle para almacenarlo en una matriz de caracteres?

No usar bucle for, usar bucle while en este caso

int i = 0;
while(uart_buffer != empty)
{
    received_chars[i] = uart_buffer_char;
    i++
}

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