Я использую 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);
}
Ответ 1 · рейтинг 16 · hlovdal
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-команды без чтения и анализа текста ответа от модема.