|
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
|
|
| 12.02.2015, 22:28 | |
|
Ответы с готовыми решениями:
5
Работа с модемом Wismo228 (SIM карта, TCP/IP стек, активация) Работа с 3G-модемом Работа с модемом |
|
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 | ||
тут-то проблема в том, что есть 2 вида данных: строки и бинари.
0
|
||
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
| 09.04.2015, 17:03 | |
|
Хорошо, объясняю. Приём всегда идёт в свободный буфер. Разборка пакета всегда с собственным буфером. Не важно, сколько времени займёт проверка буфера, лишь бы эта процедура закончилась до окончания приёма второй посылки. Динные всегда разделены и находятся в безопасности. Для полной безопасности можно добавить мютекс или передавать запрос на сообщение флагом.
Это крайний случай FIFO буфера, всего на два значения. К видам данных это не имеет прямого отношения, для приёмника всё равно, что принимать.
0
|
|
| 09.04.2015, 17:03 | |
|
Помогаю со студенческими работами здесь
6
C++. Работа с модемом. Работа с модемом Работа с модемом! Работа с GSM модемом Работа с GSM модемом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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(), которая. . .
|