GSM SM5100B C M E E R R O R: ошибка 4

Я использую Arduino для управления устройством GSM SM5100B, все работает, кроме случаев, когда я хочу отправить SMS после получения другого. Я понял

Код ошибки:

O K > + C M G S : 2 5 O K + C M E E R R O R : 4

Мой код для обработки полученного выше SMS:

     #include <SoftwareSerial.h>  //Include the NewSoftSerial library to send serial commands to the cellular module. 
        char inchar;                //Will hold the incoming character from the Serial Port. 
        SoftwareSerial cell(2,3); 
        char mobilenumber[] = "0597010129";
        void setup() { 
        //GSM
        Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
        Serial.println("Initialize GSM module serial port for communication.");                       
        cell.begin(9600); 
        delay(35000); // give time for GSM module to register on network etc. 
        Serial.println("delay off");
        cell.println("AT+CMGF=1"); // set SMS mode to text 
        delay(200); 
        cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt 
        delay(200); 
        } 



        void loop() {   

         if(cell.available() >0)//If a character comes in, from the cellular module
         { 
         inchar=cell.read(); 
         Serial.println(inchar); 
         if (inchar=='#'){ // OK - the start of our command 

           delay(10); 
           inchar=cell.read();
           Serial.println(inchar);  

             if (inchar=='a'){ 

               delay(10); 
               Serial.println("The folowing SMS : \n");
               inchar=cell.read();
               Serial.println(inchar); 

               if (inchar=='0'){ //sequance = #a0

                 Serial.println("#a0 was received"); 

             }
             else if (inchar=='1'){//sequance = #a1

                Serial.println("#a1 was received ");
                sendSms();

             }
         }
         cell.println("AT+CMGD=1,4");// AT command to delete all msgs
         Serial.println(" delete all SMS"); 
          } 
        }//end of  if(cell.available() >0) {...}
        }

        void sendSms(){
        //cell.println("AT+CMGF=1"); // set SMS mode to text 
        cell.print("AT+CMGS=");  // now send message... 
        cell.print((char)34); // ASCII equivalent of " 
        cell.print(mobilenumber); 
        cell.println((char)34);  // ASCII equivalent of " 
        delay(500); // give the module some thinking time 
        cell.print(":D hello m3alleg :D");   // our message to send 
        cell.println((char)26);  // ASCII equivalent of Ctrl-Z 
        delay(20000);
}

person mohammad    schedule 23.03.2013    source источник


Ответы (2)


General note about your handling of AT commands.

Нет нет нет! Такой способ никогда не будет работать надежно. Вы ДОЛЖНЫ дождаться получения символа > перед отправкой текста для отправки. Или на самом деле это не просто символ >, это четыре символа. Цитата из спецификации 3GPP 27.005:

  • TA должен послать четырехсимвольную последовательность <CR><LF><greater_than><space> (IRA 13, 10, 62, 32) после того, как командная строка завершится с помощью <CR>; после этого можно вводить текст с TE на ME / TA.

(TA (терминальный адаптер) здесь означает модем, а TE (оконечное оборудование) отправитель AT-команд)

Для любой отменяемой AT-команды (а в 27.005 четко указано для AT + CMGS This command should be abortable.) отправка любого символа прервет выполнение команды. Чтобы процитировать ITU V.250:

5.6.1 Отмена команд

...

Прерывание команд осуществляется передачей от DTE к DCE любого символа.

(DCE (оборудование передачи данных) здесь означает модем и DTE (оконечное оборудование данных) отправитель AT-команд)

Это означает, что если вы отправляете текст для отправки до того, как \ r \ n ›будет отправлен модемом, команда будет прервана. Невозможно дождаться отправки ответа достаточно долго. Вы ДОЛЖНЫ прочитать и проанализировать текст ответа, полученный от модема.

То же самое относится к окончательному коду результата после каждой команды (например, OK, ERROR, CME ERROR и некоторые другие). Например, отправка AT + CMGF = 1, а затем отправка следующей команды без предварительного ожидания OK - это кущение проблем. Поэтому всегда при отправке AT-команд вы ДОЛЖНЫ дождаться окончательного кода результата перед отправкой следующей команды.

Пожалуйста, никогда, никогда не используйте delay для ожидания ответа на AT-команду. Это так же полезно, как пинать собак, которые стоят на вашем пути, чтобы заставить их двигаться. Да, это может действительно сработать несколько раз, но в какой-то момент вы пожалеете о таком подходе ...

Answer to your question.

Основываясь на полученном вами ответе, я вижу, что ваша проблема не в прерывании команды (хотя у вашего синтаксического анализа есть серьезные проблемы, как описано выше, которые вы должны исправить), и ОШИБКА CME - ваш лучший ключ к разгадке. Из раздела 9.2.1 Общие ошибки в 27.007 в качестве описания значения 4 указано operation not supported.

27.005 говорится, что:

Если отправка не удалась по сети или произошла ошибка ME, возвращается окончательный код результата + CMS ERROR :.

Обратите внимание, что это + CMS ERROR, а не + CME ERROR, но это применимо, см. Ниже.

Я предполагаю, что последовательность действий следующая:

Часть обработки AT-команд модема SM100B GSM принимает данные sms, форматирует их в соответствующем формате и отправляет их той части модема, которая взаимодействует с сетью GSM. Он успешно отправляет sms-данные в сеть и сообщает об этом обратно в часть обработки AT-команд, которая затем печатает +CMGS: 25 и окончательный код результата OK. Однако через короткое время сеть отправляет обратно сообщение об отказе от sms, которое затем выдается как ответ + CME ERROR.

Если мое предположение, приведенное выше, верно, должен ли вместо этого ответ быть доставлен как + CMS ERROR? Нет, потому что окончательный ответ на команду AT + CMGS уже был дан (ОК), и никогда не следует возвращать несколько окончательных кодов результата для команды (кроме случаев ошибки (примечание 1)). И хотя + CME ERROR может заменить код окончательного результата ERROR, это не только код окончательного результата. Из описания команды AT + CMEE:

Команда Set отключает или включает использование кода результата + CME ERROR: как указание на ошибку, относящуюся к функциональности MT. Если этот параметр включен, ошибки, связанные с MT, вызывают + CME ERROR: final result code вместо обычного кода окончательного результата ERROR. ERROR обычно возвращается, если ошибка связана с синтаксисом, недопустимыми параметрами или функциями TA.

Таким образом, + CME ERROR может быть как окончательным кодом результата, так и незапрашиваемым кодом результата (возможно, также промежуточным кодом результата).

Но не могла ли команда AT + CMGS дождаться получения отказа сети и вернуть + CMS ERROR? Возможно нет. Не зная слишком много о сетевых деталях отправки sms, может случиться так, что отклонение сегодня может произойти гораздо позже, чем раньше. Такие изменения иногда являются проблемой для AT-команд, связанных с GSM, у которых есть старое наследие, которое изначально было тесно связано с поведением GSM, которое иногда становится все менее и менее верным по мере перехода технологии на GPRS, UMTS, LTE и т. Д.

Примечание 1:

Один из моих бывших коллег часто жаловался на то, как стандарт определяет обработку голосовых вызовов, потому что после ATD1234; сначала вы получите окончательный код результата ОК, а затем, когда вызов завершится, вы получите новый окончательный код результата NO CARRIER. Это просто ужасно плохой дизайн, индикация завершения вызова должна была быть конкретным незапрашиваемым ответом, а не окончательным ответом.

So to summarise

Ваше смс вроде бы отклонено сетью. Попытайтесь выяснить, почему. У вас также есть серьезные проблемы с обработкой AT-команд, которые вы должны исправить; нет способа обрабатывать AT-команды без чтения и анализа текста ответа от модема.

person hlovdal    schedule 23.03.2013

cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to
serial out upon receipt

Для тех, кто ищет ответ на ту же проблему, что и у меня:

Я пытался вывести gsm-модуль из спящего режима, отправив sms, и это не сработало сразу. Телефонный звонок идет прямо на UART, но для sms вы должны использовать эту команду, чтобы настроить модуль на отправку данных SMS на последовательный порт при получении.

AT + CNMI = 3,3,0,0

person BanAnanas    schedule 13.07.2016