Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Атомарность выполнения AT-команды
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
koluna
Всем привет!

Может ли в процессе выполнения AT-команды, т. е., между запросами AT+XXX и ответами типа OK, ERROR, ... от модуля/модема придти какой-нибудь URC?
Ну, кроме +CME/CMS и ответов с данными...
Задекларировано ли это где-нибудь?

Код
AT+XXX ...

+ZZZ или что-то еще

+XXX ...
OK | ERROR ...
CADiLO
Может. Задекларировано в самой логике работы сотовой связи.
Любое событие - асинхронно.
Alechek
Цитата(koluna @ Jan 18 2016, 23:33) *
Может ли в процессе выполнения AT-команды, т. е., между запросами AT+XXX и ответами типа OK, ERROR, ... от модуля/модема придти какой-нибудь URC?

А если поставить вопрос по другому: может ли во время отправки AT команды прийти URC? По логике взаимодействия с модулем разницы между двумя вопросами нет, но зато на этот вопрос, по-моему, отввет очевиден.

jcxz
Цитата(koluna @ Jan 19 2016, 00:33) *
Может ли в процессе выполнения AT-команды, т. е., между запросами AT+XXX и ответами типа OK, ERROR, ... от модуля/модема придти какой-нибудь URC?
Ну, кроме +CME/CMS и ответов с данными...
Задекларировано ли это где-нибудь?

Вы не поверите, но URC может прийти даже во время приёма ответа, внутри него. Или между ним и "\r\n"; или между '\r' и '\n'.
Т.е. например: ERR<URC...>OR
Даже такое бывает.
Alechek
Цитата(jcxz @ Jan 19 2016, 13:20) *
Т.е. например: ERR<URC...>OR

Ну, это уже совсем жесть. Которая никак не соотносится со стандартом GSM 07.07
CADiLO
Абсолютно соотносится, так как нет никакого ограничения в стандарте на это.
butthead2
Может прийти в любом месте. Скажу даже больше, в ранних прошивках SIM300C был косяк - URC приходили прямо внутри других строк cranky.gif Такого больше никогда не попадалось, так что по факту надо рассчитывать на приход целых строк но в любом порядке
jcxz
Это конечно косяк, но это печальная реальность - сталкивался с таким в Bluegiga WT-12.
К сожалению - таков уровень их программистов написавших её прошивку.
Baser
Цитата(jcxz @ Jan 19 2016, 10:20) *
Вы не поверите, но URC может прийти даже во время приёма ответа, внутри него. Или между ним и "\r\n"; или между '\r' и '\n'.
Т.е. например: ERR<URC...>OR
Даже такое бывает.

Насчет такого скажу, что это грубая ошибка ПО и при работе с SIM300/SIM900 такого никогда не видел.

Цитата(jcxz @ Jan 19 2016, 12:14) *
Это конечно косяк, но это печальная реальность - сталкивался с таким в Bluegiga WT-12.
К сожалению - таков уровень их программистов написавших её прошивку.

А вот у Bluegiga, подтверждаю, видел. Работал с WT11i и с BLE112 - и там и там случается.
Вроде солидная фирма, их даже Silicon Labs купила, а такие баги.

Цитата(koluna @ Jan 18 2016, 20:33) *
Может ли в процессе выполнения AT-команды, т. е., между запросами AT+XXX и ответами типа OK, ERROR, ... от модуля/модема придти какой-нибудь URC?

Я в своем софте применяю след. гипотезу biggrin.gif
Ответы на команду есть двух видов: от стека модема и от мобильной сети.
Вот я считаю, что между командой и ответом стека ничего влезть не может (не должно rolleyes.gif ).
А вот при ожидании ответа от ГСМ сети может что-нибудь и влезть, хотя тоже очень редко, обычно это ошибки и отлупы от ГСМ сети.
Типа PDP DEACT может придти когда угодно.

А чтобы не разгребать все возможные ответы модема (там бесконечное число вариантов cool.gif ) просто периодически проверяется состояние конекта, и если что не так, запускаются процедуры восстановления.
Alechek
Цитата(CADiLO @ Jan 19 2016, 13:42) *
Абсолютно соотносится, так как нет никакого ограничения в стандарте на это.

О да! В стандартах не прописывают, что п/о должно быть без глюков и багов rolleyes.gif

Цитата(Baser @ Jan 19 2016, 16:42) *
Я в своем софте применяю след. гипотезу biggrin.gif
Ответы на команду есть двух видов: от стека модема и от мобильной сети.
Вот я считаю, что между командой и ответом стека ничего влезть не может (не должно rolleyes.gif ).

Ну и зря. Выполнение команды модемом можно разделить на этапы:
1. Прием команды по физическому интерфейсу.
2. Разбор принятого модемом
3. Выполнение команды.
4. Формирование ответа.
5. Отправка ответа по физическому интерфейсу.

Так вот, даже если допустить, что от момента выполнения команды до отправки ответа ничего влезть не сможет, то как определить фазу выполнения команды?
Пока мы что-то отправляем на модем, нам УЖЕ может валится URC типа "у меня смс новое". Естественно, после отправки команды мы ждем "OK", а получаем "+CNMI" и злимся на модем, что "незванный гость хуже татарина.."
jcxz
Цитата(Baser @ Jan 19 2016, 17:42) *
Я в своем софте применяю след. гипотезу biggrin.gif
Ответы на команду есть двух видов: от стека модема и от мобильной сети.
Вот я считаю, что между командой и ответом стека ничего влезть не может (не должно rolleyes.gif ).
А вот при ожидании ответа от ГСМ сети может что-нибудь и влезть, хотя тоже очень редко, обычно это ошибки и отлупы от ГСМ сети.
Типа PDP DEACT может придти когда угодно.

Имхо - неправильный алгоритм. Я классифицирую по-другому.
Сообщения от модуля к клиенту (не важно GSM или какой другой общающийся через UART посредством команд от клиента) можно разделить на:
а) синхронные - реакция модуля на переданные ему команды клиентом (т.е. - это ответы на команды, в том числе и многострочные);
б) асинхронные - уведомления о некоторых событиях внутри модуля, напрямую несвязанных с переданными ему командами, происходящими асинхронно относительно основного командного обмена.
Любая передача как от клиента к модулю, так и наоборот, делится на кадры (строки). Кадр - это последовательность допустимых символов, ограниченная символами "\r\n" (или одним из них).
После передачи модулю команды клиентом, клиент переходит в состояние ожидания синхронных ответов на команды (могут быть многострочные) и ждёт ответов разбирая входящий поток кадров.
Ожидание заканчивается по получению ответа (или цепочки ответов если команда может генерить цепочку ответных кадров), либо по истечении таймаута ожидания.
Таким образом - URC может вклиниваться в любой момент между командой и первым кадром ответа или между двумя кадрами ответа. лавное - чтобы он не нарушал целостность кадров (строк).
Сам URC тоже должен иметь такой-же формат кадра (строка).
Когда URC влезает внутрь другой строки, нарушая её - это конечно баг, тут уже ничего нельзя сделать.
Alechek
Цитата(jcxz @ Jan 19 2016, 19:38) *
Имхо - неправильный алгоритм. Я классифицирую по-другому.

+1

Добавлю только что "правильные команды" заканчивают свой вывод "OK", а промежуточные ответы формируют с "+" вначале. Таких большинство.
А вот отличить симкомовкий Call Ready от промужуточного ответа (к примеру, на +GMI (SIMCOM_Ltd) проблематично.
Как бы уважаемый Cadilo не защищал производителй модемов, палки в колеса они вставляют..
ArtemKAD
>>А вот отличить симкомовкий Call Ready от промужуточного ответа (к примеру, на +GMI (SIMCOM_Ltd) проблематично.

И в чем проблема? Сложно найти "CALL READY\r\n" ?
Baser
Цитата(Alechek @ Jan 19 2016, 14:53) *
Так вот, даже если допустить, что от момента выполнения команды до отправки ответа ничего влезть не сможет, то как определить фазу выполнения команды?
Пока мы что-то отправляем на модем, нам УЖЕ может валится URC типа "у меня смс новое". Естественно, после отправки команды мы ждем "OK", а получаем "+CNMI" и злимся на модем, что "незванный гость хуже татарина.."

Цитата(jcxz @ Jan 19 2016, 16:38) *
Имхо - неправильный алгоритм. Я классифицирую по-другому.


Ну да, я имел в виду одно, а получилось другое, написал не подумавши laughing.gif

На самом деле, то что я применяю на практике, примерно соответствует описанному вами:
кольцевой приемный буфер для ответов модема, который анализируется по тайм-ауту после прихода последнего байта и периодически во время ожидания ответа. Сканируется на соответствие шаблонам ответов по принципу функции strstr();
так что положение ответа значения не имеет. После обнаружения ответа, ответ удаляется из буфера (только он).
Всякие неожиданные URC периодически сканируются в бэкграунде.
Чтобы уменьшить вероятность переполнения приемного буфера, периодически происходит полная его очистка (с защитными механизмами типа слежения за принимаемыми байтами на уровне прерываний и поднятия RTS).

А вот разбиение на строки по \r\n не использую. Применяю обмен бинарныим данными, кроме того есть присловутые приглашения модема при отправке данных и СМС из одинокой треугольной скобки (>)

А по перемешиванию ответов модема, точно читал в каком-то описании, что что-то, где-то ну точно не должно перемешиваться.
Только деталей совершенно не помню... 08.gif
Alechek
Цитата(ArtemKAD @ Jan 19 2016, 20:34) *
И в чем проблема? Сложно найти "CALL READY\r\n" ?

Смотря как подходить к вопросу.
Чтобы 100% отделить мух от котлет, нужен полный перечень либо мух, либо котлет.
Чем больше перечень, тем больше памяти нужно. Чем более перечень завязан на конкретный тип модема, тем он менее универсальный.
И то и другое маложелательно.

В вопросу.
Что "CALL READY\r\n", что "SIMCOM_Ltd\r\n" являются чисто строками, без цифр, причем длиной 10 символов. По косвенным признакам одинаковы.
Если искать "CALL READY\r\n", то "Call Ready\r\n" можно никогда и не найти, в зависимости от реализации поиска.

Мало того, в 800й серии добавилось еще и "SMS Ready". Видимо, чтобы еще упростить жизнь ардуинщикам. И сделать их железо еще глючней, так как при таком подходе вряд ли кто будет заморачиваться, к примеру PDU режимом для SMS (при наличии в теле сообщения зарезирвированных сочетаний /CONNECT/OK/RDY/.../).
ArtemKAD
>>Чем больше перечень, тем больше памяти нужно.

Пол сотни образцов для всех ответов или URC включая GPRS не займут много памяти.

>>Что "CALL READY\r\n", что "SIMCOM_Ltd\r\n" являются чисто строками, без цифр, причем длиной 10 символов.

Зачем искать "SIMCOM_Ltd\r\n"? Эта строка не несет хоть какую либо информацию. Тип производителя модема с которым работает программа и так известен.

>>По косвенным признакам одинаковы.

Зачем косвенные признаки - это уникальные строки.

>>Если искать "CALL READY\r\n", то "Call Ready\r\n" можно никогда и не найти, в зависимости от реализации поиска.

И зачем нужен такой поиск который не может найти в потоке уникальную строку?

>>Мало того, в 800й серии добавилось еще и "SMS Ready".

И правильно сделал что добавил. Опять-же уникальная строка которая сообщает когда модуль готов отправлять SMS.
Alechek
Цитата(ArtemKAD @ Jan 20 2016, 15:56) *
>>Чем больше перечень, тем больше памяти нужно.
Пол сотни образцов для всех ответов или URC включая GPRS не займут много памяти.

Ну да, (10 байт стоки+ 12-16 байт что это такое и как с ним боротся)*50 = 1кб - таблица только. Действительно, фигня.... Особенно для ардуинщика с мегой 16

Цитата(ArtemKAD @ Jan 20 2016, 15:56) *
Зачем искать "SIMCOM_Ltdrn"? Эта строка не несет хоть какую либо информацию. Тип производителя модема с которым работает программа и так известен.

Я не про это. При включении модуля запрашиваем тип модема. Ждем строку. Прилетает вполне такая строка "Call Ready". Мы таких модемов не знаем, ахтунг!

Цитата(ArtemKAD @ Jan 20 2016, 15:56) *
>>Мало того, в 800й серии добавилось еще и "SMS Ready".
И правильно сделал что добавил. Опять-же уникальная строка которая сообщает когда модуль готов отправлять SMS.

Опять типичный подход для ардуинщика. Сделать обработку +CME 314 /SIM BUSY/ не судьба. Надо ждать манну с неба сообщение.
CADiLO
>>> При включении модуля запрашиваем тип модема. Ждем строку. Прилетает вполне такая строка "Call Ready".

Ну и кто вам доктор? Зачем общаться с модулем до того как он готов?
Запросите тип модема после прилета всех строк инициализации.
Еще в FAQ по 300й серии было написано - дождаться готовности модуля, иначе команда может быть проигнорирована.
Одни друзья пытались скорость до готовности устанавливать, а потом удивлялись что модем слетал в автободинг.
Alechek
Цитата(CADiLO @ Jan 20 2016, 17:33) *
>>> При включении модуля запрашиваем тип модема. Ждем строку. Прилетает вполне такая строка "Call Ready".
Ну и кто вам доктор? Зачем общаться с модулем до того как он готов?
Запросите тип модема после прилета всех строк инициализации.

Ответ "OK" является готовностью модуля?

Так уж вышло, что наше изделие пережило в себе всю последовательность SIM300D-SIM900D-SIM900-SIM900R-SIM900DS, теперь будет пережовывать и SIM800C-DS.
И на весь этот табор одна прошивка. И в ней надо определять тип модема, чтобы потом плясать под него. Как минимум, с аудиотрактом.
Выпустит квиктел или еще кто вперед симкома нормальный 2хсимочный модем 3Г, будет стоять и он. И поддерждиваться в той же самой единой прошивке.

Поэтому завязываться на специфичные фишки вообще не хочется. Есть стандарт, иногда его даже читают. Те, кто не читает, пишет свое, потом доказывает, что он сделал правильно/лучше/. Вместо поддержки CME/CMS изобретают свой велосипед и доказывают, что у них колеса круглее.
CADiLO
Вам виднее как решать задачу. И кстати "OK" не является готовностью.
Для 800 серии готовность наступает после этих двух сообщений.

Call Ready - Module is powered on and phonebook initialization procedure is over.
SMS Ready - Module is powered on and SMS initialization procedure is over


Двухсимочный 3G пока в стадии хотелок, насколько я знаю его ни у кого нет в планах.
А вот 2G решение оказалось прозаичнее - народ посмотрев на SIM800C-DS и обсудив с нами варианты, предпочел ставить по два SIM800C в устройство.
Получаем два полноценных тракта, а не "только на прием", надежнее, паять проще, да и по стоимости почти столько же выходит.
SIM800C объемы хорошие, есть где в цене подвинуться. А SIM800C-DS дешеветь не будет - нет у него популярности из-за "вывернутости" выводов.
koluna
Цитата(Alechek @ Jan 19 2016, 12:33) *
Ну, это уже совсем жесть. Которая никак не соотносится со стандартом GSM 07.07


Так все-таки такое поведение (разрыв строки в любом месте) - баг или нет? sm.gif
ArtemKAD
>>Ну да, (10 байт стоки+ 12-16 байт что это такое и как с ним боротся)*50 = 1кб

"12-16 байт что это такое и как с ним боротся" это я так понимаю два адреса - адрес образца и адрес процедуры вызываемой при появлении образца. 4 байта, а никак не 12-16.
Кроме того, вся эта таблица всё равно в коде так или иначе будет только будет она разбросана по разным местам, что крайне затруднит модификацию кода и почти наверняка займёт еще больше места.

>>Особенно для ардуинщика с мегой 16

Ну не знаю, у меня в 16кБ влезает простой треккер с обработкой еще и GPS-потока. Правда без GPRS...

>>Я не про это. При включении модуля запрашиваем тип модема. Ждем строку. Прилетает вполне такая строка "Call Ready". Мы таких модемов не знаем, ахтунг!

Так на кой тебе ждать строку причем конкретную строку? Лови ответ с "SIMCOM_Ltd\r\n" аналогично как любое асинхронное сообщение. Тогда тебе абсолютно все равно будет что у тебя там пришло в ответе первым "Call Ready\r\n" или "SIMCOM_Ltd\r\n" или вообще SMS привалила. Не говоря уже о вопросе зачем запрашивать тип модема если ответ заранее известен.

>>Сделать обработку +CME 314 /SIM BUSY/ не судьба. Надо ждать манну с неба сообщение.


Так "+CME 314 /SIM BUSY/" это так-же "манна с неба сообщение". Само собой +СМЕ обработчик нужен по-любому(хотя можно и ждать +CMGS: или её отсутствие по таймеру), вот только как по мне ломиться в модем когда он еще не готов принять, это попытка пройтись по граблям не набив себе шишек. Не желаете ловить "SMS Ready" - запусти таймер с момента включения модема.
CADiLO
>>>Так все-таки такое поведение (разрыв строки в любом месте) - баг или нет?

С точки зрения пользователя и написания обработчика - можно считать багом.
Но вот с точки зрения GSM cтека - нормальное явление. Ну не додумали малость когда стек писали.
А на сегодня исправлять это уже никто не станет.
Вероятность такого события конечно мала, но случиться может.
Alechek
Цитата(CADiLO @ Jan 20 2016, 18:34) *
Вам виднее как решать задачу. И кстати "OK" не является готовностью.
Для 800 серии готовность наступает после этих двух сообщений.

Call Ready - Module is powered on and phonebook initialization procedure is over.
SMS Ready - Module is powered on and SMS initialization procedure is over

Вот я тоже думаю, для кого эта команда:
Цитата
8.1 Phone activity status +CPAS
Defined values
<pas>:
0 ready (ME allows commands from TA/TE)
1 unavailable (ME does not allow commands from TA/TE)
2 unknown (ME is not guaranteed to respond to instructions)


А еще
+CME ERROR: 14 /SIM busy/ для +CPBR
и
+CMS ERROR: 314 /SIM busy/ для +CMGL

Цитата( @ Jan 20 2016, 18:34) *
А вот 2G решение оказалось прозаичнее - народ посмотрев на SIM800C-DS и обсудив с нами варианты, предпочел ставить по два SIM800C в устройство.

Возьму на заметку.

Цитата(CADiLO @ Jan 20 2016, 18:44) *
>>>Так все-таки такое поведение (разрыв строки в любом месте) - баг или нет?
С точки зрения пользователя и написания обработчика - можно считать багом.
Но вот с точки зрения GSM cтека - нормальное явление. Ну не додумали малость когда стек писали.

Писатели стека тоже значит проигнорили GSM 07.07 и V.25ter:
Нажмите для просмотра прикрепленного файла
Все промежуточные ответы показаны с "+" /Все промужуточные и асинхронные без "+" - наследие V.25ter./.
Разрыва в промежуточных сообщениях нет.
Все команды заканчиваются "final result code".



Да, в тексте нигде требования нет. Но и не все поизводители микроволновок пишут, что в них нельзя сушить кота.
CADiLO
Вы ошибаетесь - CPAS это состояние соединения, а не модуля.

<pas>
0 Ready (MT allows commands from TA/TE)
2 Unknown (MT is not guaranteed to respond to tructions)
3 Ringing (MT is ready for commands from TA/TE, but the ringer is active)
4 Call in progress (MT is ready for commands from TA/TE, a call is in progress)

Кстати рудимент оставшийся от мобилок.
Для модулей вместо CPAS давно уже используют более информативную CLCC
Alechek
Цитата(ArtemKAD @ Jan 20 2016, 18:36) *
>>Ну да, (10 байт стоки+ 12-16 байт что это такое и как с ним боротся)*50 = 1кб
"12-16 байт что это такое и как с ним боротся" это я так понимаю два адреса - адрес образца и адрес процедуры вызываемой при появлении образца. 4 байта, а никак не 12-16.
Кроме того, вся эта таблица всё равно в коде так или иначе будет только будет она разбросана по разным местам, что крайне затруднит модификацию кода и почти наверняка займёт еще больше места.

Вот когда разбросана по разным местам - тут вообще труба. В одном месте надо таблицу делать, чтобы не запутаться.

PS Без всяких таблиц с простейшей поддержкой SMS-GPRS один из наших трекеров на ARM скушал
40 008 bytes of readonly code memory
704 bytes of readonly data memory
13 112 bytes of readwrite data memory (+ 619 absolute)

из них на модемную часть ушло 4.5 кб флеша и 600 байт на PDU.

PS:
На затравку: чем отличается +GREG URC и промежуточный ответ и как эту смесь обрабатывать, когда от запроса до получения OK приходят обе. /эт по поводу таблиц/



Цитата(CADiLO @ Jan 20 2016, 19:09) *
Вы ошибаетесь - CPAS это состояние соединения, а не модуля.

Кстати рудимент оставшийся от мобилок.
Для модулей вместо CPAS давно уже используют более информативную CLCC

Может и рудимент, а может и нет.

0 ready (ME allows commands from TA/TE)
1 unavailable (ME does not allow commands from TA/TE)

ME Mobile Equipment, e.g. a GSM phone (equal to MS; Mobile Station)
TA Terminal Adaptor, e.g. a GSM data card (equal to DCE; Data Circuit terminating Equipment)
TE Terminal Equipment, e.g. a computer (equal to DTE; Data Terminal Equipment)

В нашем случае ME - это модуль, совмещенный с TA. И он либо готов принимать команды, либо не готов.

По крайней мере, команды +CG* дают информацию именно по ME:
5.2 Request model identification +CGMM
Execution command causes the TA to return one or more lines of information text <model>, determined by the ME
manufacturer, which is intended to permit the user of the TA to identify the specific model of the ME to which it is
connected to.

Таким образом, при +CPAS: 0 я со спокойной совестью могу чихать на всякие "RDY" и работать с ME через TA хотя бы в плане идентификации оборудования.
А доступность TA можно проверить по AT->OK
CADiLO
Можно конечно и начихать, но если бы все было так просто никто бы эти сообщения не выводил.
sm.gif

Alechek
Цитата(CADiLO @ Jan 20 2016, 19:32) *
Можно конечно и начихать, но если бы все было так просто никто бы эти сообщения не выводил.
sm.gif

Ага, возвращаемся к истокам: кто-то стандарты читает, а кто-то изобретает велосипед. wink.gif
Я просто констатирую факты. Без обид.
CADiLO
Дык какие обиды если в том же 07.07 две трети носит рекомендательное, а не обязательное исполнение.
И если там написано "рекомендовано", то я предпочту пользоваться документацией именно производителя железки,
так как там будет реализованая трактовка, а не предусматриваемая. А при сомнениях еще и запрошу - что именно имелось в виду.
ArtemKAD
Цитата(Alechek @ Jan 20 2016, 16:27) *
PS Без всяких таблиц с простейшей поддержкой SMS-GPRS один из наших трекеров на ARM скушал
40 008 bytes of readonly code memory
704 bytes of readonly data memory
13 112 bytes of readwrite data memory (+ 619 absolute)

из них на модемную часть ушло 4.5 кб флеша и 600 байт на PDU.

40кБ кода для треккера? Он что, еще и танцевать умеет? Добавка GPRS это 3-4кБ от силы.

Цитата(Alechek @ Jan 20 2016, 16:27) *
PS:
На затравку: чем отличается +GREG URC и промежуточный ответ и как эту смесь обрабатывать, когда от запроса до получения OK приходят обе. /эт по поводу таблиц/

Ну так на кой использовать и то и то одновременно? Кто тебе от этого злобный Буратина?
Baser
Цитата(Alechek @ Jan 20 2016, 14:56) *
Так уж вышло, что наше изделие пережило в себе всю последовательность SIM300D-SIM900D-SIM900-SIM900R-SIM900DS, теперь будет пережовывать и SIM800C-DS.
И на весь этот табор одна прошивка. И в ней надо определять тип модема, чтобы потом плясать под него.

То, что у вас заложена поддержка всех выпускавшихся ранее плат, это конечно удобно, но только до определенной степени.
Если модели по функционалу различаются, после какого-то процента различий удобней разделять проекты.
Я тоже поддерживаю десяток похожих модификаций приборов, с унификацией 40-70% (навскидку).
Сначала пытался строить общие файлы проектов, изголяться с условной трансляцией, чтобы оставить один проект на все модификации,
а потом плюнул - проблем больше, чем преимуществ. Допускаешь одну ошибку - и все н-дцать приборов с глюком.
Сейчас один прибор - один проект с парой мелких модификаций.

А по поводу вашего спора о сложности разбора ответов модема, все похоже на тот анекдот, когда говорят:
"Ну, да, ужас! Но никак не УЖАС!!! УЖАС!!!" biggrin.gif
Проблемы, конечно, есть, но они обходятся.

Цитата(koluna @ Jan 20 2016, 15:35) *
Так все-таки такое поведение (разрыв строки в любом месте) - баг или нет? sm.gif

Цитата(CADiLO @ Jan 20 2016, 15:44) *
С точки зрения пользователя и написания обработчика - можно считать багом.
Но вот с точки зрения GSM cтека - нормальное явление. Ну не додумали малость когда стек писали.
А на сегодня исправлять это уже никто не станет.

На мой взгляд это баг, и баг серьезный.
Это баг на уровне операционки в части организации доступа к разделяемому ресурсу типа последовательного порта.
Или, что более вероятно, не на уровне самой РТОС, а на уровне её применения в стеке.
Это один из важнейших сервисов любой РТОС и баги в нем недопустимы.

И если такой баг бы был, его бы давно уже по тихому пофиксили с короткой строчкой в Релиз Нотес:
"Минор баг фиксет ин модем ансверс" biggrin.gif
Alechek
Цитата(CADiLO @ Jan 20 2016, 19:49) *
.. то я предпочту пользоваться документацией именно производителя железки,
так как там будет реализованая трактовка, а не предусматриваемая. А при сомнениях еще и запрошу - что именно имелось в виду.

К сожалению так оно и есть. И все эти стандарты по сути 100% рекомендательные для поизводителей. Просто по факту получается, что нечаянно документация от производителя в какой-то части соответствует стандарту /потому-что кто-то все таки что-то припомнил/лень было свое изобретать/

А потом нечаянно оказыватся что симки несовсметимы с модулями, модули несовместимы с базовыми станциями и т.п. А во всем виноват стек GSM, потому что он лицензионный и туда никто лезть не имеет права. Это я так, утрирую.


Цитата(ArtemKAD @ Jan 20 2016, 19:55) *
40кБ кода для треккера? Он что, еще и танцевать умеет? Добавка GPRS это 3-4кБ от силы.

Ну, есть у нас и со 150 кб кода прошивка. Танцевать не умеет, но многое может.

Про GSM-GPRS прибавку я ж написал, что в простом варианте 4.5 кб+0.5 PDU. В серьезных и за 20 кБ зашкаливает.
Alechek
Цитата(CADiLO @ Jan 20 2016, 19:32) *
Можно конечно и начихать, но если бы все было так просто никто бы эти сообщения не выводил.
sm.gif

Бесполезны они. SIM800H:

+CME ERROR: 793 в ответ на AT+CBST=7,0,1

приходит уже после Call Ready и SMS ready:

CODE
15:18:59.334> 9¢<0><0><0><0><0><0>AT
15:18:59.334>
15:18:59.334>
15:18:59.334> OK
15:18:59.334>
15:18:59.772>
15:18:59.772>
15:18:59.772> RDY
15:18:59.772>
15:18:59.772>
15:18:59.772>
15:18:59.772> +CFUN: 1
15:18:59.772>
15:19:00.584>
15:19:00.584>
15:19:00.584> +CPIN: READY
15:19:00.584>
15:19:01.397> ATE0
15:19:01.397>
15:19:01.397>
15:19:01.397> OK
15:19:01.397>
15:19:01.709>
15:19:01.709>
15:19:01.709> Revision:1308B05SIM800H32_BT
15:19:01.709>
15:19:01.709>
15:19:01.709>
15:19:01.709> OK
15:19:01.709>
15:19:01.928>
15:19:01.928>
15:19:01.928> +CSMINS: 0,1
15:19:01.928>
15:19:01.928>
15:19:01.928>
15:19:01.928> OK
15:19:01.928>
15:19:02.209>
15:19:02.209>
15:19:02.209> +CPIN: READY
15:19:02.209>
15:19:02.209>
15:19:02.209>
15:19:02.209> OK
15:19:02.209>
15:19:02.475>
15:19:02.475> 897010221042981810ff
15:19:02.475>
15:19:02.475>
15:19:02.475>
15:19:02.475> OK
15:19:02.475>
15:19:02.569>
15:19:02.725>
15:19:02.725>
15:19:02.725> 250022104298181
15:19:02.725>
15:19:02.725>
15:19:02.725>
15:19:02.725> OK
15:19:02.725>
15:19:03.288>
15:19:03.350>
15:19:03.350> Call Ready
15:19:03.350>
15:19:03.538>
15:19:03.538>
15:19:03.538> OK
15:19:03.538>
15:19:03.788>
15:19:03.788>
15:19:03.788> OK
15:19:03.788>
15:19:03.913>
15:19:03.913>
15:19:03.913> SMS Ready
15:19:03.913>
15:19:03.975>
15:19:03.975>
15:19:03.975> +CME ERROR: 793
15:19:03.975>
15:19:04.225>
15:19:04.225>
15:19:04.225> +CME ERROR: 793
15:19:04.225>
15:19:04.475>
15:19:04.538>
15:19:04.538> +CME ERROR: 793
15:19:04.538>
15:19:04.725>
15:19:04.725>
15:19:04.725> +CME ERROR: 793
15:19:04.725>
15:19:05.038>
15:19:05.038>
15:19:05.038> +CME ERROR: 793
15:19:05.038>
15:19:05.288>
15:19:05.288>
15:19:05.288> +CME ERROR: 793
15:19:05.288>
15:19:05.538>
15:19:05.538>
15:19:05.538> OK


После нескольких неудачных попыток все таки приходит ОК. Параметры команды соответствуют документации на модем.
Ждать еще манны небесной какое сообщение готовности модуля?



И Ой! В SIM800 исправили наконец-то команду +CMSS - не надо теперь в конце "," посылать!
Правда, совместимость не оставили - если SIM300D переваривали команду с запятой в конце, то SIM800 ругается на нее +CMS ERROR: 325 /invalid input value/ cranky.gif
Baser
Цитата(Alechek @ Jan 21 2016, 12:57) *
Ждать еще манны небесной какое сообщение готовности модуля?

Чего то мне кажется, что вы слишком много хотите от модуля. Зачем его мучить командами до его готовности.
Зачем "AT" еще до прихода RDY, когда работа СОМ порта еще не гарантируется.
Ну и наверно, многие ваши команды еще не работают до Call Ready (команд не видно, так что ничего подробнее сказать не могу)
Alechek
Вообще, COM порт (TA по терминологии GSM 07.07) доступен (с ним можно работать) с момента появления STATUS на ножке. Это соблюдается неукоснительно.
Работу TA проверяем по ответу на "AT". Тут кому как - хочет ждет RDY (а его не будет, если у нас скорость порта не фикирована), хочет долбится периодически.
Call ready нам по барабану - с телефонной книгой не работаем. SMS ready раньше не было - и ничего, жили.
Aх да, PAS не проверил. Ну так тут было сказано, что это пережиток, и достаточно Call + SMS ready.

Я же хочу сказать, что верить этому нельзя, как не стоило верить в чудный Reset.
И симкому лучше дружить с существующими стандартами и логикой, чем выдумывать свое.
Alechek
Да, как оказалось, с +CPAS вариант не китайский,

CODE
19:47:10.459> AT+CREG?;+CGREG?;+CPAS
19:47:10.459>
19:47:10.459> +CREG: 0,3
19:47:10.459>
19:47:10.459> +CGREG: 0,3
19:47:10.459>
19:47:10.459> +CPAS: 2
19:47:10.459>
19:47:10.459> OK
19:47:13.834> AT+CREG?;+CGREG?;+CPAS
19:47:13.834>
19:47:13.834> +CREG: 0,2
19:47:13.834>
19:47:13.834> +CGREG: 0,2
19:47:13.834>
19:47:13.834> +CPAS: 2
19:47:13.834>
19:47:13.834> OK
19:47:17.209> AT+CREG?;+CGREG?;+CPAS
19:47:17.209>
19:47:17.209> +CREG: 0,0
19:47:17.209>
19:47:17.209> +CGREG: 0,0
19:47:17.209>
19:47:17.209> +CPAS: 2
19:47:17.209>
19:47:17.209> OK

И в 0 оно скидивается только когда есть регистрация в сети.

Кто бы сказал, чего ждать?
Код
20:02:17.163> AT
20:02:17.163>
20:02:17.163> OK
20:02:17.538>
20:02:17.600> RDY
20:02:17.600>
20:02:17.600> +CFUN: 1
20:02:18.350>
20:02:18.350> +CPIN: READY
20:02:21.163>
20:02:21.163> Call Ready
20:02:21.725>
20:02:21.725> SMS Ready
20:02:24.225> AT+CREG?;+CGREG?;+CPAS
20:02:24.225>
20:02:24.225> +CREG: 0,3
20:02:24.225>
20:02:24.225> +CGREG: 0,3
20:02:24.225>
20:02:24.225> +CPAS: 2
20:02:24.225>
20:02:24.225> OK
20:02:24.413> AT+CBST=?;+CBST=7,0,1
20:02:24.413>
20:02:24.413> +CBST: (0,4-7,12,14,68,70-71,75),(0,4),(0-3)
20:02:24.413>
20:02:24.413> ERROR
--
10:47:47.146> AT+CREG?;+CGREG?;+CPAS
10:47:47.146>
10:47:47.146> +CREG: 0,2
10:47:48.083>
10:47:48.083> Call Ready
10:47:48.083>
10:47:48.083> +CGREG: 0,2
10:47:48.083>
10:47:48.083> +CPAS: 2
10:47:48.083>
10:47:48.083> OK
10:47:48.240> AT+CBST?;+CBST=7,0,1
10:47:48.240>
10:47:48.240> +CBST: 7,0,1
10:47:48.240>
10:47:48.240> ERROR


Команда возможна, параметры допустимы, значение считать можно, но установить - ERROR. Или где-то написано, что она операторозависима и возможно ее выполнить только если есть регистрация в сети?
Попутно вопрос, а что, ее каждый раз надо делать после регистрации? В новой сети все по-новому?
Alechek
.
Alechek
Еще приколы SIMCOM

Вот пойми его, PIN готов? или не готов? или вобще я/модуль/ с ума сошел?
Цитата
20:54:34.027> Revision:1308B05SIM800H32_BT
20:54:34.027>
20:54:34.027> OK
20:54:34.277> AT+CSMINS?
20:54:34.277>
20:54:34.277> +CSMINS: 0,1
20:54:34.277>
20:54:34.277> OK
......
20:54:35.340> AT+CPIN?
20:54:35.340>
20:54:35.340> ERROR
20:54:35.418>
20:54:35.418> +CPIN: READY
20:54:35.418>
20:54:35.418> +CPIN: NOT READY
20:54:35.590> AT+CPIN?
20:54:35.590>
20:54:35.590> ERROR
....


Или

6.2.38 AT+CCALR Call Ready Query

Цитата
21:04:40.355> AT+CCALR?
21:04:40.355>
21:04:40.355> +CCALR: 0
21:04:40.355>
21:04:40.355> OK
21:04:40.605>
21:04:40.605> Call Ready
21:04:40.855> AT+CCALR?
21:04:40.855>
21:04:40.855> +CCALR: 0
21:04:40.855>
21:04:40.855> OK
21:04:41.355> AT+CCALR?
21:04:41.355>
21:04:41.355> +CCALR: 0
21:04:41.355>
21:04:41.355> OK
21:04:41.918> AT+CCALR?
21:04:41.918>
21:04:41.918> +CCALR: 0
21:04:41.918>
21:04:41.918> OK
21:04:42.293>
21:04:42.293> SMS Ready
21:04:42.418> AT+CCALR?
21:04:42.418>
21:04:42.418> +CCALR: 0
21:04:42.418>
21:04:42.418> OK

Так Ready или нет?

Ввод PIN-кода
Код
1:13:56.621> AT+CSMINS?
21:13:56.621>
21:13:56.621> +CSMINS: 0,1
21:13:56.621>
21:13:56.621> OK
21:13:56.871> AT+CPIN?
21:13:56.871>
21:13:56.871> +CPIN: SIM PIN
21:13:56.871>
21:13:56.871> OK
21:13:57.183> AT+CPIN=7324
21:13:57.308>
21:13:57.308> [b]ERROR[/b]


Смотрим в мануал:
Цитата
Response
TA stores a password which is necessary before it can be operated (SIM
PIN, SIM PUK, PH-SIM PIN, etc.).
If the PIN required is SIM PUK or SIM PUK2, the second pin is required.
This second pin, <new pin>, is used to replace the old pin in the SIM.
OK
If error is related to ME functionality:
+CME ERROR: <err>


Так почему же ERROR, команда то выполнилась?!
Где же заветный "+CME ERROR: 16", который по стандарту и который всегда был?

ERROR означает, что команда не выполнилась. Таким образом, если она все-таки верна, ее следует повторить.
А тут шустро повторили 3 раза - и все, монтажник, ищи PUK...
Baser
Цитата(Alechek @ Feb 9 2016, 18:30) *
Вот пойми его, PIN готов? или не готов? или вобще я/модуль/ с ума сошел?

У меня два варианта: или отваливается SIM карта и модуль переключается туда-сюда,
или модуль просто сам по себе глючит sm.gif

Цитата
Где же заветный "+CME ERROR: 16", который по стандарту и который всегда был?

У вас AT+CMEE включено?
А то по-умолчанию +CMEE: 0
и всегда выдается просто ERROR


Вообще первый пример взможен при отваливании симки,
второй пример с AT+CCALR прикольная лажа,
а в третьем примере ничего необычного не вижу.
smalcom
Цитата
PIN готов? или не готов? или вобще я/модуль/ с ума сошел?

проверьте трассировку http://electronix.ru/forum/index.php?showtopic=131098

Цитата
6.2.38 AT+CCALR Call Ready Query

на ваше усмотрение)) тов CADiLO говорил, что логика у этих модемов такова: пока не пришёл CallReady - ничего не обещаем.

Цитата
3

если CMEE > 0, но приходит ERROR, то ошибка может быть в синтаксисе команды: попробуйте заключить в кавычки пин-код.
Alechek
Цитата(Baser @ Feb 9 2016, 22:11) *
У меня два варианта: или отваливается SIM карта и модуль переключается туда-сюда,
или модуль просто сам по себе глючит sm.gif

С целью проверить устойчивость готового изделия, начал туда втыкать все симки, что нашел у себя на столе. В том числе и нерабочие /убитые более ранними изделиями/.
Вот от такой нерабочей модуль и сошел с ума.
Пускай меня закидают камнями, со словами "нечего подсовывать модулю нечто не работающее по стандарту", я же лишь констатирую, что обработка ошибок в модуле реализована, мягко говоря, плохо.

Цитата(Baser @ Feb 9 2016, 22:11) *
У вас AT+CMEE включено?
А то по-умолчанию +CMEE: 0
и всегда выдается просто ERROR

Спасибо, Вы правы!
СМЕЕ устанавливался, но позже. Видать 300 и 900 серии либо сохраняли настройку без ведома пользователя, либо CMEE=1 по-умолчанию.

Кстати, по первому примеру, после включения CMEE=1
Код
10:42:09.012> AT+CSMINS?
10:42:09.012>
10:42:09.012> +CSMINS: 0,1
10:42:09.012>
10:42:09.012> OK
10:42:09.262> AT+CPIN?
10:42:09.262>
10:42:09.324> +CME ERROR: 14
10:42:09.574>
10:42:09.574> +CPIN: READY
10:42:09.574>
10:42:09.574> +CPIN: NOT READY
ArtemKAD
Цитата(Alechek @ Feb 10 2016, 07:40) *
С целью проверить устойчивость готового изделия, начал туда втыкать все симки, что нашел у себя на столе. В том числе и нерабочие /убитые более ранними изделиями/.
Вот от такой нерабочей модуль и сошел с ума.


А если вставить её в телефон, то вполне может быть и рабочей. Таки есть большая вероятность что проблема не с картой, а с разводкой(масса карты подключена к общему полигону) или схемой её подключения...
Alechek
Цитата(ArtemKAD @ Feb 10 2016, 15:20) *
А если вставить её в телефон, то вполне может быть и рабочей. Таки есть большая вероятность что проблема не с картой, а с разводкой(масса карты подключена к общему полигону) или схемой её подключения...

Как грится, не первый раз замужем. rolleyes.gif Оставим это для начинающих...
C ней и motorola C350 с ума сходит. У нее файловая система нарушилась - некоторые блоки не читаются. Проверено Кардиналом через сим-считыватель.
jcxz
Цитата(Baser @ Jan 20 2016, 21:02) *
И если такой баг бы был, его бы давно уже по тихому пофиксили с короткой строчкой в Релиз Нотес:
"Минор баг фиксет ин модем ансверс" biggrin.gif

Тем не менее такие баги есть и производитель фиксить их не собирается. Его ответ:
"Работ по исправлению этой проблемы в нашей дорожной карте нет. Данное ПО писалось сторонней командой по субподряду, мы с ней больше не работаем. Применяйте наши новые модули - там этой проблемы нет".
CADiLO
В 900-й серии уже ничего меняться не будет. В марте EOL SIM900R, а там и остальные модули подтянутся.

Велкам то SIM800x - претензии принимаются дистрибьюторами.
Alechek
Цитата(CADiLO @ Feb 11 2016, 12:33) *
Велкам то SIM800x - претензии принимаются дистрибьюторами.

Вопрос лишь в том, что будет считаться ошибкой, а что "особенностью".
CADiLO
А вот это мы у производителя и выясним sm.gif

У меня уже список из полдесятка пунктов лежит к ихнему выходу с праздников.
Так что будем пинать для получения в марте причесанной прошивки для 800С.
А там и 800F подтянется. И еще кое-что.....
Alechek
Нечаянно выяснилось, что на SIM900 AT+CIPSEND=NNN весьма неатомарна
Код
19:23:30.275> AT+CIPSEND=5
19:23:30.275>
19:23:46.213> >
19:23:46.213> +IPD,8:ANSWER
19:24:10.775> 12345
19:24:10.775> SEND OK

Мало того, с момента прихода данных и до момента отправки устанавливается DCD!

Версия прошивки
Код
19:28:25.306> AT+CGMR
19:28:25.306> Revision:1137B09SIM900M64_ST
19:28:25.306> OK


Есть стойкое подозрение, что SIM900C-DS в такой ситуации линию DCD не восстанавливает, она и далее остается в 1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.