Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 35

Работа с модемом

12.02.2015, 22:28. Показов 7327. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, использую TNKernel и ST.
Есть GSM модем, работу с модемом сделал через queue.
Сделал кольцевой буфер в который пишутся все входящие байты с модема.
Когда подряд пришли байты 0x0D и 0x0A отправляем очередь перед этим поставив окончание (0х00) в буфер после входящего сообщения от модема, в очереди передаем начало сообщения, чтобы потом в задаче обработчике очереди выдернуть из буфера пришедшую строку из модема. Проблема возникает, когда нужно получить от модема входящий пакет данных.
Когда на модем приходят данные, то он выдает строчку, например +RESP: "recv".
После, которой нужно отправить команду чтобы считать данные,
AT+READDATA=1000

После чего модем отвечает: +READDATA, <кол-во байтов данных>
и дальше уже выдает сами данные.
Так вот, т.к мы используем очереди, то получается, что можем входящее сообщения обрабатывать с небольшой задержкой, т.е пока мы обрабатывали одну строчку, то от модема пришла вторая строчка и поместилась в очередь. Поэтому когда в обработчике очереди мы видим, что модем сейчас начнет выдавать данные, то эти данные уже поместились в следующую очередь (не знаю как менее коряво объяснить :D)).
Думал сначала сделать проще: получили событие от модема, узнали сколько байтов нам ждать и потом в прерывании уже просто при получении байта отнимать от кол-ва ожидаемых байтов и так до тех пор пока не получили нужное кол-во...
Но по факту получается, как я выше описал, что к тому времени когда мы обработали сообщения от модема, о том, что нужно принимать данные, эти самые данные начали записывать в следующую очередь...
Можно в самой очереди выдернуть данные из модема, но тут проблема в том, что данные могут приходить не только текстовые, но и бинарные, а это значит, что символ окончания строки может уже помешать нам.
В общем, в некотором ступоре нахожусь, не понимаю какой лучше алгоритм тогда использовать. От очередей отказываться не охота, т.к они спасут от "потерянных" данных от модема, а потеря какого-нибудь отклика или события модема очень чревато.
В идеале как-то заставить в прерывании записывать в отдельный буфер данные, но как... :(
Может, кто-то работал с модема, у кого был опыт? Заранее благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2015, 22:28
Ответы с готовыми решениями:

Работа с модемом Wismo228 (SIM карта, TCP/IP стек, активация)
Здравствуйте) В даташите на этот модуль используются микросхемы ESDA6V1SC6 и DALC208SC6 для подключения сим карты к нему (wismo228). Для...

Работа с 3G-модемом
Здравствуйте! купил 3G-модем (USB) от мегафон. установил на комп драйвера, появился порт HUAWEI Mobile Connect - 3G PC UI Interface...

Работа с модемом
Я написал программу, которая должна отправлять на модем команду и считывать с него ответ, вот код: #include &lt;stdio.h&gt; ...

5
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 2
13.02.2015, 05:37
moumty, Вы сможете сами расшифровать алгоритмы работы модемов. Нужно переписать Ваш вариант алгоритма в классическом виде. Это подробно описано в "Основы дискретной математики" В.А. Горбатов, 1986 г.
Вариант "упрощения" для этих устройств не получится. Передача пакетов практически всегда идёт в режиме диалога обоих модемов.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
08.04.2015, 23:53
очереди (фифо) - это одно, парсер ответов модема - другое. грубо говоря, на прерываниях от uart все надо класть в фифо как есть, и ничего не додумывать. а в каком-то процессе читать этот фифо как успеется и делать соотв. работу. и будет как бы 2 режима: читать до конца строки и читать ровно n байт. и никаких заморочек.

каким образом это относится к дискретной математике?
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
09.04.2015, 11:15
Я всегда делал два буфера. В один принимается строка, по окончании копируется во второй буфер и отдаётся на анализ.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
09.04.2015, 15:37
Цитата Сообщение от SOVO
Я всегда делал два буфера. В один принимается строка, по окончании копируется во второй буфер и отдаётся на анализ.
всегда делал (и если работало) - хорошо. но хорошо бы и объяснение - почему именно так, а не иначе.

тут-то проблема в том, что есть 2 вида данных: строки и бинари.
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
09.04.2015, 17:03
Хорошо, объясняю. Приём всегда идёт в свободный буфер. Разборка пакета всегда с собственным буфером. Не важно, сколько времени займёт проверка буфера, лишь бы эта процедура закончилась до окончания приёма второй посылки. Динные всегда разделены и находятся в безопасности. Для полной безопасности можно добавить мютекс или передавать запрос на сообщение флагом.
Это крайний случай FIFO буфера, всего на два значения.
К видам данных это не имеет прямого отношения, для приёмника всё равно, что принимать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2015, 17:03
Помогаю со студенческими работами здесь

C++. Работа с модемом.
Ребята, здравствуйте... Помогите, пожалуйста, разобраться с программкой. В общем, мне надо наладить работу с модемом. Перерыл куту...

Работа с модемом
Здравствуйте знатоки я новенький по C# и сейчас требуется сделать такую петрушку: ситуация такая расскажите кто знает 1) как...

Работа с модемом!
Привет всем! Смотрите ребята, такая ситуация... есть модем с номером сим карты ХХХ, у него COM4 порт. Далее в N-месте находится сим карта,...

Работа с GSM модемом
Уверен что не туда, но куда не нашел. Здравствуйте. Есть вопрос, могу ли я программно узнать код ответа GSM станции, фактически...

Работа с GSM модемом
Пытаюсь работать с GSM модемом по технологии CSD. Я использую следующий принцип: modem.Write(&quot;команда&quot;) while (answer ==...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru