Получение СМС на GSM модуль

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

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);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

 

Код, мягко говоря, недостаточный для чтения СМС. Нужно не просто читать из модуля все подряд, а искать в приходящих данных команду приема СМС и выделять полученный текст.

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Хорошо, но нет же никаких "приходящих данных".  Или я неправильно делаю проверку на их наличие?

b707
Offline
Зарегистрирован: 26.05.2017

В строчках 9, 11 и 14 вы посылаете команды в модем, но не проверяете - принял ли он их, какой статус? Может там ошибка? например, в строчках 9 и 11 вы не посылаете терминатор, а в строчке 14 он есть. Откуда эта разница?

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

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

выложенный код не компилируется. В строке 07 сделать задержку побольше. например 5 сек. А самое главное, строчки 9 и 11 долны быть println

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Проверку делать не умею(( Задержку увеличил - не помогает. Скетчей - примеров в Инете не могу найти. На получение СМС на тлф есть примеры, а мне нужно в обратную сторону. Их 1-2 и то на английском. Что-то пишут, про соответствие номера СМС при его чтении. Но это же нужно при парсинге. Пока задача минимум - чтоб откликался. 

Komandir
Offline
Зарегистрирован: 18.08.2018

строки 21-24 оформить в виде подпрограммы и вызывать ее до и после любого обращения к модулю

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Да, я вставлял их после 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 непонятна.... 

 

Komandir
Offline
Зарегистрирован: 18.08.2018

тут есть сброс модуля как минимум и все посылки содержат \r

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

В обратном он сейчас тоже есть. Но толку нет. Может пины 8,9 должны наоборот теперь подключаться? Но это абсурд.

Что такое /r я не знаю... попробую, хотя скетч из сети, якобы работющий. Делал print и println.

 

Komandir
Offline
Зарегистрирован: 18.08.2018

dim3740 пишет:

В обратном он сейчас тоже есть. Но толку нет. Может пины 8,9 должны наоборот теперь подключаться? Но это абсурд.

Что такое /r я не знаю... попробую, хотя скетч из сети, якобы работющий. Делал print и println.

 

то что вы ничего не знаете и гугл у вас заблокирован мы уже поняли. Главное что модуль знает что это и ЖДЁТ эту посылку в конце любой команды

Komandir
Offline
Зарегистрирован: 18.08.2018

13 строка это для arduino micro/leonardo и других на процессоре 32U4

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dim3740 пишет:

Получение же СМС со смарта не работает. 

#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);
  }
}

Как же ему бедному работать, если код даже не компилируется?

Если Вам нужна помощь, выкладывайте тот самый (для альтернативно одарённых: тот самый) (для тупых: тот самый) скетч с которым у Вас проблемы. Вы же там что-то перед публикацией поправили (ХЗ что) и как разбираться что у Вас там и как? Чтение СМС у Вас написано неверно, но ... этот код не имеет смысла смотреть, т.к. он не только не работает, но и не компилируется.

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015
#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);
  //  }
}

 

Komandir
Offline
Зарегистрирован: 18.08.2018

25 28 31 так и не исправили на print     \r

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Сейчас исправил. Объясните плз, как вообще все это должно работать? Верно, ли я что отправляю СМС со своего смарта на номер Симки модуля? СМС записывается на сим карту или нет? Это важно? Как проверить Симку вообще? Но если она ОТПРАВЛЯЕТ, значит и принимать должна. И пробую потом ставить симку в тлф. ТЛФ должен показать, что ранее приходили СМС или нет?

СМС отправляю латиницей. И цифры. Никакие символы не ставлю.

b707
Offline
Зарегистрирован: 26.05.2017

СМС у вас никуда не сохраняется - так вы настроили командой AT+CNMI=2,2,0,0,0. Но в Мониторе показываться должна.

Что касается кода, что у вас закомментирован - начиная со строки 43 - это все равно никогда работать не будет. потому что вы из СМС принимаете один-единсвенный символ.

dim3740 - вы откуда такой вылезли то? Вы же самых основ ардуино не знаете... если бы у вас была свежая регистрация, я бы посоветовал пойти светодиодом мигать. Но ник 2015 года???...да ж не знаю. что сказать. Если за пять лет знаний ноль - то наверно не стоит себя мучать уже

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

b707 давайте не будем поучать))) У меня уже внуки есть, и проявите уважение. Прошу по существу вопроса. 

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

b707 пишет:

Что касается кода, что у вас закомментирован - начиная со строки 43 - это все равно никогда работать не будет. потому что вы из СМС принимаете один-единсвенный символ.

Я не прошу полной реализации. Вы же не станете отрицать, что хоть что-то, хоть 1 символ должно приниматься? 

b707
Offline
Зарегистрирован: 26.05.2017

dim3740 пишет:

Вы же не станете отрицать, что хоть что-то, хоть 1 символ должно приниматься? 

у других-то принимается. А у вас... не уверен :)

Если вы даже не в курсе, что такое /r/n ...фиг знает, что еще вы там наворотили в коде и в схеме...

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Хотите помочь? Спрашивайте, я отвечу обо всем. Нет? зачем писать свои эмоции?

Komandir
Offline
Зарегистрирован: 18.08.2018

Вы бы для начала подключили этот модуль к компу и погоняли команды в терминале ... увидели бы приходит что то или нет

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Ладно, всем спасибо. Буду разбираться.

b707
Offline
Зарегистрирован: 26.05.2017

dim3740 пишет:

зачем писать свои эмоции?

причем тут эмоции. Я реально не уверен, что у вас там в схеме и насколько живой модуль. Вон и Командир выше тоже совсетует его сначала с компом погонять...

Komandir
Offline
Зарегистрирован: 18.08.2018

Команду в таком виде GPRS.print("AT+CMGF=1"); модуль просто не видит ему надо GPRS.print("AT+CMGF=1\r");

 

Komandir
Offline
Зарегистрирован: 18.08.2018

И соответственно находится в неизвестно каком состоянии 

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

 В терминале, делая по-командно, выявил ERROR на AT+CNMI в сетапе. Читаю руководство.... (пусть 2,2,0,0,0 как у меня)...

AT+CNMI=1,2,0,0,0 — указывает как должны обрабатываться вновь поступившие SMS-сообщения.
Ответ получим +CMT: все поля разделены запятыми:
— первое поле, указывается номер телефона отправившего SMS.
— второе поле, имя человека, отправляющего SMS.
— третье поле, времени получения SMS
— четвертое поле, сообщение.

Как это понять? Ответ должен содержать данные, которых еще нет. Зачем тогда эту команду ставят в сетапе?

b707
Offline
Зарегистрирован: 26.05.2017

dim3740 пишет:

 Читаю руководство.... (пусть 2,2,0,0,0 как у меня)...

AT+CNMI=1,2,0,0,0 — указывает как должны обрабатываться вновь поступившие SMS-сообщения.
Ответ получим +CMT: все поля разделены запятыми:
— первое поле, указывается номер телефона отправившего SMS.
— второе поле, имя человека, отправляющего SMS.
— третье поле, времени получения SMS
— четвертое поле, сообщение.

Как это понять? Ответ должен содержать данные, которых еще нет. Зачем тогда эту команду ставят в сетапе?

Понять это так, что все что вы цитируете - относится к формату сообщения +CMT. Читайте внимательнее, про CMNI тут только первая строчка

Вот вам ссылка

https://infocenter.nordicsemi.com/index.jsp?topic=%2Fref_at_commands%2FREF%2Fat_commands%2Ftext_mode%2Fcnmi_read.html

 

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Да, у меня при определенных параметрах 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");  //Error

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dim3740, понимаете ли, каждый производитель модемов придумывает свою херню, не совместимую с другими. Соответственно не имея такого именно модема и не желая от безделья гадать на кофейной гуще, сложно что то советовать. Однозначно проблема в настройках, читайте доку и все будет. Или тупо выкиньте этот модем и перейдите на более распространённые модели.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Я когда начинал, намучался с промышленным модемом, доставшимся на халяву, теперь реально понимаю лучше денег потратить и работать с проверенным решениями.