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

 
 
> Алгоритм общения с GSM/GPRS модулем, Разбор посылаемых модемом строк, время ожидания
Slonofil
сообщение Aug 27 2010, 12:37
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 327
Регистрация: 6-10-09
Из: РФ :: Ленинград
Пользователь №: 52 781



Доброго времени суток, уважаемые!

Сажусь писать программу под PIC18 для общения с SIM300DZ в составе модема GNS-300RS. В общих чертах всё понятно: отсылается строка, принимается и разбирается ответ. С отсылкой строк более-менее просто, например putrsUSART ((const far rom char *)"AT+CSMINS?\r\n"); А вот с разбором строк и временем ожидания ответа от модема (в особенности при работе с GPRS) пока туго... хочется сделать нечто автоматизированное, чтобы был массив или структура с запросом, временем ожидания ответа, типовыми ответами и идентификаторами действий, связанных с теми или иными типами ответов. Мне это видится приблизительно так:

Код
struct GSM_Struct
{
    char Send[XX];
    unsigned int Timeout;
    char Receive[YY];
    unsigned char State[Z];
} GSM[NUMBER_OF_OPERATIONS];


Верно ли я подхожу к решению этой задачи? Может ли кто-нибудь поделиться мыслями на этот счёт? Кто как делает разбор приходящих строк? В особенности при работе с GPRS.

Ещё хотелось бы узнать, какие начальные настройки модема должны производиться при его первом запуске.

Добавлю ещё, что устройство, которое будет работать с модемом, призвано делать много чего ещё помимо общения с интернетом, причём это "много чего ещё" является более приоритетным. Логика работы такова, что даже при зависаниях связи/железа SIM300 (в перспективе SIM900) должны выполняться основные задачи.

Думаю, Ваши ответы очень помогут многим начинающим освоиться с темой. Спасибо всем! С уважением, Максим.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
Dron_Gus
сообщение Aug 27 2010, 12:58
Сообщение #2


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Если нужно делать "много чего" с модемом стоит посмотреть на GSMmux. Получите несколько виртуальных портов. не надо будет делить ресурс.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Slonofil
сообщение Aug 27 2010, 13:01
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 327
Регистрация: 6-10-09
Из: РФ :: Ленинград
Пользователь №: 52 781



Не могли бы Вы пояснить, что такое GSMmux?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Aug 27 2010, 13:05
Сообщение #4


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Мультиплексор нескольких логических каналов (виртуальных последовательных портов) в один физический (железный uart). Позволяет получить несколько "виртуальных" портов. В них можно независимо (в разумных пределах) слать сообщения и получать ответы. Позволяет нескольким задачам общаться с модемом одновременно.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
CADiLO
сообщение Aug 27 2010, 13:07
Сообщение #5


Гуру
******

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



Описано в документе: http://microchip.ua/simcom/GSM-GPRS-GPS/SI...exor%20v1.2.pdf


--------------------
Не можна втрачати надію. Не можна здаватися до останньої миті. Можливо саме вона, остання мить, принесе весну, яка стане початком нового життя.
Go to the top of the page
 
+Quote Post
Slonofil
сообщение Aug 27 2010, 13:11
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 327
Регистрация: 6-10-09
Из: РФ :: Ленинград
Пользователь №: 52 781



Нет, погодите, я не о том, что один модем будет использоваться несколькими приложениями! Я о том, что он не является центром системы. А вообще же вопрос по большей части про программную реализацию общения с модемом...

В конце концов, может, этот вопрос уже всесторонне обсуждался на форуме? Ткните ссылочкой, плиз! К сожалению, нет возможности просмотреть весь форум на предмет искомой темы...

Сообщение отредактировал Slonofil - Aug 27 2010, 13:34
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Aug 27 2010, 14:49
Сообщение #7


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Слишком много нюансов. Я делал на вложенной машине состояний. Т.е. есть глобальные состояния типа "Подключение", "отключение", "перезагрузка", "бездействие". Была очередь команд. В состоянии "бездействие" эта очередь читалась, далее переход в нужное состояние. В каждом состоянии множество подсостояний "Отправка команды", "ожидание ответа", "еще что-то там" и т.д. На эти глобальные состояния таймауты. Все входящие (от модема) сообщения парсятся до основного switch'а, некоторый набор сообщений отсеивается (типа +CREG и тому подобных) тогда можно усыпить драйвер до прихода следующего сообщения или до истечения таймаута. Если неизвестное сообщение, то "спускаемся" в swith (возможно сообщение ожидается в текущем состоянии). Если состояние ожидало сообщение, то Ок, иначе еще один "пост"-парсер. Туда обычно падают сообщения об ошибках и тому подобные редкие сообщения. Как-то так.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Slonofil
сообщение Aug 27 2010, 14:57
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 327
Регистрация: 6-10-09
Из: РФ :: Ленинград
Пользователь №: 52 781



Спасибо! Уже предметно. Я примерно так и думал. А нельзя ли чуть-чуть поподробнее?
Go to the top of the page
 
+Quote Post
av-master
сообщение Aug 27 2010, 15:50
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 857
Регистрация: 14-05-05
Из: Украина
Пользователь №: 4 998



Немного непонятна тема. ИМХО все пишут по разному...
Процы щас очень быстрые и все успевают....
у меня просто по прерывания работает с разным уровнем приоритета.
в ответственных быстрых местах (например декодер DTMF) просто необрабатываю прерывания. с меньшим приоритеом, после освобождения ресурсов все догонит. темболее управление потоком на автомате работает.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Aug 27 2010, 18:46
Сообщение #10


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



А куда подробней? Код, к сожалению показать не могу. Есть еще несколько ньюансов. Типа вложенности состояний. Чтобы после каждой команды модему в каждом "большом" состоянии не ждать ответа "Ок", его можно вынести в отдельное состояние. Для уобства я делал некое подобие стека вызовов. Т.е. из состояния "Бездействие" мы как бы "вызываем" состояние "подключиться", посылаем какую-нить команду и "вызываем" состояние "ожидание_ок". Чтобы реалиовать такие "вызовы" нужно уметь "сохранять" текущее состояние. Я просто заводил массив структур. Каждая структура - описание состояния: состояние, оставшийся таймаут и еще некоторые параметры. При вызове просто инкрементируем указатель (индекс) этого массива и инициализируем новое "состояние" (удобно наследовать оставшийся таймаут вызваному состоянию). При выходе - декрементируем и как бы попадаем обратно (плюс некоторая математика с таймаутами). Некое подобие вложенных вызовов. Можно реализовать и классическим методом через функции, но накладные расходы велики. таким образом получаем некий АПИ для работы с модемом, который опирается сам на себя и на более просты функции.

З.Ы. извиняюсь за дилетиантское описание.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Aug 30 2010, 05:41
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Через машину состояний как-то сильно круто. Для работы с модемом не актуально, потому что в один момент времени может быть только одно обращение к модему и можно тупо оформить цикл ожидания до прихода ответа. Внутри цикла поллинг других вещей типа индикации если нет оси. Если есть многозадачная ось, то вообще ничего дополнительно не требуется.
Если всё-таки есть желание писать программу на конечных автоматах, то рекомендую погуглить QPC. Очень нехилый (и вроде бы живой) фреймворк. Имеет даже допиленный lwIP.
Go to the top of the page
 
+Quote Post
kovz
сообщение Aug 30 2010, 06:14
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 25-07-05
Пользователь №: 7 079



Цитата(andrewlekar @ Aug 30 2010, 08:41) *
Если всё-таки есть желание писать программу на конечных автоматах, то рекомендую погуглить QPC. Очень нехилый (и вроде бы живой) фреймворк. Имеет даже допиленный lwIP.

+1 за QP. Действительно живой и продвинутый framework. Сам пользуюсь, только на С++.
Go to the top of the page
 
+Quote Post
Slonofil
сообщение Aug 30 2010, 07:55
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 327
Регистрация: 6-10-09
Из: РФ :: Ленинград
Пользователь №: 52 781



Спасибо всем за ответы!

2 av-master: что все пишут по-разному, это понятно. Пока я не научился пользоваться указателями, мучался с правильным представлением данных, освоил структуры, указетели на структуры, массивы указателей на функции и т.п - и мои программы сильно преобразились. Вот для того и спрашиваю, что, может, есть какой-то продуманный и нетривиальный подход к решению этой задачи. Я же не могу всего знать, иногда полезно спросить более опытных разработчиков. В этом нет ничего зазорного.

Проц у меня простенький, PIC18F8627 (если не хватит памяти на всё про всё, возьму 8722), под задачу общения с модемом осталось уже меньше трети памяти. Вот и гадаю, сумею ли уместиться.

2 Dron_Gus: огромное спасибо, очень предметно и по теме! Мои мысли о реализации очень похожи на Ваши. Кое-что Вы мне прояснили.

2 andrewlekar и kovz: обязательно погляжу на QPC. Спасибо!

Сообщение отредактировал Slonofil - Aug 30 2010, 08:30
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Aug 30 2010, 08:31
Сообщение #14


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Не буду спорить, можно проще. У меня была ОС и было несколько потоков, которые обращались к модему. Передача данных, опрос аккумулятора, сбор данных о сотах, СМС. У меня такое решение родилось после долгих мучений. Мне кажется вполне адекватным.

З.Ы. жаль, что в sim508 плохо работал gsmMUX, возможно вышло бы проще.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Slonofil
сообщение Aug 30 2010, 08:33
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 327
Регистрация: 6-10-09
Из: РФ :: Ленинград
Пользователь №: 52 781



Ну, у меня весьма тривиальная задача, насколько я её вижу. Нужно лишь выходить через GPRS и запросами GET/POST передавать данные, принимать настройки и (в планах) принимать обновление прошивки для контроллера. Ни звонков, ни SMS, ни DTMF не планирую. Так что, скорее всего, буду лепить массив структур.
Go to the top of the page
 
+Quote Post

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

 


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


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