GSM A6 вопрос про RING

supercelt
Offline
Зарегистрирован: 09.11.2017

У меня без этого символа команды не воспринимаются модемом, но я работаю не с ардуино, а с чистым stm32

Logik
Offline
Зарегистрирован: 05.08.2014

Все верно, Serial.println();сама добавляет символы конца строки в т.ч. и \r а если Serial.print();, то обязательно нужно явно прописать.

Student_With_Arduino
Offline
Зарегистрирован: 10.03.2018

 http://www.2150692.ru/faq/119-gsm-gprs-modul-aithinker-a6-bystryj-zapusk

Как только я взял в руки А6, то наткнулся на эту ссылку. Все подключил, информационные строки, как описано после 4 пункта у меня появлялись. Сейчас их нет. При вводе любых команд в строку монитора порта -- 0 реакции, команда просто пропадает.

Что делать?! Уже не знаю куда податься

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

Student_With_Arduino пишет:

 http://www.2150692.ru/faq/119-gsm-gprs-modul-aithinker-a6-bystryj-zapusk

Как только я взял в руки А6, то наткнулся на эту ссылку. Все подключил, информационные строки, как описано после 4 пункта у меня появлялись. Сейчас их нет. При вводе любых команд в строку монитора порта -- 0 реакции, команда просто пропадает.

Что делать?! Уже не знаю куда податься

ссылка не открылась....Что за информационные строки строки?

Очень похоже что модем тупо завис, соотвественно пеобходимо перевключить его и послать несколько AT команд для выравнивания скорости с Arduino?

Прогоните обычный скетч для тестирования - работает?

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
#include <SoftwareSerial.h>
SoftwareSerial SIM800(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)

void setup() {
  /*pinMode(10, OUTPUT);
    pinMode(7, OUTPUT);
    digitalWrite(10, HIGH);
    digitalWrite(7, HIGH);
    delay(1000);
    digitalWrite(7, LOW);
    delay(20);
    digitalWrite(7, HIGH);
    delay(3000);*/
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT");             // Автонастройка скорости
  /*SIM800.println("AT+CLVL?");       // Запрашиваем громкость динамика
    SIM800.println("AT+CMGF=1");      // Включить TextMode для SMS
    SIM800.println("AT+DDET=1,0,1");  // Включить DTMF
    SIM800.println("AT+CLIP=1");      // Включить АОН*/
}

void loop() {
  if (SIM800.available())           // Ожидаем прихода данных (ответа) от модема...
    while (SIM800.available()) {
      byte bb = SIM800.read();
      Serial.write(bb);    // ...и выводим их в Serial
      /*if ((bb < 0x20) || (bb >= 0x7F)) {
        Serial.print("0x"); Serial.println(bb, HEX);
        } else {
        Serial.write(bb);
        }*/
    }
  if (Serial.available())           // Ожидаем команды по Serial...
    while (Serial.available())
      SIM800.write(Serial.read());    // ...и отправляем полученную команду модему
}

 

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

Student_With_Arduino пишет:

 Что делать?! Уже не знаю куда податься

уточните, какая у вас ардуина и как подключен к ней модем(к каким пинам)? А то что-то из предыдущего обьяснения не понятно.

Student_With_Arduino
Offline
Зарегистрирован: 10.03.2018

Arduino uno.
Подключаю:
Arduino A6
Gnd Gnd
5В vcc
TX rx
TX TX

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

Student_With_Arduino пишет:
Arduino uno. Подключаю: Arduino A6 Gnd Gnd 5В vcc TX rx TX TX

То есть вы модем А6 подключаете к пинам 0 и 1 Ардуино Уно, а Уно через USB - к компьютеру?

Student_With_Arduino
Offline
Зарегистрирован: 10.03.2018

Да, именно

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Student_With_Arduino пишет:
Да, именно

В Ардуино Уно единственный аппаратный последовательный порт.

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

Но использовать единственный порт для связи с двумя устройствами одновременно невозможно.

 

Например, в сообщении №105 для общения с внешним устройством используется программный последовательный порт на пинах 8 и 9.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

В Ардуино Уно единственный аппаратный последовательный порт.

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

Но использовать единственный порт для связи с двумя устройствами одновременно невозможно.

Это не совсем так. Ничто не помешает передавать с одного Tx на несколько Rx. Все приемники разумеется получат одинаковый сигнал и приймут одно и тоже. Таким образом команды от контроллера могут быть переданы на модем и одновременно продублированы на ПК.  С подключением нескольких Tx (от ПК и от модема) к одному входу Rx сложней. Необходимо понимать что передавать они не должны одновременно. Иначе приемник получит мусор. Электрически подключение возможно т.к. на платах ардуино Tx преобразователя USB/UART подключен к Rx через килоомный резистор. Соответственно Tx модема к Rx контроллера можна подключить просто через диод. Я использую такое подключение. Вполне годное с учетом изложеных ограничений.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik пишет:

Это не совсем так. Ничто не помешает передавать с одного Tx на несколько Rx...

Logik, последовательный порт это как бы не только Тх.

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

Но в любом случае не следует путать явную экзотику с типовым применением.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Logik пишет:

Это не совсем так. Ничто не помешает передавать с одного Tx на несколько Rx...

Logik, последовательный порт это как бы не только Тх.

Если поднять глаза немного выше, то там и про Тх и про Rx и про ограничения и про все особенности и возможности. Не доперли как и почему несколько Rx на один Tx вешать - перечитывайте.

//Впрочем, о вкусах не спорят.

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

Решения определяются задачей. Имея один аппаратный и один софтовый UART  не логично использовать софтовый для обмена с модемом, а аппаратный для отладки. Потому как принципиально невозможно обеспечить стабильную работу софтового сириала и A6. От скорости это не зависит. Он может нормально работать только с сириалом, обеспечивающим прием данных от модема в любой момент времени , даже если в это время идет передача на модем. ring, sms и пр. поступает асинхронно, в любое время. А SoftSerial.h такое принципиально не может, он либо передает, либо принимает, но не то и то одновременно. Откройте его код - убедитесь. Там обе функции в обработчике прерывания и запрещают друг друга на время выполнения.

Потому на время отладки совмещаем на одном порту. После отладки - аппаратный только для модема станет. Сильно нужно 2 сириала - берем другой МК или если на втором сириале нетребовательная фигня, то софтовый можна. Но модем на SoftSerial.h  стабильно не работает. Нестабильно - может )))

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

Logik пишет:
Но модем на SoftSerial.h  стабильно не работает. >

За всех не надо говорить, у меня уже полгода минимум работает стабильно.

Pin
Offline
Зарегистрирован: 30.03.2016

Доброго времени!
Можно ли как-то отключить повторение RING при звонке???

Или это единственный выход?
AT+CLIP=1
AT+CRC=1
Начало звонка:
+CRING: <voice>
+CLIP: "7495xxxxxxxx",145,,,,1
Конец звонка:
+CIEV: "CALL",0

Заранее благодарю!

sansanich
Offline
Зарегистрирован: 12.04.2018

Добрый день друзья!

Помогите плиз разобраться начинающему/твердолобому с СМС - получаю звонки, индентифицирую - звоню обратно - всё Ок, а вот СМС только получаю - вижу их текст в мониторе последовательного, но отправить не как - возможно моя ошибка для вас очевидна...

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
String val = "";
 
void setup() {
  delay(2000);  //время на инициализацию модуля
 
  Serial.begin(9600);  //скорость порта
  Serial.println("GSM tester v1.0");
  mySerial.begin(9600);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС
  delay(100);
  mySerial.println("AT+CSCS=GSM");  //режим кодировки текста
  delay(100);  
}
 
void loop() {
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
    }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен, то проверяем номер
      //delay(10);
      if (val.indexOf("7xxxxxxxxxx") > -1) {  //если номер звонящего наш. Укажите свой номер без "+"
          //  delay(10);
        Serial.println("--- MASTER RING DETECTED ---");
                                    delay(10);
        mySerial.println("ATH0");  //разрываем связь

            delay(10);
        //------------------------------------- это сам добавил - проверял исходящий звонок - работает
         delay(30000);
        mySerial.println("AT+CMGS=+7xxxxxxxxxx");
                
       //----------------------------------------------------------------------------------                            
       // delay(300);
       
      }
    } else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {  //если увидели команду отправки СМС
      sms(String("hello world"), String("7xxxxxxxxxx"));  //отправляем СМС на номер +71234567890
    }
    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);
}

А6 и UNO, код и метод подключения тут на прошлых страницах брал - перечитал тут всё многое в других местах - но что то последний штрих не как)) 

В идеале конечно было бы найти заведомо рабочий код (под А6 в сети не много инфы) и его разобрать по кирпичикам - так точно дошло бы до меня жирафа - но нет пока такого у меня - может быть поделитесь у кого есть

мне надо для работы с СМС 

попалась такая тема - http://compcar.ru/forum/showthread.php?t=10940 но не уверен что со своим уровнем знаний правильно понял -  меняя местами println и print в части отправки СМС

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

пожалуйста вам рабочий код на А6, но отправка в PDU формате, опять же момдем модему рознь,

на моем модеме код заработал, у заказчика на лдругом А6 нет, так что с вашими знаниями рекомендую перейти на модем sim800l - гораздо более предсказуемый модем. 

#define GSM_RX 3 // пин RX на модуле подключаем к указаному пину на Ардуино TX
#define GSM_TX 2 // пин TX на модуле подключаем к указаному пину на Ардуино RX
#include <SoftwareSerial.h>
SoftwareSerial SIM800(GSM_TX, GSM_RX); // установка контактовGSM_TX->RX и GSM_RX->TX для программного порта
#define _a6_power_pin 12
#define _a6_reset_pin 11

void setup() {
  pinMode(_a6_reset_pin, OUTPUT);
  pinMode(_a6_power_pin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(_a6_reset_pin, LOW);
  digitalWrite(_a6_power_pin, HIGH); // power on
  /*pinMode(10, OUTPUT);
    pinMode(7, OUTPUT);
    digitalWrite(10, HIGH);
    digitalWrite(7, HIGH);
    delay(1000);
    digitalWrite(7, LOW);
    delay(20);
    digitalWrite(7, HIGH);
    delay(3000);*/
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT"); SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT"); SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT"); SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT"); SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT"); SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT"); SIM800.println("AT");             // Автонастройка скорости
  SIM800.println("AT"); 
  delay(1000);SIM800.println("ATE0"); // echo off
  delay(500);SIM800.println("ATV1");
  delay(500);SIM800.println("AT+CMEE=2");
  delay(500);SIM800.println("AT+CLIP=1");
  delay(500);SIM800.println("ATS0=3");
  delay(500);SIM800.println("AT+CREG?");
  delay(500);SIM800.println("AT+CMGF=0"); // PDU mode SMS
  delay(500);SIM800.println("AT+CMGD=1,4");
  delay(500);SIM800.println("AT+COPS?");
  delay(500);SIM800.println("AT+CSQ");
  // read sms
  delay(1000);SIM800.println("AT+CMGL=4");
  // send sms
  delay(1000);SIM800.println("AT+CMGS=47");
  delay(500);SIM800.print("0001000B91 8779103254F6 000822042204350441044200200444043E0440043C04300442043000200050004400550021");
  delay(500);SIM800.write(26);
}

void loop() {
  if (SIM800.available())           // Ожидаем прихода данных (ответа) от модема...
    while (SIM800.available()) {
      byte bb = SIM800.read();
      Serial.write(bb);    // ...и выводим их в Serial
      /*if ((bb < 0x20) || (bb >= 0x7F)) {
        Serial.print("0x"); Serial.println(bb, HEX);
        } else {
        Serial.write(bb);
        }*/
    }
  if (Serial.available())           // Ожидаем команды по Serial...
    while (Serial.available())
      SIM800.write(Serial.read());    // ...и отправляем полученную команду модему
}

 

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

в 48 строке между пробелами (потом пробелы убрать) вписать номер получателя в обратной записи (каждые пару цифр поменяны местами)

sansanich
Offline
Зарегистрирован: 12.04.2018

пожалуйста вам

Спасибо!

Правда этот код я уже пробовал, не пошло ((.

перейти на модем sim800l

у меня есть ещё - SIM900 Through neoway M590 - но я не знаю к каким пинам подключать ардуино - купил заодно, не посмотрел, а там не подписано вообще ((.

 
andycat - Спасибо! 
Ели не получится в итоге - куплю конечно ещё один модуль
Но как то надежда теплится ещё - ведь принимает смс, ведь звонит, значит рабочий - скорее всего что то я не правильно делаю
 
домой приеду - попробую езё этот код
    #include <iarduino_GSM.h>                                                                 // Подключаем библиотеку iarduino_GSM для работы с GSM/GPRS Shield.
    iarduino_GSM gsm;                                                                         // Создаём объект gsm для работы с функциями и методами библиотеки iarduino_GSM.
                                                                                              //
    #include <softwareserial.h>                                                               // Подключаем библиотеку SoftwareSerial для программной реализации шины UART.
    SoftwareSerial softSerial(7,8);                                                           // Создаём объект softSerial указывая выводы RX и TX платы Arduino.
                                                                                              //
void setup(){                                                                                 //
    Serial.begin(9600);                                                                       // Инициируем передачу данных по аппаратной шине UART для вывода результата в монитор последовательного порта.
    Serial.print( "Initialization, please wait ... " );                                       // Выводим текст.
                                                                                              //
    gsm.begin(softSerial);                                                                    // Инициируем работу GSM/GPRS Shield, указывая объект шины UART.
                                                                                              //
//  Ждём готовность GSM/GPRS Shield к работе:                                                 //
    while(gsm.status()!=GSM_OK){Serial.print("."); delay(1000);} Serial.println(" OK!");      // Ждём завершения регистрации модема в сети оператора связи.
                                                                                              //
//  Установка кодировки для символов Кириллицы:                                               //
    gsm.TXTsendCodingDetect("п");                                                             // Выполняем автоопределение кодировки скетча для отправки текста на Русском языке.
                                                                                              //
//  Отправка SMS сообщения:                                                                   //
    if( gsm.SMSsend("Это короткое SMS сообщение", "70123456789") )                            // Отправляем короткое SMS сообщение на номер +7(012)345-67-89
    { Serial.println("Sent!"); }else{ Serial.println( "Error!" ); }                           // Выводим результат отправки SMS сообщения
                                                                                              //
}                                                                                             //
                                                                                              //
void loop (){                                                                                 //
}   

 

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

sansanich пишет:

 

Правда этот код я уже пробовал, не пошло ((.

 

интересно где и как вы его могли пробовать если он нигде не публиковался :)

pasha413
Offline
Зарегистрирован: 27.11.2016

sansanich, Вот, посмотрите, найдете ответы на вопросы:

http://arduino.ru/forum/proekty/gsm-signalizatsiya-m590arduino?page=4#comment-302627

sansanich
Offline
Зарегистрирован: 12.04.2018

andycat - сори, значит что то похожее)) я их уже неделю "пробую")) всё в голове перепуталось - раз так тоже вечером попробую - вдруг оно)) кстати - киньте плиз ссылкой в меня по поводу вашей 48 строки - обратная запись... не сталкивался

 

pasha413 - Спасибо! попробую и ваш труд применить

 

мне бы короткий код - который в setup отправлял бы смс  с пустым loop - чтобы убедится что сам модуль и симка это могут - остальное уже докапал бы - я так со звонком разобрался - начал с малого и всё понятно - а вот по смс сложнее - нет такой команды как я понял - есть ряд действий которые на разных вариантах модуля по разному должны происходить... вроде 8).

 

pasha413
Offline
Зарегистрирован: 27.11.2016

что-то нашел: 

#include <SoftwareSerial.h>                 // Библиотека програмной реализации обмена по UART-протоколу
SoftwareSerial gsm(7, 8);                   // RX, TX

int8_t ModemID = 0;
uint32_t msAT = 0;
char Master[12] = "79110000000";

void setup() {
  Serial.begin(9600);                       // Скорость обмена данными с компьютером
  InitModem();                      // запускаем инициализация модема.
  Serial.println(F("+++++READY+++++"));                              
}

void loop() {
  if (gsm.available()) {                      // Если модем, что-то отправил...
      String val = "";                      // Переменная для хранения ответа модуля
      val = waitgsm();                 // Получаем ответ от модема для анализа
  Serial.println("gsmval->" + val);    // Если нужно выводим в монитор порта, что пришло:
      if (val.indexOf(F("+PBREADY")) > -1) InitModem();
      else if (val.indexOf(F("+CLIP: ")) > -1) {        // если обнаружен вызов.
  Serial.println(F("Process RING"));                              
        delay(2000);                             // дадим гудок
        gsm.println(F("ATH"));              // сбрасываем вызов.
        int ind = val.indexOf(F("+CLIP: \""));          // обрезаем номер 
//        if (ind >= 0) {                     // Если информация была найдена
        ind += 9;                         // Парсим строку и
        val = val.substring(ind, val.indexOf("+", ind));
//        }
  Serial.println("phone->" + val);                            
//        if (CheckPhone(val) == 1) {                 // проверяем номер, если наш.
//  Serial.println(F("Master Ring OK!"));
//  MasterRing();                                // меняем состояние охраны
//        } else  Serial.println(F("No Master Ring!"));  
      } else if (val.indexOf(F("+CMT")) > -1) {  // если обнаруженa СМС
  Serial.println(F("Process CMT"));                            
//  Serial.println("smsval->" + val);                            
        parsesms(val);
      }  
  } else if (Serial.available())  {                    // Ожидаем команды по Serial...
    gsm.write(Serial.read());                   // ...и отправляем полученную команду модему
  }
}

String waitgsm() {                         // Функция ожидания ответа и возврата полученного результата
  String gsmval = "";                            // Переменная для хранения результата
  uint32_t _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!gsm.available() && (millis() < _timeout))  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (gsm.available()) {     // если GSM модем что-то послал.
    while (gsm.available()) {  // сохраняем входную строку в переменную val.
      char ch = gsm.read();
      gsmval += char(ch);              // собираем принятые символы в строку
      delay(5);
    } 
  } else {                                      // Если пришел таймаут, то...
    Serial.println(F("Timeout..."));               // ... оповещаем об этом и...
  }

//  if (gsm.available()) {                        // Если есть, что считывать...
//    gsmval = gsm.readString();                   // ... считываем и запоминаем
//  } else {                                      // Если пришел таймаут, то...
//    Serial.println(F("Timeout..."));               // ... оповещаем об этом и...
//  }

  return gsmval;                                 // ... возвращаем результат. Пусто, если проблема
}

int CheckPhone(String num) {              // сверяем номер свой/чужой
   Serial.println("Tell: " + num);
   if (num.length() == 11 && num == Master) return 1;
   return 0;
}

void parsesms(String msg) {
  String msgheader = "";
  String msgsms    = "";
  String msgphone  = "";
  String msgtime   = "";
  
  msg = msg.substring(msg.indexOf("+CMT: "));
  msgheader = msg.substring(0,msg.indexOf("\r"));            // Выдергиваем телефон

  msgsms = msg.substring(msgheader.length() + 2);
  msgsms = msgsms.substring(0, msgsms.lastIndexOf("OK"));  // Выдергиваем текст SMS
  msgsms.trim();

  int Index = msgheader.indexOf("+CMT:");
  Index += 8;                         // Парсим строку и
  msgphone = msgheader.substring(Index, msgheader.indexOf("\"", Index));
//  msgphone = msgheader.substring(Index + 8, Index + 19);
  msgphone.trim();
 
//  Serial.println("MSG: " + msg);           // Выводим всю пришедшую строку номер + смс
  Serial.println("Header: " + msgheader);  // Выводим первую строку номер + время
  Serial.println("Phone: " + msgphone);    // Выводим номер телефона
  Serial.println("Message: " + msgsms);    // Выводим текст SMS
//     if (CheckPhone(msgphone) == 1) {      // если СМС от хозяина
//  Serial.println(F("Master SMS OK!"));
//  Komand();
//     } else  Serial.println(F("No Master SMS!"));
}

void InitModem() { /// === инициализация модема === ///
  Serial.println(F("Start GSM"));
  gsm.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
  waitConnect();
  Serial.println(F("GSM connected"));
  String val = sendATCommand(F("ATI"), true);
  if (val.indexOf(F("M590")) > -1) ModemID = 1; // Serial.println("Modem M590");
  else if (val.indexOf(F("SIM800")) > -1) ModemID = 2; // Serial.println("Modem SIM800"); 
  else if (val.indexOf("A6") > -1) ModemID = 3; // Serial.println("Modem A6");
  Serial.println(String(F("ModemID ")) + ModemID);
  sendATCommand(F("AT+CLIP=1"), true);         // включить АОН
  sendATCommand(F("AT+CMGF=1"), true);         // Включить TextMode для SMS
  sendATCommand(F("AT+CSCS=\"GSM\""), true);   // кодировка текста - GSM
  sendATCommand(F("AT+CNMI=2,2,0,0,0"), true);
  sendATCommand(F("AT+CREG?"), true);
//  delay(1000); 
}

String sendATCommand(String cmd, bool waiting) {
  String atval = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  gsm.println(cmd);                             // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    atval = waitgsm();                     // ... ждем, когда будет передан ответ
    // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
    if (atval.startsWith(cmd)) {  // Убираем из ответа дублирующуюся команду
      atval = atval.substring(atval.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(atval);                      // Дублируем ответ в монитор порта
  }
  return atval;                                 // Возвращаем результат. Пусто, если проблема
}

void waitConnect() {  // запуск модема
  int countok = 0;
  uint32_t msAT = 0;
  String str; 
  while(countok < 5) {                      //ждём пять ОК  
    uint32_t ms = millis();
    if(( ms - msAT ) > 500 || ms < msAT ) { // Событие срабатывающее каждые 500 мс 
      msAT = ms;
      Serial.println(">>AT");
      gsm.println("AT");                    // посылаем команду
      str = "";
      delay(100);                           // ждём ответа
      while(gsm.available()) {
        char ch = gsm.read();
        str += ch;
      } 
      if(str.indexOf("OK") > -1) {Serial.println("OK"); countok++;}
      else countok = 0;
    }
  }  
}

 

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

sansanich пишет:

 обратная запись... не сталкивался

ищется по словам PDU формат SMS

79201234567 -> 79 20 12 34 56 7F (добавляется F до четного количества) -> 97 02 21 43 65 F7

 

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

sansanich пишет:

Добрый день друзья!

Помогите плиз разобраться начинающему/твердолобому с СМС - получаю звонки, индентифицирую - звоню обратно - всё Ок, а вот СМС только получаю - вижу их текст в мониторе последовательного, но отправить не как - возможно моя ошибка для вас очевидна...

#include <SoftwareSerial.h>

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

Не вижу, делаете ли вы предварительно  AT+CMGF=1.

И второе - возможно самое важное. Попробуйте строку 6 записать как

mySerial.print("AT+CMGS="" + phone + ""\r\n");
sansanich
Offline
Зарегистрирован: 12.04.2018

andycat - Благодарю Вас! - оказалось совсем не сложно)) отпишу к ночи ближе что у меня получилось

кстати - мой А6 вроде бы обычный/популярный Ai Thinker который

pasha413 - Ваш код тоже попробую - и тоже напишу тут о результате

пугает немного размер скетча - но мне бы только найти рабочий вариант - там разберусь уже

 

но всё же мне хотелось бы разобраться именно с кодом что я выше показал потому что чую я что он рабочий (ведь принимаються СМС и звонки работают) видимо какая то ошибка именно в событии после которого начинается отправка СМС

а пока амперку почитаю... 

 

sansanich
Offline
Зарегистрирован: 12.04.2018

b707 - во! то что нужно! Спасибо! мне хочется довести до ума "свой"(взятый вот тут) код - там пишут что рабочий...

Не вижу, делаете ли вы предварительно  AT+CMGF=1.

Есть такое

 mySerial.println("AT+CMGF=1");  //режим кодировки СМС
  delay(100);
 
вот ещё раз код - чтоб не искать в выше написанном
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
String val = "";
 
void setup() {
  delay(2000);  //время на инициализацию модуля
 
  Serial.begin(9600);  //скорость порта
  Serial.println("GSM tester v1.0");
  mySerial.begin(9600);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС
  delay(100);
  mySerial.println("AT+CSCS=GSM");  //режим кодировки текста
  delay(100);  
}
 
void loop() {
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
    }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен, то проверяем номер
      //delay(10);
      if (val.indexOf("7xxxxxxxxxx") > -1) {  //если номер звонящего наш. Укажите свой номер без "+"
          //  delay(10);
        Serial.println("--- MASTER RING DETECTED ---");
                                    delay(10);
        mySerial.println("ATH0");  //разрываем связь

            delay(10);
        //------------------------------------- это сам добавил - проверял исходящий звонок - работает
         delay(30000);
        mySerial.println("AT+CMGS=+7xxxxxxxxxx");
                
       //----------------------------------------------------------------------------------                            
       // delay(300);
       
      }
    } else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {  //если увидели команду отправки СМС
      sms(String("hello world"), String("7xxxxxxxxxx"));  //отправляем СМС на номер +71234567890
    }
    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);
}

возможно самое важное. Попробуйте строку 6 записать как - спасибо! попробую вечером так сделать

1 mySerial.println(F("AT+CSCS=GSM"));

а должно быть:

1 mySerial.println( F ("AT+CSCS=\"GSM\""));
 
судя по всему это и мне поменять нужно
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

sansanich пишет:

судя по всему....

привыкайте самостоятельно проверять, ничего же не мешает запустить тестовый код и ручками проверить оба варианта, опять же есть документация, которую не помешало бы посмотреть и в которой написано:

“GSM” GSM 7 bit default alphabet (3GPP TS 23.038); this setting causes easily software flow control (XON/XOFF) problems. “UCS2” 16-bit universal multiple-octet coded character set ( ISO/IEC10646 [32]); UCS2 character strings are converted to hexadecimal numbers from 0000 to FFFF; e.g. “004100620063” equals three 16-bit characters with decimal values 65, 98 and 99. “HEX” "PCCP936" Hexadecimal mode. No character set used ; the user read or write directly hexadecimal values. PC Set.

Example

AT+CSCS=”UCS2” AT+CSCS? AT+CSCS=? OK +CSCS: “UCS2” OK +CSCS: ("GSM","HEX","PCCP936","UCS2")

 

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

andycat пишет:

привыкайте самостоятельно проверять, ничего же не мешает запустить тестовый код и ручками проверить

+100

sansanich - откройте консоль и вручную вбейте команды. Добейтесь, чтобы СМС стабильно уходило - потом просто перенесите эти команды в скетч...

 

sansanich
Offline
Зарегистрирован: 12.04.2018

ничего же не мешает запустить тестовый код

)) нет у меня под рукой ничего кроме ноута сейчас)) - в остальном вы правы!

и в которой написано:

... дорасти мне до таких текстов ещё надо - не смог понять

 

sansanich - откройте консоль и вручную вбейте команды. Добейтесь, чтобы СМС стабильно уходило - потом просто перенесите эти команды в скетч...

вот это я и пытаюсь сделать - я писал выше, я так поступил со звонком - нашёл мини код который в setup сразу звонит и от него и "плясал" - теперь тоже самое хочу с смс проделать, но где найти его хз - облазил весь инет наверное

подозреваю что можно в последовательном порте в верхней его части писать команды - но пока не получилось - киньте ссылку плиз если я прав

Спасибо ребят за помощь!

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

sansanich пишет:

но где найти его хз - облазил весь инет наверное

на каждом углу есть тестовые скетчи для тестирования АТ команд :)

#define GSM_RX 3 // пин RX на модуле подключаем к указаному пину на Ардуино TX
#define GSM_TX 2 // пин TX на модуле подключаем к указаному пину на Ардуино RX
#include <SoftwareSerial.h>
SoftwareSerial SIM800(GSM_TX, GSM_RX); // установка контактовGSM_TX->RX и GSM_RX->TX для программного порта
#define _a6_power_pin 12
#define _a6_reset_pin 11

void setup() {
  pinMode(_a6_reset_pin, OUTPUT);
  pinMode(_a6_power_pin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(_a6_reset_pin, LOW);
  digitalWrite(_a6_power_pin, HIGH); // power on
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  delay(500); SIM800.println("AT"); delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("AT"); delay(500); SIM800.println("AT");             // Автонастройка скорости
  delay(500); SIM800.println("AT"); delay(500); SIM800.println("AT");             // Автонастройка скорости
}

void loop() {
  if (SIM800.available())           // Ожидаем прихода данных (ответа) от модема...
    while (SIM800.available()) {
      Serial.write(SIM800.read());    // ...и выводим их в Serial
    }
  if (Serial.available())           // Ожидаем команды по Serial...
    while (Serial.available())
      SIM800.write(Serial.read());    // ...и отправляем полученную команду модему
}

 

sansanich
Offline
Зарегистрирован: 12.04.2018

Спасибо! я вопрос не верно формулировал - потому и тут вас элементарщиной донимаю

Сори за детские вопросы - теперь понял куда копать

andycat - это как раз то что мне было нужно!

sansanich
Offline
Зарегистрирован: 12.04.2018

andycat загрузил код что вы дали выше и пошло! песня просто! удобно, быстро и наглядно

всё работает отлично, читаю смски, удаляю - звоню - получаю информиацию о устройстве - всё Ок

всё равно вопрос - какое последнее действие при отправке смс?

у меня так отправка и не происходит, как будто я не правильно что то делаю на последнем шаге (до него везде ответ Ок) причём смски приходят нормально

всё что пытаюсь написать что бы инициировать отправку (типа 0x1A) продолжает текст смс по моему

вот скрин - Ai Thinker A6     V03.05.20170090814H38

читал тут да и в других источниках - понял что нужно использовать 0x1A или (char)26 или ctrl+z - но видимо не понял как

заранее прошу не судить строго если опять детский вопрос задаю - спасибо

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

Sim800.write(26)

sansanich
Offline
Зарегистрирован: 12.04.2018

не как (.

ничего не происходит, потом через время появляется - COMMAND NO RESPONSE!

может быть у меня сам модуль бракованный? (брал на АЛИ) - бывает ли так не знаю

повторю - все команды и запросы выполняются, звонки звонятся и принимаются, смс принимается - НО не отправляются 

AT+CMGF=1
AT+CSMP=17,167,0,0
AT+CMGS="+7XXXXXXXXXX"

или 0x1A или (char)26 или ctrl+z или Sim800.write(26) - результат один

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

Ну включите смекалку уже :)
Очевидно же что отправка в монитор кода 26 не получается (во всяком случае я например не знаю как).
Выберите какой либо символ, ~ например, и в loop впишите условие что при появлении этого символа слать в модем 26 код.

sansanich
Offline
Зарегистрирован: 12.04.2018

уже проявил - спасибо - наткнулся вот тут на это

и всё получилось!

сори друзья за мои вопросы - но без вас я бы ещё неделю копал не туда - Спасибо!

sansanich
Offline
Зарегистрирован: 12.04.2018

пляшу и танцую от радости  - неделю после работы мучился - да здравствует форум arduino.ru - обязуюсь по мере сил и времени принимать участие! 

Сергей473
Offline
Зарегистрирован: 07.09.2018

Добрый день! Дисковый сотовый получилось сделать?

smesharik
Offline
Зарегистрирован: 31.01.2016

Подскажите.

Заказал шилд на модуле A9G.

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

+CIEV: "MESSAGE",1

+CMT: "+790********",,"2018/11/20,19:46:29+03

текста смс нет, какую надо команду ему скормить чтобы видно было.

ItsFrit
Offline
Зарегистрирован: 06.11.2019

okta пишет:

alex_r61 пишет:

Только получил пару A6C, сейчас разбираюсь. И похоже один дохлый. Что мешает будить МК от COM порта.

Точняк)) Мешает разве что религия воспитанная спец ногой на М590)))

 

Подскажите, если можно, как будет это выглядеть в скетче пожалуйста? Заранее благодарен.