Полистав справочник АТ команд и выудил команду AT+CMGD=1,4 которая удаляет все сообщения из памяти. Теперь надо придумать как привязать эту команду к функции millis() , что-бы раз в сутки очищать память СМС.
это не обязательно. я делаю так - запрашиваю к-во смс, и когда к-во смс больше 0,8 максимума, тру самые старые. пы сы симки у меня не самые последние, 1-2 годовой давности, в разных симках от 20 до 30 смс может храниться. поэтому я запрашиваю макс. емкость и тру половину когда у меня 0.8 емкости заполнено, так что постоянно заполнено от 0,3 до 0,8 емкости.
Да можно сразу после приема СМС стирать его. Зачем хранить? Приняли, распознали и выполнили AT+CMGD=1
Возникла одна проблемка. Пробую подружить этот модуль с ПК. Подключаю к USB через переходник USB-UART. Через гипертерминал всё идёт на ура. Принимает и отправляет СМС, совершает исходящие звонки, реагирует на входящие. Вообщем всё ОК! Решил с помощью процессинга создать графический интерфейс. И тут засада. Вот часть кода: Код (C++): port.write("AT"); // отправляем команду в COM-порт. delay (100); if (port.available() > 0){ // проверяем есть-ли что на СОМ порту println(port.readString()); // печатаем данные с СОМ порта } Вместо ожидаемого "ОК" получаю "АТ". При попытке совершить исходящий звонок командой "ATD+38хххххххххх;" в ответ опять получаю то, что и отправлял "ATD+38хххххххххх;". Звонок, соответственно не совершается. Команды не доходят до модуля, "застряют" в СОМ порту и при выполнении port.readString() считываются обратно. При этом полностью адекватная реакция на входящие звонки и СМС. в консоли печатается всё так как и должно быть. Направление "от модуля а ПК" работает нормально. Кто может подсказать где засада? PS: Чуть не забыл - изменение задержки не помогает. Пробовал разные варианты от 0 до 5 секунд. Результат тот-же, за исключением того, что на задержках близких к 0 возникают сбои.
команда должна завершаться \D или \С (конец / перенос строки), терминал видимо вставляет конец строки автоматически. Посмотрите, какой у вас должен быть терминатор строки.
Заработало. Только здесь пришлось добавить \r. Осталось, правда одно недоразумение - в консоли печатается и команда и ответ модуля. Это можно как-то вылечить? Хочется получать только ответ модуля.
Тут немного не так. Консоль встроена в IDE. На неё возможен только вывод. Команду echo off применить нельзя. Да и вывод в консоль не является конечным результатом. Я туда вывожу промежуточные результаты в процессе написания и отладки. Просто не хотелось потом исхитряться и сортировать где повтор команды, а где ответ модуля. Ну ничего, поэксперементируем. Спасибо за помощь!
у меня точно эха нет, я правда уже и не помню, какой параметр я выставлял и не помню, как там по умолчанию.
Как показала практика почти все модули которые мы заказывали были настроены на скорость 57600. Но на этой скорости подружить их с Ардуиной не получилось. Лечил я их так: Код (C++): SoftwareSerial gsm_uart(GSM_RX_PIN, GSM_TX_PIN); //... gsm_uart.begin(57600); sendAtCmd("AT+IPR=19200"); gsm_uart.begin(19200); sendAtCmd("AT+IPR?"); sendAtCmd("AT&W"); А вот и простенькая функция в помощь: Код (C++): bool sendAtCmd(String at_send, String ok_answer="OK", String err_answer = "", uint16_t wait_sec = 1) { uint32_t exit_ms = millis() + wait_sec * 1000; String answer; Serial.println(at_send); if (at_send != "") gsm_uart.println(at_send); while (millis() < exit_ms) { if (gsm_uart.available()) { answer = gsm_uart.readString(); if (err_answer != "" && (answer.indexOf(err_answer) > -1 || err_answer.indexOf(answer))) { Serial.println(answer); Serial.println("AT_ERR"); return false; } else if (answer.indexOf(ok_answer) > -1) { Serial.println(answer); Serial.println("AT_OK"); return true; } } } Serial.println("AT_TIMEOUT"); return false; }
Добрый день. Подскажите в чем может быть проблема? Постоянно ардуина пишет "MODEM:STARTUP" Менял симки (3 шт), правда оператор один - Мегафон Код (C++): AT+IPR=19200 AT_TIMEOUT AT+IPR? AT+IPR? +IPR: 19200 OK AT_OK AT&W AT&W OK AT_OK GSM Neoway M590 example ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 MODEM:STARTUP ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 MODEM:STARTUP MODEM:STARTUP ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP ATI NEOWAY M590 REVISION 01.30d OK AT+CSQ +CSQ: 30,0 MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP MODEM:STARTUP +PBREADY Мой скетч Код (C++): #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX int ch = 0; String val = ""; #define MASTER "+7123456789" //укажите телефон хозяина //------------------------------------------------------------------------------------------------------------ bool sendAtCmd(String at_send, String ok_answer="OK", String err_answer = "", uint16_t wait_sec = 1) { uint32_t exit_ms = millis() + wait_sec * 1000; String answer; Serial.println(at_send); if (at_send != "") mySerial.println(at_send); while (millis() < exit_ms) { if (mySerial.available()) { answer = mySerial.readString(); if (err_answer != "" && (answer.indexOf(err_answer) > -1 || err_answer.indexOf(answer))) { Serial.println(answer); Serial.println("AT_ERR"); return false; } else if (answer.indexOf(ok_answer) > -1) { Serial.println(answer); Serial.println("AT_OK"); return true; } } } Serial.println("AT_TIMEOUT"); return false; } //------------------------------------------------------------------------------------------ void setup() { Serial.begin(19200); //подключаем порт компьютера mySerial.begin(57600); //подключаем порт модема (при других скоростях не отвечает) sendAtCmd("AT+IPR=19200"); mySerial.begin(19200); sendAtCmd("AT+IPR?"); sendAtCmd("AT&W"); Serial.println("GSM Neoway M590 example"); mySerial.println("ATI"); //вывести в терминал иноформацию о модеме delay(100); mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет) delay(100); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); mySerial.println("AT+CNMI=2,2"); //отображение смс в терминале сразу после приема (без этого сообщения молча падают в память) } void loop() { if (mySerial.available()) { //есть данные от GSM модуля delay(200); //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(10); } Serial.println(val); // дублируем сообщение в терминал //----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и) if (val.indexOf("+CMT") > -1) { //если обнаружен СМС (для определения звонка вместо "+CMT" вписать "RING", трубку он не берет, но реагировать на факт звонка можно) if (val.indexOf(MASTER) > -1) { //если СМС от хозяина Serial.println("--- MASTER SMS DETECTED ---"); } else { Serial.println("NO MASTER SMS"); } //----------------------- поиск кодового слова в СМС (вообще эту часть надо поместить внутрь предыдущей, но если использовать кодовое слово не совпадающее с сообщениями модема, то не обязательно) if (val.indexOf("sendme") > -1) { // если обнаружено кодовое слово Serial.println("send you ok"); // сообщаем об этом в терминал (если нужно) sms("yes sir!", MASTER); // отвечаем смской } else { // если другое слово или вообще пустое сообщение Serial.println("no send you"); sms("no sir!", MASTER); } val = ""; } } } void sms(String text, String phone) //процедура отправки СМС { Serial.println("SMS send started"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send complete"); delay(2000); }
Проблемы с питанием. Я в своем блоге указывал, что не стоит подключать данный модуль к питанию Ардуины - не потянет. В документации на модуль сказано, что в пике он может потреблять до двух ампер. Если подавать питание от USB-TTL конвертера то модуль работает довольно стабильно. Я его запитываю от 6В аккума через два диода. Блок команд: Нужно выполнить только один раз, после этого модем перенастроится на скорость 19200 и сохранит эти настройки. Потом в коде нужно просто устанавливать скорость порта mySerial.begin(19200). Выполняйте все AT команды через функцию sendAtCmd - это упростит контроль результата.
А не подскажите где этот блог находится?. На форуме вы писали только о смене скорости модема. Больше ваших сообщений я не нашел. Спасибо