|
SIM900. Прием команд от TCP сервера., Как исключить коллизии в порту при приеме внешних команд? |
|
|
|
Apr 22 2014, 16:50
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340

|
Здравствуйте!
Разрабатываю устройство, которое собирает различные данные с датчиков и с периодичностью в одну минуту отправляет их на сервер посредством SIM900. Использую обычный режим AT-команд, не transparent, то есть команда AT+CIPSEND, приходит приглашение ">", отсылаю в порт строку, дожидаюсь SEND OK, всё. В данный момент добился надежной отсылки данных. Встал вопрос приёма команд от сервера. Все в общем, работает, за исключением случая, когда микроконтроллер ждет ответа от SIM900 и в этот момент приходит команда от сервера. Аппаратное управление потоком в этом случае вряд ли подойдет.. Подскажите, пожалуйста, кто как справился с этой проблемой?
|
|
|
|
|
Apr 23 2014, 03:57
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340

|
Цитата(zebrox @ Apr 23 2014, 05:40)  Так понимаю, что процессор ожидает ответ от сима на какую-либо АТ команду?
Думаю у команды с сервера должен быть заголовок, по которому ее можно отличить от ответа сима. Выполнить ее, и дальше ждать ответа на АТ? Ну да, это понятно. У команды действительно есть заголовок, и, кроме этого, по этому признаку я помещаю эти команды в другой буфер для дальнейшего парсинга. Видите ли, у меня конец сообщения от SIM900 определяется по таймауту. То есть, после приема последнего символа ответа, таймер отсчитывает 2мс и поднимается флаг, что ответ готов. Если команда приходит во время ответа, когда SIM900 что-то кидает в порт, или во время этой задержки, то целостность ответа нарушается и, соответственно, парсер ответов не может распознать его. Вот в чем проблема.
|
|
|
|
|
Apr 23 2014, 05:57
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340

|
Цитата(tdocs.su @ Apr 23 2014, 13:15)  Автомат конечный писать надо. Были проблемы когда-то давно с коммуникационной программой для двух модемов, только конечный автомат и позволил добиться устойчивой работы. Его ничем из "седла" не вышибить. Так у меня вся работа с модемом на конечных автоматах. Иначе с ним вообще невозможно работать. В общем, решил проблему "заплатками". Если команда от сервера приходит в неподходящий момент и возникает коллизия с ответом от модема, по таймауту ожидание ответа прекращается и программа выпадает в "диспетчер задач". И если команда не распозналась, сервер не получает подтверждения принятой команды и отсылает её вновь.
|
|
|
|
|
Apr 23 2014, 06:19
|
Частый гость
 
Группа: Участник
Сообщений: 143
Регистрация: 27-02-14
Из: Москва
Пользователь №: 80 728

|
Как-то странно... Ведь в автомате после отправки чего-либо в линию вы принудительно переводите его в новое состояние, в котором он ожидает конкретный ответ из линии, и никакой другой. Может, что-то не так делаете? См. личку. Не принимает ваш ящик личку. См. здесь - http://tdocs.su/4199
Сообщение отредактировал tdocs.su - Apr 23 2014, 06:22
--------------------
|
|
|
|
|
Apr 23 2014, 06:27
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340

|
Цитата(tdocs.su @ Apr 23 2014, 14:19)  Как-то странно... Ведь в автомате после отправки чего-либо в линию вы принудительно переводите его в новое состояние, в котором он ожидает конкретный ответ из линии, и никакой другой. Может, что-то не так делаете? См. личку. Не принимает ваш ящик личку. См. здесь - http://tdocs.su/4199Спасибо, почитаю. Проблема-то как раз в том, что жду одно, а приходит другое ))
|
|
|
|
|
Apr 23 2014, 06:54
|
Частый гость
 
Группа: Участник
Сообщений: 143
Регистрация: 27-02-14
Из: Москва
Пользователь №: 80 728

|
Цитата(Иван Плетнев @ Apr 23 2014, 10:27)  Спасибо, почитаю.
Проблема-то как раз в том, что жду одно, а приходит другое )) Так вот автомат на другое и реагировать не должен вовсе. Если после перехода в case сразу задать ему новое состояние, он в нем и будет находиться и ждать только то, что надо, все прочее просто игнорировать.
--------------------
|
|
|
|
|
Apr 23 2014, 09:50
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340

|
Все-таки не получается у меня в стандартном, командном режиме принимать сообщения от сервера без грабель. Буду пробовать transparent mode.
|
|
|
|
|
Apr 23 2014, 13:08
|
Частый гость
 
Группа: Участник
Сообщений: 143
Регистрация: 27-02-14
Из: Москва
Пользователь №: 80 728

|
Цитата(Иван Плетнев @ Apr 23 2014, 13:50)  Все-таки не получается у меня в стандартном, командном режиме принимать сообщения от сервера без грабель. Буду пробовать transparent mode. С утра я чё-та не догнал. А сейчас вспомнил детали той своей давней задачки. Обрисую. Было 2 компика с зухелом на каждом из них (через COM-порты) и поганейшая линия связи, чуть ли не АТС с шаговым искателем  В исходном положении модемы были инициализированы и выведены на режим лежачей трубы (командный режим). При вызове одного другим они "договаривались" друг с другом и из командного режима переходили в режим обмена данными. И тоже возникало что-то такое, когда один еще был в режиме обмена, а другой уже бросал трубу и переходил в командный. Тоже пробовал выводить ведомый модем по тайм-ауту, но все это было нестабильно, а к тому же еще были сложные временные требования - ведущий модем мог вызвать ведомого в любой случайный момент времени (напр. в момент инициализации ведомого или во время его попытки обмена данными). Т.е. тайм-аут работал ненадежно. Тут-то автомат и спас. Кажется, что у вас что-то подобное происходит сейчас. Невывод из командного режима в режим обмена данными. Позже еще приходилось решать задачку автоматом - каждое утро высасывать обновленный прайс-лист одного крупного поставщика компьютерной комплектухи, сравнивать его со своим локальным, обходить "старую", уже имеющуюся у нас комплектуху, а затем еще декодировать и конвертировать HTML-код так, чтобы поставщик не мог предъявить претензий по поводу таких ежедневных утренних краж  Задачка четко решалась автоматом. Короче, что-то у вас именно с переключением режимов. Если ждете данные, а приходит от сервера команда, то так и есть. Все вспомнил
--------------------
|
|
|
|
|
Apr 23 2014, 15:21
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340

|
Цитата(zebrox @ Apr 23 2014, 21:18)  И почему конец сообщения определяется таймаутом? Почему не использовать последовательность CR LF? Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три.
|
|
|
|
|
Apr 25 2014, 05:59
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 13-04-11
Из: Суровый Челябинск
Пользователь №: 64 337

|
Цитата(Иван Плетнев @ Apr 23 2014, 19:21)  Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три. Это как раз не страшно. У меня идет работа с голосом (прием звонка, дозвон), SMS (прием и отправка) и GPRS (клиент) , плюс полный набор обслуживающих команд и всего в сумме получается не более 60 вариантов заголовков команд/ответов. Если делать не побуквенное сравнение, а более оптимизированный парсер, то получается быстрое автоматическое определение что пришло. Но с GPRS, да, в непрозрачном режиме приходится выкручиваться, а в прозрачном нет мультисокетов. Как вариант - реализовать режим мультиплексирования (CMUX). Было бы очень удобно, если бы китайцы добавили аналог +CIPRXGET, но не по незапрашиваемому ответу, а по запросу.
|
|
|
|
|
Apr 25 2014, 08:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Иван Плетнев @ Apr 23 2014, 21:21)  Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три. Самое первое правило - обрабатывать ВСЕ!!! последовательности от модема. Второе - последовательность AT команд четко регламетирована (см GSM 07.07 раздел 4). Заметьте, у всех команд стандарта есть final result code (чего не скажешь творчестве собственных расширений производителей модемов) Все что между - результат выполения команды. И еще есть ансинхронные ответы. Могут влезть куда угодно. либо пропускайте их, либо применяйте. НО РАСПОЗНАТЬ их надо!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|