Соединение USART между модулем ATmega16 и SM5100B-D gsm /gprs

#avr #gsm #gprs #sim900 #atmega16

#avr #gsm #gprs #sim900 #atmega16

Вопрос:

У меня возникли проблемы с интерфейсом usart между этими двумя устройствами. После запуска кода я вижу, как мигают TX и RX, но на самом деле сообщение не проходит, что является моей конечной целью. Есть идеи, как устранить эту проблему. Код отчасти заимствован из другого вопроса о стеке, на который не было ответа

     #define F_CPU 7372800UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>



#define FOSC 1843200// Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

void USART_Init( unsigned int ubrr){
    /* Set baud rate */
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;
    /* Enable receiver and transmitter */
    UCSRB = (1 << RXEN) | (1 << TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
}

void USART_Transmit( unsigned char data ){

    /* Wait for empty transmit buffer */
    while ( !( UCSRA amp; (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR = data;

}

void USART_Transmits(char data[] ) {
    int i;

    for(i = 0; i < strlen(data); i  ) {
        USART_Transmit(data[i]);
        _delay_ms(300);
    }
}

unsigned char USART_Receive( void ){

    /* Wait for data to be received */
    while ( !(UCSRA amp; (1<<RXC)) )
    ;
    /* Get and return received data from buffer */
    return UDR;
}



int main( void ){
    DDRA = 0xff;
    PORTA = 0xff;
    USART_Init ( MYUBRR );

    char text_mode[] = "AT CMGF=1";
    char send_sms[] = "AT CMGS=";
    char phone_number[] = "0038**********";
    char sms[] = "gsm/gprs sadness";

    USART_Transmits(text_mode);
    _delay_ms(1000);

    USART_Transmits(send_sms);
    _delay_ms(1000);

    USART_Transmit(34);
    _delay_ms(300);

    USART_Transmits(phone_number);
    _delay_ms(300);

    USART_Transmit(34);
    _delay_ms(300);

    USART_Transmit(13);
    _delay_ms(300);

    USART_Transmits(sms);
    _delay_ms(1000);

    USART_Transmit(26);//ctrl z
    _delay_ms(300);

    //USART_Transmit(13);//enter
    _delay_ms(3000);

    while(1){   
        //USART_Transmits("alfa");
        //_delay_ms(200);
    }

    return 0;
}
  

Комментарии:

1. Возможно, вы захотите добавить r (CR, код 13) после AT CMGF = 1

2. Я работал с модулями GSM, и мне приходит в голову множество причин. Нормально ли использовать разные F_CPU и FOSC для USART? Вы пересекали RX / TX с вашим модулем? Вы уверены, что atmega и ваша sim900 имеют одинаковый логический уровень (возможно, 5V или 3V3)? Этому модулю требуется некоторое время для подключения к сервисам. Вы должны прочитать об этом в техническом описании для sim900. Наконец, вы можете использовать прием USART и спросить sim900 «вы готовы?» и после принятия модуля использовать свои команды. Вы должны полагаться на ответы модуля. Если это возможно, попробуйте использовать что-то вроде терминала и выполните эти команды вручную.