Страница 1 из 1
SIM900 + UART
Добавлено: Сб апр 27, 2013 16:25:20
kotriks
Всем привет.
Имею модуль сим900 подключен к меге на юарт у меги меню на отправку месаги, собственно вопрос как можно сделать чтобы мега читала принятые сообщения автоматом, к примеру опрос месаги по юарту сим900 если к примеру в меню меги нажать 1 то идёт отправка месаги, я хочу сделать чтобы мега опрашивала сим что в месаге если стоит 1 то идёт отправка месаги с проца.
Re: SIM900 + UART
Добавлено: Сб апр 27, 2013 18:46:15
coredumped
А в чем трудности? Посылайте время-от-времени команду AT+CMGL - она вернет вам принятые сообщения, анализируйте текст, выполняйте действия.
Re: SIM900 + UART
Добавлено: Сб апр 27, 2013 20:01:28
kotriks
При приеме SMS модуль сообщит об этом, выдав в терминал сообщение «+CMTI: "SM",3». Где 3 означает номер пришедшего сообщения.
Для прочтения СМС можно использовать команду AT+CMGR=3,0 (3-номер сообщения, которое хотим прочитать, 0-изменить статус сообщения на прочитанный)
В ответ модуль пришлет информацию о том от кого прошло сообщение и в какое время. «REC UNREAD» означает что у сообщения стоит статус непрочитанного.
[img]
http://avrproject.ru/sim900d/SMS.png
[/img]
Также нужно уметь автоматически удалять сообщения, а то в последнее время операторы приноровились срать всякой рекламой, и в автономном плавании быстро произойдет заполнение памяти. Удаляются сообщения командой:
вопрос в следующем. как можно игнорировать информацию и взять только текст сообщения, например пришло send_sms и только это выбросилось в юарт процу чтобы выполнился код.
Re: SIM900 + UART
Добавлено: Сб апр 27, 2013 23:15:39
coredumped
Никак. Нет такой команды. Прийдется принимать все, с заголовком, а потом уже "полоскать". Фильтровать можно по заголовку, например - по номеру отправителя.
Re: SIM900 + UART
Добавлено: Вс апр 28, 2013 07:06:05
kotriks
а как можно чтобы проц сам себе команду послал в юарт например при нажатии в терминал 1 запускается код, а как чтобы нечего не нажимая проц сам его себе отправил?
может я не очень понятно объясняю но мне надо чтобы когда пришло смс например тест сообщения send то проц его обрабатывал и запускал код
Код: Выделить всё
void send() {
printf("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r");
delay_ms(500);
printf("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r");
delay_ms(500);
printf("AT+SAPBR=3,1,\"USER\",\"mts\"\r");
delay_ms(500);
printf("AT+SAPBR=3,1,\"PWD\",\"mts\"\r");
delay_ms(500);
printf("AT+SAPBR=1,1\r");
delay_ms(5000);
printf("AT+SAPBR=2,1\r");
delay_ms(2000);
printf("AT+EMAILCID=1\r");
delay_ms(500);
printf("AT+EMAILTO=120\r");
delay_ms(500);
printf("AT+SMTPSRV=\"smtp.mail.yahoo.com\",587\r");
delay_ms(500);
printf("AT+SMTPAUTH=1,\"xxx@yahoo.com\",\"password\"\r");
delay_ms(500);
printf("AT+SMTPFROM=\"xxx@yahoo.com\",\"GPRS\"\r");
delay_ms(500);
printf("AT+SMTPRCPT=0,0,\"xxx@mail.ru\",\"GPRS\"\r");
delay_ms(10);
printf("AT+SMTPSUB=\"TEST_GPRS\"\r");
delay_ms(10);
printf("AT+SMTPBODY\r");
delay_ms(50);
printf("ПРИВЕТ\r");
printf("AT+SMTPSEND\r");
delay_ms(500);
Re: SIM900 + UART
Добавлено: Вс апр 28, 2013 10:37:20
coredumped
Такой вариант подойдет?
Код: Выделить всё
#include <string.h>
#define BUF_SIZE 256
char buf[BUF_SIZE];
void get_sms_str(void)
{
char c;
int i=0;
do{
c = uart_getc(); //read one byte from uart
if(c) buf[i++] = c;
} while((i<BUF_SIZE-1)&&(c!='\n'));
buf[i] = 0;
}
int receive_SMS(void)
{
printf("AT+CMGF=1\n"); //set text mode
printf("AT+CMGL\n"); //read all unreaded SMS
do{
get_sms_str();
if(strncmp(buf, "send", 4)==0)
{
//send message, do something else ...
}
} while(strcmp(buf, "OK\r\n"));
printf("AT+CMGD=1,1\n"); //delete all readed SMS
}
Re: SIM900 + UART
Добавлено: Вс апр 28, 2013 11:09:48
kotriks
У меня кодвижен, сделал так
Код: Выделить всё
#include <string.h>
#define BUF_SIZE 256
char buf[BUF_SIZE];
void get_sms_str(void)
{
char c;
int i=0;
do{
c = getchar(); //read one byte from uart
if(c) buf[i++] = c;
} while((i<BUF_SIZE-1)&&(c!='\n'));
buf[i] = 0;
}
unsigned int receive_SMS(void)
{
printf("AT+CMGF=1\n"); //set text mode
printf("AT+CMGL\n"); //read all unreaded SMS
do{
get_sms_str();
if(strncmp(buf, "send", 4)==0)
{
//send message, do something else ...
}
} while(strcmp(buf, "OK\r\n"));
printf("AT+CMGD=1,1\n"); //delete all readed SMS
return 1;
}
поместил
в main при включении в терминал выдаёт
Код: Выделить всё
printf("AT+CMGF=1\n"); //set text mode
printf("AT+CMGL\n"); //read all unreaded SMS
и висит на этом.
Re: SIM900 + UART
Добавлено: Вс апр 28, 2013 14:31:23
uk8amk
kotriks писал(а):
delay_ms(5000);
printf("AT+SAPBR=2,1\r");
delay_ms(2000);
delay_ms - при работе с модемом большое зло. Иногда модем переваривает быстрее, иногда медленнее. А вы ему в этот момент следующую команду пихаете и он останавливает предыдущую. В результате алгоритм рушится, девайс входит в ступор. Сам поначалу спотыкался об эти грабли.
По хорошему, после выброса команды надо дождаться OK/ERROR или иного результирующего кода в зависимости от контектса команды. В рельности на ответ еще приходится ставить таймаут в N секунд после которого идет повтор команды или перезагрузка если решили что модем повесился.
kotriks писал(а):и висит на этом.
Может модуль не успевает загрузиться? Ему несколько секунд после включения может потребоваться.
Re: SIM900 + UART
Добавлено: Вт апр 30, 2013 14:00:33
kotriks
сделал команду юарта так
Код: Выделить всё
void activeCommand(char c[])
{
if (c[0]=='s'&&c[1]=='e'&&c[2]=='n'&&c[3]=='d')
{
send();
}
}
char COMMAND[4];
int i = 0;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
WDTCSR = (1<<WDCE) | (1<<WDE);
WDTCSR = 0x00;
if (data != '!')
{
COMMAND[i] = data;
i++;
}
else
{
i = 0;
activeCommand(COMMAND);
}
}
при вводе команды в терминал send! запускается код отправки, но с приёмом сообщения с модуля так и не получается отпарсить входящее сообщение чтобы выполнить комманду. помогите люди добрые немогу я осились и сё тут
пс. может как сделать приём сообщения по +CMTI потом парсинг и взять только текст сообщения и выплюнуть его в юарт.
Re: SIM900 + UART
Добавлено: Вт ноя 26, 2013 00:42:02
спящий
Здравствуйте подскажите недорогую отладочную плату с sim900d модулем?
вот есть сайт непойму где у них встроенный, или только внешне подключетьься?
http://www.mt-system.ru/catalog/otladoc ... e-sredstva
sim900r -это модель дешевле(эконом) - управлять ей также как и D?
Re: SIM900 + UART
Добавлено: Сб янв 04, 2014 12:58:04
спящий
здравуствуйте, подскажите как можно проверить или узнать в чем проблемма, неотвечает SIM900r, как его можно проверить? он будет посылать ответ без симки?обязательно нажимать PRWkey при подачи напряжения? У меня 2 светодиода STATus и netlight горят постоянно. просто может быть я его перегрел феном -вот узнать как проверить.
Схема снизу(там микросхема -uln2003 - заместо транзисторов для светодиодов)
Re: SIM900 + UART
Добавлено: Пт фев 21, 2014 10:53:36
Andr125
Никто не пользоваляся библиотекой с сайта
http://fritzler-avr.de/HP/Librarys/sim900d_his.php ?
Там правда все на немецком...