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

Местный
  
Группа: Участник
Сообщений: 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) должны выполняться основные задачи. Думаю, Ваши ответы очень помогут многим начинающим освоиться с темой. Спасибо всем! С уважением, Максим.
|
|
|
|
|
Aug 27 2010, 13:11
|

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

|
Нет, погодите, я не о том, что один модем будет использоваться несколькими приложениями! Я о том, что он не является центром системы. А вообще же вопрос по большей части про программную реализацию общения с модемом...
В конце концов, может, этот вопрос уже всесторонне обсуждался на форуме? Ткните ссылочкой, плиз! К сожалению, нет возможности просмотреть весь форум на предмет искомой темы...
Сообщение отредактировал Slonofil - Aug 27 2010, 13:34
|
|
|
|
|
Aug 27 2010, 14:49
|

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

|
Слишком много нюансов. Я делал на вложенной машине состояний. Т.е. есть глобальные состояния типа "Подключение", "отключение", "перезагрузка", "бездействие". Была очередь команд. В состоянии "бездействие" эта очередь читалась, далее переход в нужное состояние. В каждом состоянии множество подсостояний "Отправка команды", "ожидание ответа", "еще что-то там" и т.д. На эти глобальные состояния таймауты. Все входящие (от модема) сообщения парсятся до основного switch'а, некоторый набор сообщений отсеивается (типа +CREG и тому подобных) тогда можно усыпить драйвер до прихода следующего сообщения или до истечения таймаута. Если неизвестное сообщение, то "спускаемся" в swith (возможно сообщение ожидается в текущем состоянии). Если состояние ожидало сообщение, то Ок, иначе еще один "пост"-парсер. Туда обычно падают сообщения об ошибках и тому подобные редкие сообщения. Как-то так.
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Aug 30 2010, 06:14
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 25-07-05
Пользователь №: 7 079

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

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

|
Спасибо всем за ответы!
2 av-master: что все пишут по-разному, это понятно. Пока я не научился пользоваться указателями, мучался с правильным представлением данных, освоил структуры, указетели на структуры, массивы указателей на функции и т.п - и мои программы сильно преобразились. Вот для того и спрашиваю, что, может, есть какой-то продуманный и нетривиальный подход к решению этой задачи. Я же не могу всего знать, иногда полезно спросить более опытных разработчиков. В этом нет ничего зазорного.
Проц у меня простенький, PIC18F8627 (если не хватит памяти на всё про всё, возьму 8722), под задачу общения с модемом осталось уже меньше трети памяти. Вот и гадаю, сумею ли уместиться.
2 Dron_Gus: огромное спасибо, очень предметно и по теме! Мои мысли о реализации очень похожи на Ваши. Кое-что Вы мне прояснили.
2 andrewlekar и kovz: обязательно погляжу на QPC. Спасибо!
Сообщение отредактировал Slonofil - Aug 30 2010, 08:30
|
|
|
|
|
Aug 30 2010, 08:31
|

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

|
Не буду спорить, можно проще. У меня была ОС и было несколько потоков, которые обращались к модему. Передача данных, опрос аккумулятора, сбор данных о сотах, СМС. У меня такое решение родилось после долгих мучений. Мне кажется вполне адекватным.
З.Ы. жаль, что в sim508 плохо работал gsmMUX, возможно вышло бы проще.
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|