(GSM модуль SM5100B + интерфейс ATMEGA16A) Неисправность отправки SMS с использованием AT-команд в коде C
У меня проблемы с моим университетским проектом для встраиваемых систем. Цель состоит в том, чтобы установить интерфейс между модулем GSMSM5100B и микроконтроллером ATMEGA16A, используя UART (что я и сделал, используя правильные порты из таблиц данных), и иметь возможность отправлять / получать простые SMS-сообщения, отправляя AT-команды через Tx. и Rx порты из Atmega в GSM и наоборот, через C-код в Atmel. (без использования гипертерминала)
Когда я тестировал модуль GSM с помощью TeraTerm, я смог правильно подключиться и легко отправлять AT-команды, также мне удалось отправить и получить SMS с вставленной SIM-картой, так что все работает нормально.
Сейчас я пытаюсь сделать это с помощью микроконтроллера.
Вот код, который у меня есть:
#define F_CPU 7372800UL
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/io.h>
#include <string.h>
#define BAUD 9600
#define MYUBRR ((F_CPU/16/BAUD)-1) //BAUD PRESCALAR (for Asynch. mode)
void GSM_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(char data ) {
/* Wait for empty transmit buffer */
while ( !( UCSRA & (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);
}
}
int main(void)
{
GSM_init(MYUBRR);
char text_mode[] = "AT+CMGF=1";
char send_sms[] = "AT+CMGS=";
char phone_number[] = "00385*********";
char sms[] = "gsm sadness";
USART_Transmits(text_mode);
_delay_ms(1000);
USART_Transmits(send_sms);
_delay_ms(1000);
USART_Transmit(34);//quotation mark "
//_delay_ms(300);
USART_Transmits(phone_number);
//_delay_ms(300);
USART_Transmit(34);//quotation mark "
//_delay_ms(300);
USART_Transmit(13);//enter
//_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)
{
}
}
Однако мой код не работает, он не отправляет сообщение.
Функции для передачи взяты из таблицы данных, и везде в Интернете, где я ищу, я нахожу одни и те же снова и снова. Проблема в ответах AT, что я не читаю правильно? Или в разборе AT команд на последовательный порт? Кто-нибудь может помочь мне понять, где я ошибаюсь, или где я могу искать, чтобы понять, как заставить это работать?