"Зеленые человечки" при отправке смс

Pochemushka
Offline
Зарегистрирован: 12.12.2014

Всех приветствую. 

Столкнулся с какой то непонятной "бедой": простой скетч один раз отправка смс происходит второй раз нет. 

Подробности: Arduino Uno на ней GSM/GPRS Shield. К шилду вопросов нет, работал несколько месяцев на основной Arduino Mega в боевом режиме. Решил я вынести GSM на отдельную плату и сделать коммуникационный модель отдельно. 

Ниже приведенный скетч получает сообщения по смс отправляет их на master arduino, которые исполняет команды и шлет ответы, которые коммуникационная arduino шлет пользователю. 

Проблема:  в setup после старта происходит отсылка сообщения, а вот при получении сообщения от master arduino не происходит отправки сообщения. Функция endSMS() вешает коммуникационную arduino и баста. 

Понятно, что можно переписать без библиотеки, но есть свои тараканы в части master arduino, да и просто хочется разобраться что и как. 

Прилагаю скет + скрин порта. ПО коментариям в скетче думаю все будет понятно. 

Идет загрузка. Модем стартует, приходит смс что модем стартанул. Далее я отправляю смс вида "Guard:status", смс уходит на master arduino, обрабатывается оттуда прилетает что отправить в ответ и тут приходит писец.. 

Может кто сталкивался - помогите!

#include <GSM.h>
#define PINNUMBER "....."

GSM gsmAccess;
GSM_SMS sms;
boolean startedGSM=false;
char root_phone[20]="+79.................9"; //
int pin_inter=9;
String Var="";
 char remoteNumer_char[20];
String smsText="";
boolean yes_sms=false;


//=====================================GET_SMS====================================
void get_sms(){
String smsbuffer_getsms;
String command_getsms;
char numer_phone[20];
String numer_phone_string="";
char s_sms;
int index_separ_sms=0;
      if(sms.available()){
           sms.remoteNumber(numer_phone, 20); 
           numer_phone_string=String(numer_phone);
           if (!sms.peek()==':'){ sms.flush();}
            while (s_sms = sms.read()) smsbuffer_getsms+=s_sms;
            sms.flush();
              command_getsms=numer_phone_string+":"+smsbuffer_getsms+":";       
              send_serial_RT(command_getsms);
                        
                        }
                     
                       }
                         
  
void send_serial_RT(String A)//отправляем сообщения контроллерам
{
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(250);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(A);
delay(500);//задержка для приема сообщения
digitalWrite(pin_inter, LOW);
delay(250);
} 

void rx_uart()
{
 
 unsigned long time;
 int index_separ_sms=0;

String remoteNumer="";
detachInterrupt(0);//отключаем прерывание
interrupts();
Var=""; //на всякий случае хлопаем строку куда будем лить инормацию из порта
time = millis();
while (!Serial.available() and (millis()-time<2000))// ждем сообщения  2 секунды и выходим
delay(20);
delay(200);//еще немного подождем
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
Serial.println();
Serial.println(Var);
//==== парсим  сообщение из порта для отправки по смс
              index_separ_sms=Var.indexOf(":",0);              
              remoteNumer=Var.substring(0,Var.indexOf(":",0));
              remoteNumer.toCharArray(remoteNumer_char, remoteNumer.length()+1);
              smsText=Var.substring(index_separ_sms+1,Var.length());
              yes_sms=true;
             attachInterrupt(0, rx_uart, RISING);//активируем прерывание? а то 1  раз примем сообщение из порта и все кино кончилось
}

void setup() {
pinMode(pin_inter, OUTPUT);
attachInterrupt(0, rx_uart, RISING);//определяем функцию по прерыванию

  Serial.begin(9600);
  Serial.println("Arduino starting.");
  Serial.println("GSM Shield begining");
  while(!startedGSM) { // стартуем мопед
     if (gsmAccess.begin()==GSM_READY){
         startedGSM = true;
         Serial.println("GSM Shield started!");
                                       }
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }   
                        }
if (startedGSM){ sms.beginSMS(root_phone); sms.print("Arduino started!");sms.endSMS();} //если мопед взлете сообшаем хозяину                       
              }

void loop() {
  get_sms();
          if(yes_sms){ // если есть смс для отправки отправляем
            
            Serial.println("yes_sms -YES");//проверка входа в условие
            Serial.println(remoteNumer_char);
            Serial.println(smsText);
            sms.beginSMS(remoteNumer_char); 
            Serial.println("Sms numer - yes!"); // проверка установка номера отправки
            sms.print(smsText); 
            Serial.println("Sms text- yes!"); //проверка записи в порт модема сообщения
            sms.endSMS();
            Serial.println("yes_sms -send!"); //вот тут зеленые человечки - не отправляет!!
            yes_sms=false;  
                      }
             }

Pochemushka
Offline
Зарегистрирован: 12.12.2014

Хочу добавить: беда проявляется  при компиляции на разных компьютерах и разных IDE, так же несколько раз скачаны их разных мест библиотека GSM :(

Pochemushka
Offline
Зарегистрирован: 12.12.2014

По ходу ларчик открывается очень просто: прерывание заканчивается раньше чем отрабаотывается функция endSMS(), те часть функции выполняется, например установка номера, далее прерывание заканчивается вываливаемся в то место откуда ушли в прерывание а там отправкой смс и не пахло.

Перерписал на AT командах  и вынес функцию отправки смс за пределы прерывание те в loop но и тут засада: смс отправляется по ключу которых передается из прерывания, в конце функции отправки смс ключ отключается. Выяснилось что функция отправки смс исполняется не в одном лупе, те в первом лупе установка номера в следующем самоо соощение и так далее, а так как ключ уже отключе то часть функции выполняется, а часть нет. Я для проверки убрал отключение ключа отправки внутри функции отправки смс, так смски пачками посыпались пока дуину не вырубил.  Нужно как то кроме delay томозить loop пока сообщение  не отправиться. Подбирать delay это костыль. Скорее всего смотрю в сторону отлавливания ответа от отправке - если CMGS: прилетело значит ушло - можно отпускать loop. Ни у кого нет отпыта как тормозить loop между AT командами без delay? 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Скорее всего смотрю в сторону отлавливания ответа от отправке - если CMGS: прилетело значит ушло - можно отпускать loop.

сам ответил - по флагу