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