Обработка команд от SIM800

Тема в разделе "Arduino & Shields", создана пользователем Irinka, 27 окт 2019.

  1. DetSimen

    DetSimen Guest

    можно вапще неизменяемые строки в PROGMEM папхать

    Код (C++):
    const char *const str1 PROGMEM = "text1";
    const char *const str2 PROGMEM = "text2";
    const char *const str3 PROGMEM = "text3";
    const char *const str4 PROGMEM = "text4";

    const char *Strings[] = { str1, str2, str3, str4 };
     
     
    Andrey12 нравится это.
  2. Irinka

    Irinka Нерд

    Otvet.startsWith(*Strings[0]))
    Будет работать?
    Otvet это String
     
  3. DetSimen

    DetSimen Guest

    звездочку не надо
    Otvet.startsWith(Strings[0]))

    работоспособность зависит от того, умеет ли startsWith работать с __FlashStringHelper, я не знаю, глубоко String не изучал, нада матреть.
     
    Andrey12 нравится это.
  4. DetSimen

    DetSimen Guest

    Нет. Я ошибся, у тебя там массив обьектов, так как я написал - не пайдёть. startWith работает тоже с обьектом String.
    Мой код - фтопку.
     
    Andrey12 нравится это.
  5. Irinka

    Irinka Нерд

    Поняла. Спасибо.
     
  6. Irinka

    Irinka Нерд

    От стринг не избавиться если хочется работать со строковыми командами.
     
  7. DetSimen

    DetSimen Guest

    Ты даже не можешь себе прецтавить всю глубину своего ошибания.
    50 лет люди прекрасно работают с православным char * вместо богомезкого String и ничо. Живут какта.
     
    SergeiL и Andrey12 нравится это.
  8. Irinka

    Irinka Нерд

    К примеру, эта же команда, startsWith. При работе с char эту команду заменить на посимвольное сравнение?
    А в скорости выигрыш?
     
  9. DetSimen

    DetSimen Guest

    strncmp() быстрее всех классовых методов. Кстате, унутре String она же и используется, я думаю, String это просто обёртка для ленивых бездельников.
     
    Andrey12 нравится это.
  10. DetSimen

    DetSimen Guest

    опщем, я теорию не преподаю, у мня по утрам алкогольная интоксикацея. Мы с котом еще поспим, пожалуй.
     
    Andrey12 нравится это.
  11. SergeiL

    SergeiL Оракул Модератор

    В период моего познания Си не было String.
    Когда столкнулся именно с ардуино, не с AVR, AVR был гараздо раньше, паявился String.
    Посмотрел, разобрался, но продолжаю пользоваться "char". :)
    PS. оставил и для @parovoZZ возможность ответить. :)
     
    Daniil нравится это.
  12. DetSimen

    DetSimen Guest

    Да он никада у никаво возможности и не спрашивал, просто отвечал да и всё. Впопад, невпопад - пофик. Зато наотвечал уже 10328 сообщениев.
     
  13. SergeiL

    SergeiL Оракул Модератор

    Оставил пару орфографических ошибок, он сильно радуется когда их исправляет! ;)
     
    DetSimen нравится это.
  14. parovoZZ

    parovoZZ Гуру

    странное дело: вроде и возможность есть, а не знаю как воспользоваться.
    Вообще не понимаю, чего от меня здесь хотят.
     
  15. DetSimen

    DetSimen Guest

    Обычного, вдохновенно-безудержного искромётного флуда. :)
     
    Andrey12 и SergeiL нравится это.
  16. SergeiL

    SergeiL Оракул Модератор

    Ну, когда делать нафиг, навернае можна ашибки паисравлять :)
     
  17. Irinka

    Irinka Нерд

    Вот что у меня получилось:
    К примеру запрашиваю команду: AT+CCALR?
    Режим ЭХО включен (ATE1)
    Соответственно в ответ на AT+CCALR? я получаю:

    Код (C++):
    AT+CCALR?

    +CCALR: 1\r\n
    \r\n
    OK\r\n
     
    Т.е. сама команда дублируется в ответ.

    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial SIM800(6,7);



    //Нужные АТ команды
    String AT_komandu[]={
    "AT",//Проверка связи                   0
    "AT+CCALR?",//Проверка сети             1
    "AT+CLIP=1",//"Ustanovlen AON           2
    "AT+CMGF=1",//"Text mode                3
    "AT+CMGDA=\"DEL ALL\"",//Sms udaleny    4
    "ATH",//Sbros vhodiashchego             5
    };

    //Ожидаемые ответы на АТ команды
    String AT_otvetu[]={          
    "OK",//Проверка связи            0
    "+CCALR: 1",//Проверка сети      1
    "OK",//"Ustanovlen AON           2
    "OK",//"Text mode                3
    "OK",//Sms udaleny               4
    "OK",//Сброс входящего           5
    };

    uint8_t Kol_Kom;



    void setup() {
      SIM800.begin(38400);
      Serial.begin(38400);
      Serial.println(F("Zagruzka"));
      delay(1000);
      SIM800.println("AT");//Автонастройка скорости обмена
      //SIM800.println("ATE1");//ЭХО-включено по умолчанию
      Kol_Kom = sizeof(AT_komandu)/sizeof(AT_komandu[0]);
    }





    void Actions(uint8_t act){

    switch (act) {
      case 0:
        Serial.println("Modul` otvechaet");
      break;

      case 1:
        Serial.println("Set` nai`zhena");
      break;

      case 2:
        Serial.println("Ustanovlen AON");
      break;
     
      case 3:
        Serial.println("Text mode");
      break;
     
      case 4:
        Serial.println("Sms udaleny");
      break;

      case 5:
        Serial.println("Sbros vhodiashchego ");
      break;

    }

    }//



    void sendATCommand(String cmd,bool waiting){
      SIM800.println(cmd);
      Serial.println("Komanda: "+cmd);
    }




    void loop() {

    if (Serial.available())SIM800.write(Serial.read());
     
    if(SIM800.available()){
      String Otvet="";
      Otvet = SIM800.readString();
      Otvet.trim();
      Serial.println(".."+Otvet);
      String result=Otvet.substring(0,Otvet.indexOf("\r"));

    //Обработка незапрашиваемых сообщений
    if (Otvet.startsWith("RING")) {
    Serial.println(F("Vhodiashchii` vy`zov"));
    sendATCommand("ATH",false);
    }
    else if (Otvet.startsWith("+CMTI:")) {
    Serial.println(F("Polucheno SMS"));
    sendATCommand("AT+CMGDA=\"DEL ALL\"",false);
    }
    //Обработка незапрашиваемых сообщений
     

        for (int i=0; i <= Kol_Kom-1; i++){
          if  (result==AT_komandu[i] && Otvet.indexOf(result) > -1  && Otvet.indexOf(AT_otvetu[i]) > -1 ) {
            Actions(i) ;
            break;
          }
        }//for
    }//if(SIM800.available()){














    }//loop
     
  18. Irinka

    Irinka Нерд

    Вызовы сбрасывает, смс видит, команды выполняет.
    Таймаут не сделала пока-что, и, честно гвооря, ни разу его и не было при выполнении команд.
    А так думаю что и таймаут нужно делать для каждой команды свой/
    Или с определенной переодичностью отсылать команду АТ или AT+CCALR? и запускать таймер таймаута, если таймаут достигнут проверим еще раз, если отвечает - все ок, иначе перезагрузим СИМ800
     
    Последнее редактирование: 29 окт 2019
  19. Irinka

    Irinka Нерд

    Ещё вопрос, согласно даташита напряжение логической единицы Serial-порта варьируется в пределе 2,1 - 3 Вольт
    http://mt-system.ru/sites/default/files/documents/sim800_hardware_design_v1.10.pdf
    29 страница таблица №9.
    Я по линии RX SIM800 делаю резисторный делитель (два по 10кОм и к 5 Вольтам (как и многие в интернете)), мне сказали, что это не совсем грамотно.
    Безымянный.png
    Так будет правильно?
     
  20. Irinka

    Irinka Нерд

    И сброс модуля:
    Безымянный.png