В этой части статьи мы рассмотрим функции, связанные с текстовыми сообщениями. К концу этой статьи вы будете иметь точное представление о том, как ожидать текстовое сообщение, читать сообщение, отправлять новое текстовое сообщение и удалять полученное сообщение. Мы уже разбирали основы в предыдущей статье Интерфейс связи между SIM300 и ATmega32. В ней приводиться схема и команды с примером кода для модуля SIM300.
После прочтения предыдущей статьи вы узнали, как соединить SIM300, AVR ATmega32 и ЖК-дисплей, чтобы получить испытательный стенд. Кроме того, в статье подробно рассматривается асинхронная последовательная связь между SIM300 и микроконтроллером AVR, которая осуществляется с помощью AVR USART. В статье показано использование библиотеки AVR USART для передачи и приема данных в/от GSM модуля. Мы также рассмотрели функцию возврата команды, используемую для работы с модулем, работа с ней показана в демонстрационном коде. Все эти команды используются в этой статье, поэтому мы рекомендуем вам прочесть предыдущую статью и собрать демонстрационный проект, показанный там.
Ожидание текстового сообщения (SMS)
Если текстовое сообщение (SMS) поступает на GSM модуль SIM300, то он отправляет незапрашиваемый ответ <CR> <LF> + CMTI: <mem>, <n> <CR> <LF>
В предыдущей статье уже говорилось, что <CR> является управляющим символом, ASCII код которого 0D(Hex) и <LF>, ASCII код которого 0A (Hex). Вы узнаете о новой вещи – незапрашиваемый ответ. Ранее говорилось, что за командой следует ответ. Но ответ показанный выше, не привязан к команде и может прийти в любой момент. Это незапрашиваемый ответ (unsolicited response).
Значение mem обозначает место хранения SMS сообщения. Обычно это значение SM, что означает память SIM-карты.
Значение n означает ячейку, в которой хранится SMS. В зависимости от размера памяти вашей SIM-карты, в ней 20 или около того ячеек. При получении сообщения, оно сохраняется с наименьшим номером в пустую ячейку. Допустим, вы получили 4 сообщения, и удалили 1, и тогда 5 сообщение сохраниться в первую ячейку.
Пример кода, показывающий ожидание текстового сообщения:
int8_t SIM300WaitForMsg(uint8_t *id) { //Wait for a unsolicited response for 250ms uint8_t len=SIM300WaitForResponse(250); if(len==0) return SIM300_TIMEOUT; sim300_buffer[len-1]=' '; //Check if the response is +CMTI (Incoming msg indicator) if(strncasecmp(sim300_buffer+2,"+CMTI:",6)==0) { char str_id[4]; char *start; start=strchr(sim300_buffer,','); start++; strcpy(str_id,start); *id=atoi(str_id); return SIM300_OK; } else return SIM300_FAIL; }
Анализ кода
1. Мы ждем ответа от SIM300 с тайм-аутом 250 миллисекунд. Это значит, что если ничего не приходит в течение 250 миллисекунд, мы перестаем ждать!
2. Если мы получили ответ, функция SIM300WaitForResponse () сообщает его длину до последнего <CR>. Поэтому если мы получили ответ <CR><LF>+CMTI: SM,1<CR><LF> то len будет 14.
3. Следующая строка sim300_buffer[len-1]=’