SerialreadBytes()+GSM модем не работает.

Nikola_Egorov
Offline
Зарегистрирован: 19.12.2015

Помогите, пожалуйста, начинающему Ардуинщику.

#include <SoftwareSerial.h>
 
SoftwareSerial modem (6,8);
char inNumber[11];
char message[99];
String inputString = "";         
boolean stringComplete = false;  
 
void State(String aT) 
{
  modem.print(aT);
  modem.print("\r");
  modem.println("\n");
  delay(500);
  while (modem.available()) 
    {
      char inChar = (char)modem.read();
      inputString += inChar;
      if (inChar == '\n') 
        {
          stringComplete = true;
        }
    }
}
 
void ReadMessage (String aT)
{
  modem.print(aT);
  modem.print("\r");
  modem.println("\n");
  delay(500);
  while (modem.available())
    {
      modem.readBytes(message, 99);
      delay(500);
      for (int i=0; i<100; i++)
         {
            if (i != 99) Serial.print(message[i]);
            else Serial.println(message[i]);
         }
      Serial.println(message[90]);
      for (int i=0, k=22; i<12; i++, k++)
         {
            inNumber[i] = message[k];
            if (i != 11) Serial.print(inNumber[i]);
            else Serial.println(inNumber[i]);
         }
      delay(500);
      for(int i=0; i<151; i++)
        {
          if (i < 11) inNumber[i] = 0;
          message[i] = 0;
        }
    }
}
 
void Event()
{
  State("AT");
  if (stringComplete) 
    {
      if (inputString == "\r\nOK\r\n")
         {
           Serial.println(inputString);
           inputString = "";
           stringComplete = false;
           ReadMessage ("AT+CMGR=1");
         }
      inputString = "";
      stringComplete = false;
    }
}
 
void setup() 
{
  modem.begin(9600);
  modem.setTimeout(2000);
  Serial.begin(9600);
  inputString.reserve(200);
}
 
void loop() 
{
  Event();
}
 
 
 
 
Nikola_Egorov
Offline
Зарегистрирован: 19.12.2015
Ответ с серийника:
 
OK
 
 
+CMGR: "REC READ","+380504129568",,"15/12/21,15:46:02+08"
12
 
А должно быть:
 
OK
 
 
+CMGR: "REC READ","+380504129568",,"15/12/21,15:46:02+08"
12345

 

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

Ахренеть!

И в чём же начинающий ардуинщик нуждается в помощи?

Мне надо прочитать скетч, догадаться, что автор хотел сделать, потом понять что и почему не получилось и найти решение?

А не жирно? 

Может потрудитесь объяснить Вашу проблему?

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

1. Найдите файл SoftwareSerial.h

2. Найдите в нём строку #define _SS_MAX_RX_BUFF 64 // RX buffer size

3. Увеличьте с 64-х до 128-ми.
 
Возможно поможет.
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

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

Nikola_Egorov
Offline
Зарегистрирован: 19.12.2015

Arans, спасибо, попробую...Я потом понял, что только 64 байта максимум. Поищу строку.

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

Gippopotam пишет:

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

Плюсую, та же история была на Меге при чтении SMS через Hard Serial, поиграл паузами и стабильно заработало. Ну и размер буфера увеличивал опять же.

Nikola_Egorov
Offline
Зарегистрирован: 19.12.2015

Araris, спасибо, увеличил буфер, все полетело!

 

Nikola_Egorov
Offline
Зарегистрирован: 19.12.2015

Еще вопрос, почему Loop выполняется только один раз?

Вот код:

void Event()
{
  while (1)
    {
      State("AT");
      if (stringComplete) 
        {
          if (inputString == "OK\r\n")
            {
              Serial.println(inputString);
              inputString = "";
              stringComplete = false;
              ReadMessage ("AT+CMGR=1");
            }
          inputString = "";
          stringComplete = false;
        }
    }
}

void setup() 
{
  modem.begin(9600);
  modem.setTimeout(2000);
  Serial.begin(9600);
  inputString.reserve(50);
}

void loop() 
{
  Event();
}

 

 

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

Потому что в строке 3 объявлен бесконечный цикл, из которого нет выхода и, соответственно, возврата из Event() в loop().

Nikola_Egorov
Offline
Зарегистрирован: 19.12.2015

Уже разобрался, связано было с тем, что не было задержки и Ат комманда воспринималась еще как вычитка из модема.