реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Атомарность выполнения AT-команды
koluna
сообщение Jan 18 2016, 18:33
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Всем привет!

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

Код
AT+XXX ...

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

+XXX ...
OK | ERROR ...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
CADiLO
сообщение Jan 19 2016, 05:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 6 023
Регистрация: 26-08-05
Из: Днепр
Пользователь №: 7 988



Может. Задекларировано в самой логике работы сотовой связи.
Любое событие - асинхронно.


--------------------
Не можна втрачати надію. Не можна здаватися до останньої миті. Можливо саме вона, остання мить, принесе весну, яка стане початком нового життя.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 19 2016, 06:47
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



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

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

Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 19 2016, 08:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Вы не поверите, но URC может прийти даже во время приёма ответа, внутри него. Или между ним и "\r\n"; или между '\r' и '\n'.
Т.е. например: ERR<URC...>OR
Даже такое бывает.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 19 2016, 08:33
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(jcxz @ Jan 19 2016, 13:20) *
Т.е. например: ERR<URC...>OR

Ну, это уже совсем жесть. Которая никак не соотносится со стандартом GSM 07.07
Go to the top of the page
 
+Quote Post
CADiLO
сообщение Jan 19 2016, 08:42
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 6 023
Регистрация: 26-08-05
Из: Днепр
Пользователь №: 7 988



Абсолютно соотносится, так как нет никакого ограничения в стандарте на это.


--------------------
Не можна втрачати надію. Не можна здаватися до останньої миті. Можливо саме вона, остання мить, принесе весну, яка стане початком нового життя.
Go to the top of the page
 
+Quote Post
butthead2
сообщение Jan 19 2016, 08:55
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 22-07-09
Пользователь №: 51 470



Может прийти в любом месте. Скажу даже больше, в ранних прошивках SIM300C был косяк - URC приходили прямо внутри других строк cranky.gif Такого больше никогда не попадалось, так что по факту надо рассчитывать на приход целых строк но в любом порядке
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 19 2016, 10:14
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Это конечно косяк, но это печальная реальность - сталкивался с таким в Bluegiga WT-12.
К сожалению - таков уровень их программистов написавших её прошивку.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 19 2016, 11:42
Сообщение #9


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(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 ) просто периодически проверяется состояние конекта, и если что не так, запускаются процедуры восстановления.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 19 2016, 12:53
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(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" и злимся на модем, что "незванный гость хуже татарина.."
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 19 2016, 14:38
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Имхо - неправильный алгоритм. Я классифицирую по-другому.
Сообщения от модуля к клиенту (не важно GSM или какой другой общающийся через UART посредством команд от клиента) можно разделить на:
а) синхронные - реакция модуля на переданные ему команды клиентом (т.е. - это ответы на команды, в том числе и многострочные);
б) асинхронные - уведомления о некоторых событиях внутри модуля, напрямую несвязанных с переданными ему командами, происходящими асинхронно относительно основного командного обмена.
Любая передача как от клиента к модулю, так и наоборот, делится на кадры (строки). Кадр - это последовательность допустимых символов, ограниченная символами "\r\n" (или одним из них).
После передачи модулю команды клиентом, клиент переходит в состояние ожидания синхронных ответов на команды (могут быть многострочные) и ждёт ответов разбирая входящий поток кадров.
Ожидание заканчивается по получению ответа (или цепочки ответов если команда может генерить цепочку ответных кадров), либо по истечении таймаута ожидания.
Таким образом - URC может вклиниваться в любой момент между командой и первым кадром ответа или между двумя кадрами ответа. лавное - чтобы он не нарушал целостность кадров (строк).
Сам URC тоже должен иметь такой-же формат кадра (строка).
Когда URC влезает внутрь другой строки, нарушая её - это конечно баг, тут уже ничего нельзя сделать.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 19 2016, 15:16
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



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

+1

Добавлю только что "правильные команды" заканчивают свой вывод "OK", а промежуточные ответы формируют с "+" вначале. Таких большинство.
А вот отличить симкомовкий Call Ready от промужуточного ответа (к примеру, на +GMI (SIMCOM_Ltd) проблематично.
Как бы уважаемый Cadilo не защищал производителй модемов, палки в колеса они вставляют..
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Jan 19 2016, 15:34
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



>>А вот отличить симкомовкий Call Ready от промужуточного ответа (к примеру, на +GMI (SIMCOM_Ltd) проблематично.

И в чем проблема? Сложно найти "CALL READY\r\n" ?
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 19 2016, 17:42
Сообщение #14


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



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

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


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

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

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

А по перемешиванию ответов модема, точно читал в каком-то описании, что что-то, где-то ну точно не должно перемешиваться.
Только деталей совершенно не помню... 08.gif
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 20 2016, 06:53
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(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/.../).
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016