sim800 + строки как АТ команды

Тема в разделе "Arduino & Shields", создана пользователем stasych, 5 окт 2016.

  1. stasych

    stasych Нерд

    Делаю совой "умный дом". На данном этапе обкатываю общение "умного дома" и Андроид телефона посредством обмена СМСками. Во многих местах скетча приходится вставлять код типа:
    Код (C++):
       Serial2.println("AT+CMGS= \"+7926ххххххх\"");
       delay(100);
       Serial2.println("MEGA 2560 test");
       delay(100);
       Serial2.println((char)26);
    понятно, что это не рационально. А хотелось бы этот кусок кода засунуть в отдельную процедуру.

    1.Однако тогда нужно вместо "MEssage message" использовать строковую переменную. Вот тут у меня и загвоздка. Не могу разобраться со строками. Везде описывают строки типа char[], причем очень лаконично и везде один и тот же пример.

    2. Было бы также очень хорошо "AT+CMGS= \"+7926ххххххх\"" тоже прописать глобальной константой, чтобы потом было удобно менять номер телефона.

    Подскажите пожалуйста как это сделать или где почитать.
     
  2. Vad33

    Vad33 Капитан-оригинал

  3. ostrov

    ostrov Гуру

    Строка это массив элементов типа char, заканчивпющийся нулем. Внутрь можно вставлять что угодно и как угодно.
     
  4. stasych

    stasych Нерд

    Стрингами я тоже пытался баловаться. Только проблема моя была в том, что я в объявлении переменной string писал с маленькой буквы и IDE это не хавал.
     
  5. stasych

    stasych Нерд

    Усложняем помаленьку код и получаем вот что:

    Код (C++):
    void sms_receive()      //процедура получения и обработки смс
    {
      str_message = "";
      while (Serial2.available()) {
        delay(30);
        currSymb = Serial2.read();
        currStr = currStr + String(currSymb);
                                  }
      if (currStr != "")  {    //смс начинается с 50 индекса
        for (i = 50; i < (currStr.length()-2); i++) str_message += currStr.charAt(i);
        currStr = "";
                          }
                       
      if (str_message != "") str_message_print();
                           
      if (str_message == "g 1") {
          i_clock[7] = 1;
          poliv_start();
                                }
      if (str_message == "g 2") {
          i_clock[7] = 2;
          poliv_start();
                                }
    }
     
    В эту подпрограмму я попадаю из строки:
    if (Serial2.available()) sms_receive();

    Все вроде было хорошо. Однако через некоторое время (или через какое-то количество принятых СМС). Модуль перестает откликаться на СМСки, хотя их вроде получает (если смотреть через монитор порта).
    Модуль SIM800L подключен через аппаратный Serial2 платы Mega2560.

    Возникают несколько вопросов на которые у меня пока нет конкретных ответов.
    1. Жизнеспособный ли код представленный выше?

    Можно конечно скопипастить код отсюда например
    https://istarik.ru/blog/arduino/17.html
    но я в нем пока не могу разобраться.

    2. Может переполняется память хранения СМС в модуле и из-за этого возникает моя проблема. Но тогда наверно нужно ее (память почистить) например вот так
    Serial2.print("AT+CMGDA=\"DEL ALL\"\r");
    однако это я тоже пробовал - не помогает.

    Посоветуйте кто сможет.