¿Error interconectando GSM con Atmega32 usando UART Interrupt?

1

Estoy conectando GSM con atmega32 usando uart interrupts. Estoy usando una interrupción externa que se activa cuando un usuario presiona un interruptor y recibe una 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 presiono el interruptor, se dispara el ISR y se ejecuta el comando pero no recibí ninguna llamada. ¿Cuál podría ser el error? ES esto porque cuando presiono el interruptor, en mi terminal recibo una serie de comandos ATD en lugar de un solo comando. Y también estoy confundido de por qué recibo una serie de comandos ATD en lugar de comandos individuales.

Mi siguiente pregunta es cómo puedo recibir una respuesta de GSM. Solo podemos leer un byte, que significa que necesito usar para que loop lo almacene 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:

    
pregunta anna carolina

1 respuesta

1
  

Mi pregunta es que cada vez que presiono el interruptor, ISR se dispara y   el comando se ejecuta pero no recibí ninguna llamada.

Imprima los bytes recibidos de UART ISR en el terminal, para ver la respuesta del comando de llamada AT, si obtiene 'OK', se llamará al número que escribió en el comando AT, de lo contrario no se llamará a su número y usted está haciendo algo mal.

  

Es esto porque cuando presiono el interruptor, en mi terminal obtengo una serie de   ¿Comando ATD en lugar de comando único?

Siempre recibe una respuesta del módulo GSM, independientemente de si está bien o no, en forma de matriz de bytes y antes de que desee imprimirlo en algún lugar, debe almacenar toda esa información.

  

Mi siguiente pregunta es cómo puedo recibir una respuesta de GSM. nosotros solo podemos   leer solo, byte que significa que necesito usar para bucle para almacenarlo   una matriz de caracteres?

No para bucle, use while bucle en este caso

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

Lea otras preguntas en las etiquetas