Получение СМС на GSM модуль
- Войдите на сайт для отправки комментариев
Пт, 16/10/2020 - 10:17
GSM Siemens TC35 + Nano+смартфон. Отправляю СМС с модулей успешно, т.е. симка работает, в сети определяется. Получение же СМС со смарта не работает. Если после отправки симку достать и воткнуть в телефон, то сообщение приходит только в этот момент. Т.е. модуль сам не читает СМС. Почему?
#include <SoftwareSerial.h>
SoftwareSerial GPRS = SoftwareSerial(9, 8);
void setup() {
Serial.begin(9600);
GPRS.begin(9600);
delay(3000);
GPRS.print("AT+CMGF=1"); // режим текста
delay(2000);
GPRS.print("AT+CNMI=2,2,0,0,0");
delay(2000);
GPRS.println("AT+CMGD=1,4"); // удалить прежде все СМС - удалено! Проверил.
delay(2000);
Serial.print("GPRS ready...\r\n");
}
void loop() {
if (GPRS.available() > 0) {
textMessage = GPRS.read();
Serial.print(textMessage); // ничего нет
delay(10);
}
}
Код, мягко говоря, недостаточный для чтения СМС. Нужно не просто читать из модуля все подряд, а искать в приходящих данных команду приема СМС и выделять полученный текст.
Хорошо, но нет же никаких "приходящих данных". Или я неправильно делаю проверку на их наличие?
В строчках 9, 11 и 14 вы посылаете команды в модем, но не проверяете - принял ли он их, какой статус? Может там ошибка? например, в строчках 9 и 11 вы не посылаете терминатор, а в строчке 14 он есть. Откуда эта разница?
Вообще, идея просто лупить в модем команды, как в пустоту - неверный подход к работе. На каждую посланную команду приходит ответ - и его нужно анализировать.
выложенный код не компилируется. В строке 07 сделать задержку побольше. например 5 сек. А самое главное, строчки 9 и 11 долны быть println
Проверку делать не умею(( Задержку увеличил - не помогает. Скетчей - примеров в Инете не могу найти. На получение СМС на тлф есть примеры, а мне нужно в обратную сторону. Их 1-2 и то на английском. Что-то пишут, про соответствие номера СМС при его чтении. Но это же нужно при парсинге. Пока задача минимум - чтоб откликался.
строки 21-24 оформить в виде подпрограммы и вызывать ее до и после любого обращения к модулю
Да, я вставлял их после delay в 2 сек после каждой команды в Setup. Проскакиваем вниз и просто выводится Ready. Получается, что GSM вообще не принимает никакие команды. Сейчас сравню с скетчем по "отправке СМС на тлф" - он у меня работает. Выложу здесь, т.к. связан с вопросом..
#include <SoftwareSerial.h> #define rxPin 9 #define txPin 8 SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); char text[150]; String message=""; int i; void setup(){ pinMode(10,OUTPUT); Serial.begin(9600); while (!Serial){} // mySerial.begin(9600); digitalWrite(10,0); // сброс модуля delay(1000); digitalWrite(10,1); Serial.println("Write your SMS:"); } void loop(){ i=0; while( Serial.available()>0 ){ text[i] = Serial.read(); message += text[i]; i++; if (text[i-1]==46){ Serial.println("Send SMS......"); SendTextMessage(); ShowSerialData(); delay(1000); Serial.println("\r"); Serial.println("Success"); message=""; i=0; }}} void SendTextMessage(){ mySerial.print("AT+CMGF=1\r"); // в режим текста delay(1000); mySerial.print("AT+CMGS=\"+79.......\"\r"); // приемное устройство delay(1000); mySerial.println(message); mySerial.print("\r"); delay(1000); mySerial.println((char)26); mySerial.println(); } void ShowSerialData(){ while(mySerial.available()!=0) Serial.write(mySerial.read());}Строка 13 непонятна....
тут есть сброс модуля как минимум и все посылки содержат \r
В обратном он сейчас тоже есть. Но толку нет. Может пины 8,9 должны наоборот теперь подключаться? Но это абсурд.
Что такое /r я не знаю... попробую, хотя скетч из сети, якобы работющий. Делал print и println.
В обратном он сейчас тоже есть. Но толку нет. Может пины 8,9 должны наоборот теперь подключаться? Но это абсурд.
Что такое /r я не знаю... попробую, хотя скетч из сети, якобы работющий. Делал print и println.
13 строка это для arduino micro/leonardo и других на процессоре 32U4
Получение же СМС со смарта не работает.
#include <SoftwareSerial.h> SoftwareSerial GPRS = SoftwareSerial(9, 8); void setup() { Serial.begin(9600); GPRS.begin(9600); delay(3000); GPRS.print("AT+CMGF=1"); // режим текста delay(2000); GPRS.print("AT+CNMI=2,2,0,0,0"); delay(2000); GPRS.println("AT+CMGD=1,4"); // удалить прежде все СМС - удалено! Проверил. delay(2000); Serial.print("GPRS ready...\r\n"); } void loop() { if (GPRS.available() > 0) { textMessage = GPRS.read(); Serial.print(textMessage); // ничего нет delay(10); } }Как же ему бедному работать, если код даже не компилируется?
Если Вам нужна помощь, выкладывайте тот самый (для альтернативно одарённых: тот самый) (для тупых: тот самый) скетч с которым у Вас проблемы. Вы же там что-то перед публикацией поправили (ХЗ что) и как разбираться что у Вас там и как? Чтение СМС у Вас написано неверно, но ... этот код не имеет смысла смотреть, т.к. он не только не работает, но и не компилируется.
#include <SoftwareSerial.h> //SoftwareSerial GPRS(9, 8); //r w SoftwareSerial GPRS = SoftwareSerial(9, 8); String textMessage; byte textMessage1; String lampState; const int relay = 13; //If you're using a relay to switch, if not reverse all HIGH and LOW on the code void setup() { pinMode(relay, OUTPUT); digitalWrite(relay, HIGH); // The current state of the light is ON // mySerial.print("AT+CMGF=1\r"); // режим текста // delay(1000); // mySerial.print("AT+CMGS=\"+791/////1\"\r"); // приемник Serial.begin(9600); while (!Serial) {} // GPRS.begin(9600); digitalWrite(10, 0); // сброс модуля delay(1000); digitalWrite(10, 1); delay(5000); GPRS.println("AT+CMGF=1"); // режим текста delay(2000); GPRS.println("AT+CNMI=2,2,0,0,0"); delay(2000); GPRS.println("AT+CMGD=1,4"); // удалить прежде все СМС - не delay(2000); Serial.print("GPRS ready...\r\n"); } void loop() { if (GPRS.available() > 0) { //если пришло что на модуль textMessage1 = GPRS.read(); Serial.print(textMessage1); delay(10); } // if (textMessage.indexOf("ON") >= 0) { //If you sent "ON" the lights will turn on // // Turn on relay and save current state // digitalWrite(relay, HIGH); // lampState = "ON"; // Serial.println("Lamp set to ON\r\n"); // textMessage = ""; // GPRS.println("AT+CMGS=\"+796////0\""); // RECEIVER: change the phone number here with international code // delay(500); // GPRS.print("Lamp was finally switched ON.\r"); // GPRS.write( 0x1a ); // delay(1000); // } // if (textMessage.indexOf("OFF") >= 0) { // // Turn off relay and save current state // digitalWrite(relay, LOW); // lampState = "OFF"; // Serial.println("Lamp set to OFF\r\n"); // textMessage = ""; // GPRS.println("AT+CMGS=\"+791/////1\""); /// RECEIVER: change the phone number here with international code // delay(500); // GPRS.print("Lamp was finally switched OFF.\r"); // GPRS.write( 0x1a ); // delay(1000); // } // if (textMessage.indexOf("STATUS") >= 0) { // String message = "Lamp is " + lampState; // GPRS.print("AT+CMGF=1"); // delay(1000); // Serial.println("Lamp state resquest"); // textMessage = ""; // GPRS.println("AT+CMGS=\"+7917.....1\""); // RECEIVER: change the phone number here with international code // delay(500); // GPRS.print("Lamp is currently "); // GPRS.println(lampState ? "ON" : "OFF"); // This is to show if the light is currently switched on or off // GPRS.write( 0x1a ); // delay(1000); // } }25 28 31 так и не исправили на print \r
Сейчас исправил. Объясните плз, как вообще все это должно работать? Верно, ли я что отправляю СМС со своего смарта на номер Симки модуля? СМС записывается на сим карту или нет? Это важно? Как проверить Симку вообще? Но если она ОТПРАВЛЯЕТ, значит и принимать должна. И пробую потом ставить симку в тлф. ТЛФ должен показать, что ранее приходили СМС или нет?
СМС отправляю латиницей. И цифры. Никакие символы не ставлю.
СМС у вас никуда не сохраняется - так вы настроили командой AT+CNMI=2,2,0,0,0. Но в Мониторе показываться должна.
Что касается кода, что у вас закомментирован - начиная со строки 43 - это все равно никогда работать не будет. потому что вы из СМС принимаете один-единсвенный символ.
dim3740 - вы откуда такой вылезли то? Вы же самых основ ардуино не знаете... если бы у вас была свежая регистрация, я бы посоветовал пойти светодиодом мигать. Но ник 2015 года???...да ж не знаю. что сказать. Если за пять лет знаний ноль - то наверно не стоит себя мучать уже
b707 давайте не будем поучать))) У меня уже внуки есть, и проявите уважение. Прошу по существу вопроса.
Что касается кода, что у вас закомментирован - начиная со строки 43 - это все равно никогда работать не будет. потому что вы из СМС принимаете один-единсвенный символ.
Я не прошу полной реализации. Вы же не станете отрицать, что хоть что-то, хоть 1 символ должно приниматься?
Вы же не станете отрицать, что хоть что-то, хоть 1 символ должно приниматься?
у других-то принимается. А у вас... не уверен :)
Если вы даже не в курсе, что такое /r/n ...фиг знает, что еще вы там наворотили в коде и в схеме...
Хотите помочь? Спрашивайте, я отвечу обо всем. Нет? зачем писать свои эмоции?
Вы бы для начала подключили этот модуль к компу и погоняли команды в терминале ... увидели бы приходит что то или нет
Ладно, всем спасибо. Буду разбираться.
зачем писать свои эмоции?
причем тут эмоции. Я реально не уверен, что у вас там в схеме и насколько живой модуль. Вон и Командир выше тоже совсетует его сначала с компом погонять...
Команду в таком виде
GPRS.print("AT+CMGF=1");модуль просто не видит ему надоGPRS.print("AT+CMGF=1\r");И соответственно находится в неизвестно каком состоянии
В терминале, делая по-командно, выявил ERROR на AT+CNMI в сетапе. Читаю руководство.... (пусть 2,2,0,0,0 как у меня)...
Как это понять? Ответ должен содержать данные, которых еще нет. Зачем тогда эту команду ставят в сетапе?
Читаю руководство.... (пусть 2,2,0,0,0 как у меня)...
Как это понять? Ответ должен содержать данные, которых еще нет. Зачем тогда эту команду ставят в сетапе?
Понять это так, что все что вы цитируете - относится к формату сообщения +CMT. Читайте внимательнее, про CMNI тут только первая строчка
Вот вам ссылка
https://infocenter.nordicsemi.com/index.jsp?topic=%2Fref_at_commands%2FREF%2Fat_commands%2Ftext_mode%2Fcnmi_read.html
Да, у меня при определенных параметрах CNMI выдается ERR, при других - ОК, но все равно приема нет. В мануалах пишут о связи этих параметров с моделью GSM модуля, наличие дисплея, куча режимов и т.п. Значит, пробовать коды без знания особенностей самого модуля не стоит.
По другой ссылке, кроме вашей, совсем иная инфа. Вы дали на nRF91. У меня другой модуль.
//GPRS.print("AT+CNMI=0,0\r"); //ok //GPRS.print("AT+CNMI=1,1,0,0,1\r"); //ok GPRS.print("AT+CNMI=2,2,0,0,0\r"); //Errordim3740, понимаете ли, каждый производитель модемов придумывает свою херню, не совместимую с другими. Соответственно не имея такого именно модема и не желая от безделья гадать на кофейной гуще, сложно что то советовать. Однозначно проблема в настройках, читайте доку и все будет. Или тупо выкиньте этот модем и перейдите на более распространённые модели.
Я когда начинал, намучался с промышленным модемом, доставшимся на халяву, теперь реально понимаю лучше денег потратить и работать с проверенным решениями.