Отправить смс с M590

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

  1. Rapidshe

    Rapidshe Нуб

    Добрый день! помогите понять, что за прикол...
    короткие смс отправляются без проблем, а вот с длинными проблема...
    в кратце о скетче: смс розетка с различными режимами работаты...
    начальная настройка модуля
    Код (C++):
     //настройка М590
      gsm.begin(9600);
    //gsm.begin(19200); delay(200); gsm.println("AT+IPR=9600");delay(200);gsm.begin(38400);delay(200); gsm.println("AT+IPR=9600");delay(200);gsm.begin(57600);delay(200); gsm.println("AT+IPR=9600");delay(200);gsm.begin(74880);delay(200); gsm.println("AT+IPR=9600");delay(200);gsm.begin(115200); delay(200);gsm.println("AT+IPR=9600");delay(200);
      delay(200);
      gsm.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
      delay(200);
      gsm.println("AT+CMGD=0,3");
      delay(200);
      gsm.println("AT+CLIP=1");  //включаем АОН
      delay(200);
      gsm.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
      delay(200);
      gsm.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
      delay(200);
      gsm.println("AT+CNMI=2,2");
      delay(200);
    функция отправки смс:
    Код (C++):
    void smssend(String text, String phone) { //процедура отправки СМС
      Serial.println("SMS send started");
      gsm.println("AT+CMGS=\"" + phone + "\"");
      delay(500);
      gsm.print(text);
      delay(500);
      gsm.print((char)26);
      delay(5000);
    /* val1 = ""; пытался сделать так, чтоб ардуина ждала ответа "ОК" от модуля и продолжала работу, но что то не сложилось....
      do {
         while (gsm.available())
             {
             ch = gsm.read();
             val1 += char(ch);
             delay(10);}
             }
             while (val1.indexOf("OK") < 0);
      Serial.println(val1);
      val1 = "";*/

      Serial.println("SMS send complete");
    }
    и формирование самого сообщения:
    прибавляем к строке, отправленной потом в модуль, кусок текста с поятоянной проверкой на длину сообщения. и если длина сообщения достигает указанного предела, сообщение отправляется, строка обнуляется и опять начинает заполнятся для следующей смски. опять же с проверкой на кол-во символов
    Код (C++):
    void FullStatus() {
    sms = "";
      for(int i = 0; i <= numPins -1; i++) {
       val3 = "R";
       val3 += (i+1);
       switch (relayMode[i]) {
          case 1:{
                val3 += " manual ";
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                if (PinStatus[i]==ON) {val3 += "ON"; val3 +='\n';}
                else {val3 += "OFF"; val3 +='\n';}
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                }
          break;
          case 2:{
                 val3 += " heat ";
                 if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                 if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 val3 += ttarget1[i];
                 val3 += " ";
                 val3 += ttarget2[i];
                 val3 +='\n';
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                  }
          break;
          case 3:{
                 val3 += " cool ";
                 if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                 if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 val3 += ttarget1[i];
                 val3 += " ";
                 val3 += ttarget2[i];
                 val3 +='\n';
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                }
          break;
          case 4:{
                 val3 += " sign" ;
                 if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                 if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 val3 += "Ch";
                 val3 += signin[i];
                 val3 += " Lvl";
                 val3 += signlvl[i];
                 val3 +='\n';
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 }
          break;
          case 5:{
                 val3 += " time\n";
                 if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                 if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 val3 += "Int1";
                 for (int n = 0; n <= 6; n++)
                     {
                     if (dayon1[i][n] == true) val3 += "+";
                     else  val3 += "-";
                     }
                 val3 += " on ";
                 val3 += h1on[i];
                 val3 += ":";
                 val3 += m1on[i];
                 val3 += " off ";
                 val3 += h1off[i];
                 val3 += ":";
                 val3 += m1off[i];
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }

                 val3 += "\nInt2";
                 for (int n = 0; n <= 6; n++)
                     {
                     if (dayon2[i][n] == true) val3 += "+";
                     else  val3 += "-";
                     }
                 val3 += " on ";
                 val3 += h2on[i];
                 val3 += ":";
                 val3 += m2on[i];
                 val3 += " off ";
                 val3 += h2off[i];
                 val3 += ":";
                 val3 += m2off[i];
                 val3 +='\n';
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 }
          break;
          case 6:{
                 val3 += " timer ";
                 if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                 if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 val3 += ((timerval[i]-rtc.getUnixTime(t))/60);
                 val3 += " min\n";
                if ((sms.length() + val3.length()) <= 130) {sms += val3; val3=""; }
                if ((sms.length() + val3.length()) > 130) { Serial.println(sms); smssend(sms, String("+79161112219")); sms = ""; sms += val3; val3=""; }
                 }
          break;
          }
      }
    Serial.println(sms);

    smssend(sms, String("+79161112219"));
    sms = "";
    }
    в монитор прилетает :
    Код (C++):
    R1 cool 12 24 // этот кусок не приходит. приходит пустая смс
    R2 time
    Int1+++++++ on 9:29 off 9:30
    Int2+++++++ on 13:56 off 13:40
    R3 manual OFF
    R4 heat 14 28
    R5 timer 6762 min

    SMS send started
    SMS send complete
    R6 signCh1 Lvl1 //этот кусок приходит
    R7 signCh2 Lvl1

    SMS send started
    SMS send complete
    AAT+CMGS="+79161112219"
    >
    +CMGS: 3

    OK
     
    изначально пробовал отправлять смски длиной вплоть до 160символов и они приходили. далее происходили глюки, но оно и понятно.
    как видно в коде при формировании сообщения я снизил длину сообщения до 130символов и всёравно приходит пустое смс. короткая часть статуса приходит нормально. примечательно что изначально (при ограничении на длину сообщения в 155 символов) сообщения отправлялись нормально, а потом начали приходить пустые сообщения. я уменьшил ограничение до 145 символов и сообщения приходили нормально. потом опять начали приходить пустые сообщения. такое ощущение что где то забивается память. уже всячески пытался удалить смски с модуля...
    подскажите где копать?

    модуль доработан кондером 6.3в 3300
     
    Последнее редактирование: 24 апр 2016
  2. Rapidshe

    Rapidshe Нуб

    ардуина про мини,
    Скетч использует 25 690 байт (83%) памяти устройства. Всего доступно 30 720 байт.
    Глобальные переменные используют 1 316 байт (64%) динамической памяти, оставляя 732 байт для локальных переменных. Максимум: 2 048 байт.
    проверку на длину сообщения вынесу в отдельную функцию завтра...
    но не пойму почему изначально сообщения отправлялись, а потом нет.

    питание от usb-ttl
    зная особенности модуля, можно подумать что виновато питание....

    но может надо как то иначе отправлять или как то иначе чистить память симки...
     
    Последнее редактирование: 24 апр 2016