我的大学嵌入式系统项目遇到了麻烦。目标是在 SM5100B GSM 模块和 ATMEGA16A 微控制器之间建立一个接口,使用 UART(我这样做了,使用数据表中的正确端口),并且能够通过发送 AT 命令通过 Tx 发送/接收简单的 SMS 消息和 Rx 端口从 atmega 到 gsm,反之亦然,通过 Atmel 中的 C 代码。(不使用超级终端)
当我使用 TeraTerm 测试 GSM 模块时,我能够正常连接,并轻松发送 AT 命令,还设法在插入 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命令到串口?任何人都可以帮助我了解我哪里出了问题,或者我可以在哪里寻找以了解如何使这项工作?