Страница 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;
}
поместил

Код: Выделить всё

receive_SMS();
в 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 ?
Там правда все на немецком...