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

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

Код ошибки:

OK> + CMGS: 2 5 OK + CMEERROR: 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);
}

2 ответа

Решение

Общее примечание о вашей обработке команд AT.

Нет нет нет! Этот способ сделать это никогда не будет работать надежно. Вы ДОЛЖНЫ ждать > символ, который будет получен перед отправкой "текст для отправки". Или на самом деле это не просто > характер, это четыре символа. Цитата из спецификации 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+CMGSThis command should be abortable.) отправка любого символа прервет действие команды. Процитируем МСЭ V.250:

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

...

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

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

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

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

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

Ответь на твой вопрос.

Основываясь на полученном ответе, я вижу, что ваша проблема не в командном аборте (хотя в вашем разборе есть серьезные проблемы, описанные выше, которые вы должны исправить), и CME ERROR - ваша лучшая подсказка. Из раздела "9.2.1 Общие ошибки" в 27.007 это дает operation not supported как описание для значения 4.

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: конечный код результата вместо обычного конечного кода ошибки ERROR. ОШИБКА возвращается нормально, когда ошибка связана с синтаксисом, неверными параметрами или функциональностью TA.

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

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

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

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

Итак, подведем итог

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

cell.println("AT+CNMI=3,3,0,0"); // установить модуль для отправки данных SMS на серийный номер после получения

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

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

AT + CNMI = 3,3,0,0

Большое спасибо за публикацию этого!

Другие вопросы по тегам