проблема с SoftwareSerial и GSM модулем А6

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Доброго времени суток.

Есть небольшая проблема с использованием SoftwareSerial при подключении GSM модуля А6 от Ai Thinker. Странно иногда посылаются запросы и ответы получаю странные, причем каждый раз могут быть разные, иногда все правильно.. 

Скорость 115200 (дефолтная на А6), пробовал уменьшать, не помогло.. :(

Может кто-нибудь подскажет куда копать..

Для примера скрины запрос-ответ (запросы посылаются нажатием кнопки):

При этом, если подключиться к модулю напрямую все чудесно работает:

Ну и код:

#include <SPI.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(8, 9); // RX, TX

int Button = 3;
int flag = 0;
int reg = 0;
boolean flag1 = false;

void setup() 
{
  Serial.begin(115200);  //Скорость порта для связи Arduino с компьютером
  while (!Serial) 
  {
    ;
  }
  Serial.println("Serial started");  
  mySerial.begin(115200);  //Скорость порта для связи Arduino с GSM модулем
  pinMode(Button,INPUT); 
  digitalWrite(Button,HIGH); //кнопка не нажата
}

void loop() {
 
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
  
  if(digitalRead(Button)==LOW&&flag==0)
  {
    Serial.println("BUTTON PRESSED");
    reg++;
    Serial.println(reg);
    flag=1;
    flag1=true;
    delay(500);
  }
  
  if(digitalRead(Button)==HIGH&&flag==1)
  {
    flag=0;
  }
  
  if (flag1==true)
  {
  switch(reg)
  {
    case 1:
      mySerial.println("ATI");
      flag1=false;
      break;
    case 2:
      mySerial.println("AT+CLIP=1");
      flag1=false;
      break;
    case 3:
      mySerial.println("AT+IPR?");
      reg=0;
      flag1=false;
      break;
    }
  }
}

Я совсем новичек в программировании, не пинайте сильно, если что.. :)

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Sergy1222 пишет:

Доброго времени суток.

Есть небольшая проблема с использованием SoftwareSerial при подключении GSM модуля А6 от Ai Thinker. Странно иногда посылаются запросы и ответы получаю странные, причем каждый раз могут быть разные, иногда все правильно.. 

Скорость 115200 (дефолтная на А6), пробовал уменьшать, не помогло.. :(

Может кто-нибудь подскажет куда копать..

Для примера скрины запрос-ответ (запросы посылаются нажатием кнопки):

При этом, если подключиться к модулю напрямую все чудесно работает:

Ну и код:

#include <SPI.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(8, 9); // RX, TX

int Button = 3;
int flag = 0;
int reg = 0;
boolean flag1 = false;

void setup() 
{
  Serial.begin(115200);  //Скорость порта для связи Arduino с компьютером
  while (!Serial) 
  {
    ;
  }
  Serial.println("Serial started");  
  mySerial.begin(115200);  //Скорость порта для связи Arduino с GSM модулем
  pinMode(Button,INPUT); 
  digitalWrite(Button,HIGH); //кнопка не нажата
}

void loop() {
 
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
  
  if(digitalRead(Button)==LOW&&flag==0)
  {
    Serial.println("BUTTON PRESSED");
    reg++;
    Serial.println(reg);
    flag=1;
    flag1=true;
    delay(500);
  }
  
  if(digitalRead(Button)==HIGH&&flag==1)
  {
    flag=0;
  }
  
  if (flag1==true)
  {
  switch(reg)
  {
    case 1:
      mySerial.println("ATI");
      flag1=false;
      break;
    case 2:
      mySerial.println("AT+CLIP=1");
      flag1=false;
      break;
    case 3:
      mySerial.println("AT+IPR?");
      reg=0;
      flag1=false;
      break;
    }
  }
}

Я совсем новичек в программировании, не пинайте сильно, если что.. :)

Вот только сегодня задавал тот же самый вопрос. Несколько часов пытался добиться нормального общения по Serial, а всё так же.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Sh0a1m0a0n1 пишет:

Вот только сегодня задавал тот же самый вопрос. Несколько часов пытался добиться нормального общения по Serial, а всё так же.

Эммм.. что-то не встретил этой темы :(

На сколько я понял, 115200 зашито намертво в модуль, меняется некое "локальное" значение.

Вот один из комментов про А6, встреченных на просторах мировой:

Dont spend money behind this module ...its like wasted money ( I did and spend week ) ...1. baud rate is fixed to 115200 2. serial communication only work with hardware serial ( now way it will work with software serial for arduino) 3. dont have dns look,http client or server . SIM800L is best alternative has ton of features and has almost same price range.

Так что надо прикупить SIM800 и попробовать..

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Вероятно, он прав. Я тоже думаю, что дело в модуле. Хотя почему же он тогда нормально работает, если с ним общаться через Ардуино как через переходник?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

А моя тема сейчас рядом с Вашей. У меня Neoway M590E.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

В общем, если я правильно понимаю, проблема в SoftwareSerial. Сейчас схему собрал напрямую (в 0 и 1 пин), все работает, кажись..

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

У SoftwareSerial большие проблемы с работой на высоких скоростях, разные источники называют максимальную скорость 28800, 33600, 56700, есть даже мнения, что SoftwareSerial больше 9600 стабильно не отрабатывает.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Araris пишет:

У SoftwareSerial большие проблемы с работой на высоких скоростях, разные источники называют максимальную скорость 28800, 33600, 56700, есть даже мнения, что SoftwareSerial больше 9600 стабильно не отрабатывает.

Ну, я примерно так и понял, хотя в документации и пишут про "up to 115200".. Но все равно библиотека полезная и авторам спасибо :)

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Удалось решить проблему? А то я приобрёл WiFi модуль и у меня появилась схожая проблема.

xDriver
xDriver аватар
Онлайн
Зарегистрирован: 14.08.2015

максимальная скорость на которой стабильно работает SoftSerial - 38400.

http://arduino.ru/forum/programmirovanie/softwareserial-ne-rabotaet-na-115200

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Sh0a1m0a0n1 пишет:

Удалось решить проблему? А то я приобрёл WiFi модуль и у меня появилась схожая проблема.

Да, подключил модуль без softwareserial, т.к. мне так и не удалось перевести его на другую скорость.. Точнее он отвечает что скорость, например 9600, но один хрен работает на 115200 :)

На самом деле, как я понял, он только отображает в мониторе порта искаженные данные, но, например, звонок уходит, т.е. команды он, вроде как, отсылает и выполняет верно, но пока времени нет с этим разбираться :(

Ну и хочу еще SIM800 купить попробовать..

MacSim
Offline
Зарегистрирован: 28.11.2012

а разве у него нет функции автоопределения скорости обмена? посылайте долго АТ (в течении секунд 3 долбите ему команду не обязательно ат, можно любую другую) он поймет что вы на этой скорости. по этой причине вы и не можете установить другую скорость : начинаете общаться на 115200 он на нее и прыгает. удачи

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Нет, так не работает, долбился минуты 2 :)

rrr111
Offline
Зарегистрирован: 04.10.2016

Sergy1222 пишет:

В общем, если я правильно понимаю, проблема в SoftwareSerial. Сейчас схему собрал напрямую (в 0 и 1 пин), все работает, кажись..

Можете, пожалуйста, поделиться "рабочим" скетчем? Т.к. меня ждет аналогичная проблема в ближайшие дни (жду когда придет gsm модуль А6).

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

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

Serial.begin(115200);  //Скорость порта для связи Arduino с компьютером
  while (!Serial) 
  {
    ; //ждем соединения по serial
  }
  Serial.println("AT+CLIP=1"); //Вкл. АОН
  delay(1000);
  Serial.println("AT+CMGF=1"); //Устанавливаем текстовый формат SMS
  delay(1000);

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

rrr111
Offline
Зарегистрирован: 04.10.2016

Здравствуйте!
Извиняюсь у ТС, но решил задавать вопросы (мне сегодня пришел модуль и я пытался его подключить) по такому же модулю в этой ветке, чтобы не плодить темы.

Попробовал написать пробную программу, которая будет считать кол-во поступивших смс всего и кол-во смс от нужного нам номера телефона. И если текст смс: "123", то нужно отправить ответное смс с количеством смс всего, смс с нужного номера.

Подскажите, пожалуйста, что не так делаю (прошу сильно не бить за глупые вопросы)))) ?

 

#define MASTER "+7960*******"
int ch=0;
String val= "";
int kol_A=0;
int kol_B=0;
void setup() {
  delay (3000); // время на инициализацию gsm модуля
  Serial.begin(115200);//скорость подключения gsm 
  Serial.println("AT+CLIP=1"); //включаем АОН
  delay(100);
  Serial.println("AT+CMGF=1"); //режм кодировки смс - англ.
  delay(100);
  Serial.println("AT+CSCS=\"GSM\""); //режим кодировки текста
  delay(100);
  Serial.println("AT+CNMI=2,2"); /*включает оповещение о новых сообщениях, новые сообщения 
  приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>", а на следующей
  строчке с первого символа идёт содержимое сообщениявключает оповещение о новых сообщениях, 
  новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>", 
  а на следующей строчке с первого символа идёт содержимое сообщения*/

}

void loop() {
  if (Serial.available())//если что-то пришло на GSM модуль
  {
    delay(200); 
    while (Serial.available())//в этом цикле сохран-м входную строку в переменную val
    {
      ch =Serial.read();
      val+=char(ch);
      delay(20);
kol_A++;
    }
   }

   if (val.indexOf("+CMT")> -1 && val.indexOf(MASTER)> -1 && val.indexOf("123")> -1)
   /*если мы получил именно смс(+CMT) и если смс от хозяина*/
   
   {
kol_B++;
}
if (val.indexOf("+CMT")> -1 && val.indexOf(MASTER)> -1 && val.indexOf("123")> -1)
   /*если мы получил именно смс(+CMT) и если смс от хозяина и если текст смс "123" (сама смс без ковычек) */
{
      Serial.println("AT+CMGS=\"+7960*******\"");//не уверен, что именно так нужно обозначать номер получателя ответа
      delay(500);
      Serial.print("vsego_sms= ");//текст смс
       delay(500);
      Serial.println(kol_A);//значение переменной
       delay(500);
      Serial.print("hozain_sma=");//текст смс
       delay(500);
      Serial.print(kol_B);//значение переменной
       delay(500);
      Serial.print((char)26);//символ завершающий передачу
       delay(500);
       val="";
   }
   
            }

 

okta
Offline
Зарегистрирован: 10.01.2015

Особо не вглядывался, навскидку:

стр 32 в kol_A сейчас считаются все поступившие с модуля символы - надо как минимум вынести из цикла чтения сериала, а лучше еще поставить проверку, что пришла именно СМС.

В сотальном вроде норм. Разве что проверки в строках 36 и 42 можно объединить. И еще можно внести их внутрь проверки if (Serial.available()), дабы они отрабатывали только когда что-то с модуля пришло, а не при каждом прогоне цикла, но это все уже не принципиально для работоспособности.

И, да, про отправку смс сейчас не помню правильную последовательность, так что про это ничего сказать не могу.

rrr111
Offline
Зарегистрирован: 04.10.2016

В итоге: получилось просто отправлять смс сообщения. Принимать сообщения (вернее их читать и анализировать - так и не получилось, к сожалению).. Прошу помощи, в чем ошибка? Скетч прилагаю, выделил в нем ту часть, которая не работает.... Отдельно блок отправки смс сообщений - работает. Получается не работает блок скетча, отвечающий за чтение и анализ сообщения..

пс. при звонке или отправке смс на номер, установленной сим в модуль, TX не мигает (т.е получается, что ардуино тупо не получает информацию из gsm модуля..)

Заранее благодарен за помощь!

 

char MASTER[] = "79**********";
int x = 5;
int y = 3;
int ch = 0;
String val = "";

void setup()
{
  delay(300);
  Serial.begin(115200);
  delay(300);
  Serial.println("AT+CMGF=1");//режим кодировки смс
  delay (300);
  Serial.println("AT+CLIP=1");// вкл АОН
  delay (300);
  Serial.println("AT+CMGR=1");// читаем смс
  delay (300);
  Serial.println("AT+CSCS=\"GSM\"");//режим кодировки текста
  delay(2000);
}

void loop()
{
  //====================================================== этот блок, отвечающий за прием и анализ смс не работает
  if (Serial.available())//если что-то пришло на GSM модуль
  {
    delay(200); //выдержка времени, чтобы вся инфа успела придти на модуль прежде чем мы начнем его анализировать
    ch = Serial.read(); //считываем с порта информацию
    val += char(ch); // присваиваем переменной val
    delay(20);
  }
  if (val.indexOf("+CMT") > -1 && val.indexOf("79*********") > -1 && val.indexOf("123") > -1)
    /*если мы получил именно смс(+CMT) , если смс от хозяина , если текст смс "123" */
//========================================================
{

    Serial.print("AT+CMGS=\"");//начало отправки смс
    Serial.print(MASTER);
    Serial.write(0x0D);//без этой строки не работает,  что означает эта строка?
    delay(2000);
    Serial.print("x=");
    delay(500);
    Serial.println(x);
    delay(500);
    Serial.print("y=");
    delay(500);
    Serial.print(y);
    delay(500);
    Serial.println(char(26));
    val = "";
    ch = 0;
  }

}

 

okta
Offline
Зарегистрирован: 10.01.2015

А вот это Serial.println("AT+CNMI=2,2"); из настроек зачем выкинули? Если я правильно помню, поумолчанию СМСки тихо падают в память, ни чего не сообщая в сериал (что, очевидно, вы и наблюдаете).

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:

В итоге: получилось просто отправлять смс сообщения. Принимать сообщения (вернее их читать и анализировать - так и не получилось, к сожалению).. Прошу помощи, в чем ошибка? Скетч прилагаю, выделил в нем ту часть, которая не работает.... Отдельно блок отправки смс сообщений - работает. Получается не работает блок скетча, отвечающий за чтение и анализ сообщения..

пс. при звонке или отправке смс на номер, установленной сим в модуль, TX не мигает (т.е получается, что ардуино тупо не получает информацию из gsm модуля..)

Заранее благодарен за помощь!

Думаю, стоит попробовать еще читать побайтно serial

while (Serial.available())
  {
    delay(10);
    if (Serial.available() >0) 
      {
        char c = Serial.read();  //gets one byte from serial buffer
        if (c == '"') 
          {
            break;
          }  //breaks out of capture loop to print readstring
        readString += c;
      } //makes the string readString
      
  }
  if (readString.length() >0) 
  {
    if(readString.indexOf("123")||readString.indexOf("321") >=0) //если позвонили с этих номеров
    {
       //делаем что-то
    }

 

okta
Offline
Зарегистрирован: 10.01.2015

Касательно отправки сообщений

rrr111 пишет:

Serial.print("AT+CMGS=\"");//начало отправки смс
Serial.print(MASTER);
Serial.write(0x0D);//без этой строки не работает, что означает эта строка?

 

После Serial.print(MASTER); неплохо было бы кавычки закрыть

Serial.write(0x0D); это символ CR по кодировке ASCII нужен по синтаксису:

 AT+CMGS="номер куда отправляем смс"<CR>текст смс<ctrl-z>

CR = 0x0D (или char 13)

ctrl-z = 0x1A (или char 26)

okta
Offline
Зарегистрирован: 10.01.2015

rrr111 пишет:

 if (Serial.available())//если что-то пришло на GSM модуль 
{ 
delay(200); //выдержка времени, чтобы вся инфа успела придти на модуль прежде чем мы начнем его анализировать
ch = Serial.read(); //считываем с порта информацию
val += char(ch); // присваиваем переменной val delay(20); 
}   

Зачем цикл убрали? Верните как было - через цикл while побайтно считываем из сериала. Иначе сейчас вы считываете только первый символ сообщения.

+ в переменную val очищаете только в случае отправки смс, а надо очищать после обработки в любом случае. Иначе несколько сообщений склеите в одно.

rrr111
Offline
Зарегистрирован: 04.10.2016


Спасибо за советы!
Попробовал проверить вообще считывает ли что-нибудь хотя бы с gsm модуля... Результат - светодиод не загорается при наличии смс любого текста, при звонке на симку, вставленную в модуль... Вывод - модуль не передает вообще информацию в ардуино (у меня это уно). Скетч прикрепляю.

int x = 5;
int y = 3;
int ch = 1;
String val = "";
int ledpin=13;

void setup()
{
  delay(3000);
  Serial.begin(115200);
  delay(300);
  Serial.println("AT+CMGF=1");//режим кодировки смс, если вставить лишнее отправляет в смс
  delay (300);
  Serial.println("AT+CLIP=1");// вкл АОН
  delay (300);
  Serial.println("AT+CMGR=1");// читаем смс
  delay (300);
  Serial.println("AT+CSCS=\"GSM\"");//режим кодировки текста
  delay (300);
  Serial.println("AT+CNMI=2,2");
  delay(2000);
pinMode(ledpin, OUTPUT);
}

void loop()
{

  //===================================================================
    if (Serial.available())//если что-то пришло на GSM модуль
  {
  delay(200);//выдержка времени, чтобы вся инфа успела придти на модуль прежде чем мы начнем его анализировать
    
    while (Serial.available())
    {
    ch = Serial.read(); //считываем с порта информацию// char убрать
    val += char (ch); // присваиваем переменной val
    delay(20);
     }
  pinMode (ledpin, HIGH);
}
}

 

аналогичная же картина получается и при использовании подсказки Sergy1222

int x = 5;
int y = 3;
char ch = 0;
String val = "";
int ledpin=13;

void setup()
{
  delay(3000);
  Serial.begin(115200);
  delay(300);
  Serial.println("AT+CMGF=1");//режим кодировки смс, если вставить лишнее отправляет в смс
  delay (300);
  Serial.println("AT+CLIP=1");// вкл АОН
  //delay (300);
  //Serial.println("AT+CMGR=1");// читаем смс
  delay (300);
  Serial.println("AT+CSCS=\"GSM\"");//режим кодировки текста
  delay (300);
  Serial.println("AT+CNMI=2,2");
  delay(2000);
  pinMode(ledpin, OUTPUT);
}

void loop()
{
 
  //===================================================================
 
    while (Serial.available())
    {
     delay(10);
     if (Serial.available()>0)
     {
    ch = Serial.read();
    if (ch =='"')//считываем с порта информацию
    {
      break;
    }
    val += char (ch); // присваиваем переменной val
    delay(20);
     }
    }
    if (val.length()>0)
    {
  pinMode (ledpin, HIGH);
    }
}

 

rrr111
Offline
Зарегистрирован: 04.10.2016

По всей видимости, действительно, сообщения просто "оседают в память" (не информируя ардуинку о приходе нового смс). Ниже привожу скриншоты из AT справочника для данного gsm модуля.. Я правильно понимаю, что нужно писать, что: CNMI=0,2   ?В общем за сегодняшний вечер подбирая различные коды, у меня так и не получилось принять и считать смс при помощи данного gsm модуля..

okta
Offline
Зарегистрирован: 10.01.2015

Я так понимаю, что преобразователя USB TTL UART у вас нет. Купите. Он стоит копейки. Подключите к компьютеру модуль через него, руками повводите комманды и посмотрите что модуль отвечает.

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

В общем надо понять что вам отвечает модуль.

В итоге надо получить что-то такое (это лог по вашему коду на моем модуле):

//=======setup===============
AT+CMGF=1
OK
AT+CLIP=1
OK
AT+CSCS="GSM"
OK
AT+CNMI=2,2
OK

//-----------входящий звонок
RING
+CLIP: "79*********",145,,,,1
RING
//----------позвонивший сбросил вызов
+CIEV: "CALL",0
ERROR

//-----------пришла SMS
+CIEV: "MESSAGE",1
+CMT: "+79*********",,"2016/11/14,23:19:58+03"
Test
 
 
okta
Offline
Зарегистрирован: 10.01.2015

PS Я надеюсь вы скетч заливаете в дуню отключив её от RX/TX gsm a6 модуля?

rrr111
Offline
Зарегистрирован: 04.10.2016

да, USB TTL UART, к сожалению, отсутствует,  уже заказал - жду когда придет...
tx,rx отключаю.

Тогда сейчас остается ждать, когда придет USB TTL UART, чтобы понять причину молчания gsm модуля. Когда придет USB TTL UART - проверю и отпишусь.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

okta пишет:

PS Я надеюсь вы скетч заливаете в дуню отключив её от RX/TX gsm a6 модуля?

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

Вместо переходника можно использовать дуину, просто замкнуть reset на gnd (или можно вынуть МК), ну и подсоединить RX-RX TX-TX, дальше в любом терминале смотреть (хоть в мониторе порта, я в putty проверял)

rrr111
Offline
Зарегистрирован: 04.10.2016

Подключил так, как посоветовал Сергей.
Несколько замечаний по обмену АТ командами:

1) При загрузке модуля - модуль автоматически выводит в монитор порта определнную информацию (об этом ранее была уже информация в интернете).

2)На некоторые АТ команды модуль выдает ошибки. 

3) Обязательно сначала включить ардуино, только затем модуль.

4) Отвечает на АТ команды только при установке CR (возврат каретки), при установке "Новая строка" - ответа на АТ команды не поступает (сами команды высвечиваются в мониторе порта, но они остаются без ответа)... Может вся проблема в этом? Если оно так, то как можно ее решить?

5) При подаче команд AT+CMGR=1, AT+CSCS=\"GSM\" - выдает ошибку (ERROR:321)...

Прикрепляю скрин с ответами рабочих АТ команд.

 

Также прикрепляю скетч,который сегодня загружал.. светодиод так и не загорался... Хотя в мониторе порта по сути сообщение то выходит... 

int x = 5;
int y = 3;
int ch = 0;
String val = "";
int ledpin=13;

void setup()
{
  delay(3000);
  Serial.begin(115200);
  delay(300);
  Serial.println("AT+CMGF=1");//режим кодировки смс, если вставить лишнее отправляет в смс
  delay (300);
  Serial.println("AT+CLIP=1");// вкл АОН
  //delay (300);
  //Serial.println("AT+CMGR=1");// читаем смс//НА ЭТО ВЫВОДИТ ERROR
  delay (300);
  //Serial.println("AT+CSCS=\"GSM\"");//режим кодировки текста//НА ЭТО ВЫВОДИТ ERROR
  delay (300);
  Serial.println("AT+CNMI=2,2");
  delay(2000);
  pinMode(ledpin, OUTPUT);

}

void loop()
{
 
  //===================================================================
   if (Serial.available())//если что-то пришло на GSM модуль
  {
   delay(200);//выдержка времени, чтобы вся инфа успела придти на модуль прежде чем мы начнем его анализировать
    
    while (Serial.available())
    {
    ch = Serial.read();
    val += char (ch); // присваиваем переменной val
    delay(20);
     }
  pinMode (ledpin, HIGH);
    }

}

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:

1) При загрузке модуля - модуль автоматически выводит в монитор порта определнную информацию (об этом ранее была уже информация в интернете).

 

Да, но в чем проблема? Никто не мешает сначала включить модуль, потом подключать его к serial, если это как-то мешает работе.

rrr111 пишет:

2)На некоторые АТ команды модуль выдает ошибки. 

Постоянно, даже на ATI, но если напрямую через putty команды посылать, то очень редко ошибко выдает. Ну и при повторном запросе почти всегда отвечает нормально уже. Скорее всего особенность модуля, жду SIM800 и SIM900, посмотрю как с ними будет..

rrr111 пишет:

3) Обязательно сначала включить ардуино, только затем модуль.

Зачем? Все прекрасно работает при любом подключении..

rrr111 пишет:

4) Отвечает на АТ команды только при установке CR (возврат каретки), при установке "Новая строка" - ответа на АТ команды не поступает (сами команды высвечиваются в мониторе порта, но они остаются без ответа)... Может вся проблема в этом? Если оно так, то как можно ее решить?

Не замечал такой проблемы, но Serial.write(0x0D); после команды сработает?

 

На "AT+CREG?" после подключения что говорит? 

rrr111
Offline
Зарегистрирован: 04.10.2016

Добрый день.
1. Никаких проблем, просто наблюдение.
2. На все остальные команды (которые я отправлял, т.е которые на скрине -у меня стабильно без сбоев были ответы "ок"). Получается сам модуль не стабильно отвечает на некоторые команды и, возможно, по этой причине он выполняет действия..
3. У меня при включении сначала модуля, а затем ардуины - не выходит в монитор порта ничего.. Т.е модуль будто не прогружается, хотя звонки принимает(без отображения в мониторе порта).
4. Последние две упомянутые Вами команды не отправлял (сегодня вечером попробую их отправить и посмотрю что ответит).

Итого: получается, что скорее всего основная проблема - надежность работы модема (не всегда срабатывают АТ команды)... Хотя смс сам модем отправляет стабильно и без ошибок..

В целом вопрос о получении (в телефоне всегда выходит галочка, что получатель, т.е модем поменял смс. Можно сделать вывод смс модуль всегда получает) и прочтении (видимо, модем просто не читает смс) смс остался открытым..

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:
Добрый день. 3. У меня при включении сначала модуля, а затем ардуины - не выходит в монитор порта ничего.. Т.е модуль будто не прогружается, хотя звонки принимает(без отображения в мониторе порта).

Доброго дня. Это странно, попробуйте через putty посылать команды, у меня все отображается. На команды модуль тоже не отвечает в мониторе? Если Вы про то, что при подключении он ничего не выводит, то это нормально, он уже вывел все, когда включился, и теперь только на команды будет реагировать.

rrr111
Offline
Зарегистрирован: 04.10.2016

Вечером еще раз попробую, результаты оглашу.

Я вот чего подумал, по сути модуль мне сообщение же прочитал и номер определил (на скрине видно). Получается, что сообщение модуль получает и отправляет данное сообщение в ардуино...
Можно ли сделать из этого вывод, что проблема не в железе, а в скетче?

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:
Вечером еще раз попробую, результаты оглашу. Я вот чего подумал, по сути модуль мне сообщение же прочитал и номер определил (на скрине видно). Получается, что сообщение модуль получает и отправляет данное сообщение в ардуино... Можно ли сделать из этого вывод, что проблема не в железе, а в скетче?

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

rrr111
Offline
Зарегистрирован: 04.10.2016

Sergy1222 пишет:

На "AT+CREG?" после подключения что говорит? 

в ответ приходит 1,1

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:

в ответ приходит 1,1

Значит все ОК, а то в предыдущих скринах было просто 1, а это не хорошо :)

Командами все нормально приходит-уходит?

rrr111
Offline
Зарегистрирован: 04.10.2016

Командами - да, все отлично работает..
Тут всплыла одна ошибка в конце (в цикле исполнения) указано pinMode, а нужно digitalWrite... Исправил - все равно диод не горит.

rrr111
Offline
Зарегистрирован: 04.10.2016

Вопрос стираю, все заработало. Пришлось повозиться со скетчем в части изменения скорости связи соединения модуля и ардуино (просто AT+IPR=9600 не работает)

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:

Вопрос стираю, все заработало. Пришлось повозиться со скетчем в части изменения скорости связи соединения модуля и ардуино (просто AT+IPR=9600 не работает)

на 115200  сделал?

rrr111
Offline
Зарегистрирован: 04.10.2016

Sergy1222 пишет:

rrr111 пишет:

Вопрос стираю, все заработало. Пришлось повозиться со скетчем в части изменения скорости связи соединения модуля и ардуино (просто AT+IPR=9600 не работает)

на 115200  сделал?

Нет, на 115200 выходят "квадратики".... примерно 1 раз из 5-7 правильно определяет номер, а текст смс всегда ошибается... пришлось переходить на меньшую скорость.. При этом есть нюансы, выявившиеся в ходе "проб и ошибок":
При каждом запуске приходится делать "сброс" gsm модуля. Единажды сделать сброс и настроиться на скорость 9600 - не получается, все равно при подключении остаются "квадратики", А при сбрасывании при каждом включении - работает стабильно.

Выкладываю кусок скетча (все остальное в скетче остается как и прежде для данной библиотеки), который необходим для стабильной работы этого модуля :-)

Serial.begin(9600);                  //подключаем порт компьютера
  Serial.println("proverka GSM");
  mySerial.begin(115200);                //подключаем порт модема (при других скоростях не отвечает)
//==========================================
  delay(100);
  mySerial.println("ATZ0");
delay(100);
  mySerial.println("ATZ+IPR=9600");
  delay(100);
  mySerial.end();
  delay(100);
  mySerial.begin(9600);
delay(100);
//========================================== 

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Хммм.. интересный вариант, надо будет попробовать..

rrr111
Offline
Зарегистрирован: 04.10.2016

Пробуйте, потом напишете что получилось))

Пробовал по-разному получить стабильную работу, но получилось "заставить" работать стабильно лишь добавлением этих строк.

okta
Offline
Зарегистрирован: 10.01.2015

Надобность mySerial.println("ATZ0"); под вопросом.

В остальном, я пришел к тому же решению, разве что эту часть инициализации заключил в цикл, условием выхода из которого - ответ OK на комманду AT на скорости 9600. Т.к. не всегда модуль на софтверном сериале на скорости 115200 воспринимает комманду переключения с первого раза.

flyback
Offline
Зарегистрирован: 23.11.2016

Для работы на 115200 у меня получилось с библиотекой AltSoftwareSerial https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html, но и в этом случае требуется перезапуск A6 - чирк землей по RST. Кто-нибудь может подсказать как это сделать без рук, а "с ноги" ардуины ? Я пробовал ключом на npn транзисторе, давал импульсы от 10 до 100мс - не сбрасывается (

toc
Offline
Зарегистрирован: 09.02.2013

flyback, не знаю, но как вариант можно выключить А6 командой AT+CPOF

 и потом включить подав high на пин pwr_key на 2 секунды.

flyback
Offline
Зарегистрирован: 23.11.2016

Так проблема не в том, каким способом перезапустить модуль (землей по ресету или 5В на PWK), а в том как это организовать. Напрямую с ардуины нельзя - потребление на обоих выводах модуля больше номинального на выходах ардуины - могут выгореть. А транзисторный ключ у меня не срабатывает. Я не электронщик, поэтому не понимаю почему. Пробовал реле в нагрузку ключа - срабатывает а А6 нет. Смотрю анализатором на выходе ключа - есть четкий импульс, но модуль на него не реагирует. Срабатывает только если перетыкать проводок вручную.

Я попробовал коммутировать землей через реле в нагрузке транзисторного ключа ключа - так работает, но это какой то "колхоз", а хотелось бы интеллигентно

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

rrr111 пишет:

Пробуйте, потом напишете что получилось))

Пробовал по-разному получить стабильную работу, но получилось "заставить" работать стабильно лишь добавлением этих строк.

Вот жеж кака, открыл один из вариантов скетча, а там у меня именно так и сохранено :) только ATZ0 не было, но и это не помогло.. Попробую еще вариант flyback, вдруг :)

okta, не могли бы Вы выложить свой цикл проверки? И как Вы считываете что пришло?

okta
Offline
Зарегистрирован: 10.01.2015

Код набросал примерно, т.к. оригинальный на другом компе и будет доступен не скоро. Модуля под рукой нет, так что без теста на реальном железе (по предыдущему опыту - максимум с 3х попыток модуль переключался на нужную скорость). Смысл там должен быть ясен - на скорости 115200 отправляем команду на переключение на 9600, сами переключаемся на 9600, отправляем команду АТ, смотрим, если модуль ответил ОК, то выходим из цикла, если нет, то опять включаем 115200 и отправляем команду на переключение скорости и т.д.

  boolean ok=false;
  String str="";
  do{
    mySerial.begin(115200);
    delay(100);
    mySerial.println(F("ATZ+IPR=9600"));
    delay(100);
    mySerial.end();
    delay(100);
    mySerial.begin(9600);
    delay(100);
    mySerial.println(F("AT"));
    delay(500);
    str="";
    while(mySerial.available())
    {
      char ch=mySerial.read();
      str+=ch;
      delay(10);
    }  
    if(str.indexOf(F("OK"))>-1){ok=true;}
    else{mySerial.end();delay(500);ok=false;}
  }while(!ok);

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

okta пишет:

Код набросал примерно, т.к. оригинальный на другом компе и будет доступен не скоро. Модуля под рукой нет, так что без теста на реальном железе (по предыдущему опыту - максимум с 3х попыток модуль переключался на нужную скорость). Смысл там должен быть ясен - на скорости 115200 отправляем команду на переключение на 9600, сами переключаемся на 9600, отправляем команду АТ, смотрим, если модуль ответил ОК, то выходим из цикла, если нет, то опять включаем 115200 и отправляем команду на переключение скорости и т.д.

  boolean ok=false;
  String str="";
  do{
    mySerial.begin(115200);
    delay(100);
    mySerial.println(F("ATZ+IPR=9600"));
    delay(100);
    mySerial.end();
    delay(100);
    mySerial.begin(9600);
    delay(100);
    mySerial.println(F("AT"));
    delay(500);
    str="";
    while(mySerial.available())
    {
      char ch=mySerial.read();
      str+=ch;
      delay(10);
    }  
    if(str.indexOf(F("OK"))>-1){ok=true;}
    else{mySerial.end();delay(500);ok=false;}
  }while(!ok);

 

Спасибо!

С вашего позволения что бы более корректно работало можно отключить эхо

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
boolean ok=false;
String str="";
void setup() {
Serial.begin(9600);
do{
  mySerial.begin(115200);
  delay(100);
  mySerial.println(F("ATZ+IPR=9600"));
  delay(500);
  mySerial.end();
  delay(100);
  mySerial.begin(9600);
  delay(100);
  mySerial.println(F("ATE 0"));//отключаем эхо
  delay(100);
  mySerial.println(F("AT"));
  delay(100);
  str="";
  while(mySerial.available())
  {
    char ch=mySerial.read();
    str+=ch;
    delay(10);
  }  
  if(str.indexOf(F("OK"))>-1){
    ok=true;
    Serial.println("IPR:9600 OK");}
else{
  mySerial.end();delay(500);ok=false;
  Serial.println("IPR not 9600");}
}while(!ok);
}
void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Вот спасибо, добрые люди :)

Подскажите, а в 

mySerial.println(F("ATZ+IPR=9600"));

как работает "F"?

okta
Offline
Зарегистрирован: 10.01.2015

F для размещения строки во флэш-памяти (чтоб RAM не отжирать строками).