реклама на сайте
подробности

 
 
> SIM900R как правильно отправлять СМС?, Сделал. Работает, но хотелось бы посоветоваться.
Димон Безпарольн...
сообщение Mar 16 2014, 03:23
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Идея в том, чтобы не вешать процесс намертво ожиданиями.

Отправка начинается по команде CRWP. Отправляется первая часть:
Цитата
ebdat9_01SendToModem((u8*)"AT+CMGS=\"+XXXXXXXX\"\r",23);


Взводится флаг ожидания приглашения ">" и инициализируется счетчик SMSFlagsClear:

Цитата
if (p1==2) {//Команда CRWP = 2
SMSFlagsClear=3; WaitSMS = 1; //Сброс флагов WaitSMS и SMSReady через 9с при неответе
ebdat9_01SendToModem((u8*)"AT+CMGS=\"+79653749528\"\r",23);} //Отправляем адресат


SMSFlagsClear обрабатывается (на вычитание) в событии EVENT_TIMER (период - 3с) и при обнулении обнуляет также флаги
WaitSMS и SMSReady:

Цитата
if (SMSFlagsClear) //Обнуление флагов SMSReady и WaitSMS
SMSFlagsClear--; //по таймеру SMSFlagsClear
if (!SMSFlagsClear) {SMSReady = 0; WaitSMS = 0;}}


Флаг SMSReady устанавливается в событии EVENT_MODEMDATA при ответе приглашением ">":

Цитата
if (WaitSMS) //Если идет отправка СМС
pKey = (s8*)strstr(string,">");//pKey<>0 если есть ">"
if (pKey) {SMSReady = 1;}} //Флаг ответа модема


Т.е. - отправили первую часть, ждем приглашения, отправляем вторую часть.
В итоге получается громоздко. Может кто знает - как проще?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IvanPetrov010203
сообщение Mar 17 2014, 07:11
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 14-01-14
Пользователь №: 80 035



Димон,
ожидание- не лучший способ.
Все равно отправлять смс лучше дожидаясь реакции на отправку/неотправку предыдущего.
Думаю, лучший способ - это написать нормальный парсер на сообщения, принимаемые от модуля и по ним организовать finite state machine. ebdat9_03SeеModemdataToFL(TRUE); должна направить сообщения от модуля в Embedded Aplication.
Я имею в виду, что ожидание между оправками сделать не по времени, а по факту получения от модуля "+CMGS: <value>".
То же можно сделать для ожидания приглашения.

В общем, анализируйте, что присылает модем.
Отслеживайте это в EVENT_UARTDATA, и, в случае обнаружения '>' будет вызывайте ф-ю наполнения смс символами. А в случае получения другой строки (строка заканчивается символами \r\n) от модуля - поступайте как нужно..))) Например, если поймаете "+CMGS: 225\r\n", значит предыдущее сообщение отправлено и можно засылать "AT+CMGS=\"+XXXXXXXX\"\r" для отправки следующего.

Подобным образом, можно дополнить парсер для других любых сообщений, поддержав реакцию на все сообщения.

Иметь кучу флагов ожидания в программе - не лучший способ - можно запутаться, когда программа разрастется ))
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 08:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016