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
Большое спасибо за публикацию этого!