Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2020, 02:44

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Работа с модемом
СообщениеДобавлено: 13 фев 2015, 23:15 
Заглядывает иногда

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

После чего модем отвечает: +READDATA, <кол-во байтов данных>
и дальше уже выдает сами данные.
Так вот, т.к мы используем очереди, то получается, что можем входящее сообщения обрабатывать с небольшой задержкой, т.е пока мы обрабатывали одну строчку, то от модема пришла вторая строчка и поместилась в очередь. Поэтому когда в обработчике очереди мы видим, что модем сейчас начнет выдавать данные, то эти данные уже поместились в следующую очередь (не знаю как менее коряво объяснить :D)).
Думал сначала сделать проще: получили событие от модема, узнали сколько байтов нам ждать и потом в прерывании уже просто при получении байта отнимать от кол-ва ожидаемых байтов и так до тех пор пока не получили нужное кол-во...
Но по факту получается, как я выше описал, что к тому времени когда мы обработали сообщения от модема, о том, что нужно принимать данные, эти самые данные начали записывать в следующую очередь...
Можно в самой очереди выдернуть данные из модема, но тут проблема в том, что данные могут приходить не только текстовые, но и бинарные, а это значит, что символ окончания строки может уже помешать нам.
В общем, в некотором ступоре нахожусь, не понимаю какой лучше алгоритм тогда использовать. От очередей отказываться не охота, т.к они спасут от "потерянных" данных от модема, а потеря какого-нибудь отклика или события модема очень чревато.
В идеале как-то заставить в прерывании записывать в отдельный буфер данные, но как... :(
Может, кто-то работал с модема, у кого был опыт? Заранее благодарен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с модемом
СообщениеДобавлено: 14 фев 2015, 06:24 
Старожил

Зарегистрирован: 03 мар 2013, 11:01
Сообщения: 207
mounty, Вы сможете сами расшифровать алгоритмы работы модемов. Нужно переписать Ваш вариант алгоритма в классическом виде. Это подробно описано в "Основы дискретной математики" В.А. Горбатов, 1986 г.
Вариант "упрощения" для этих устройств не получится. Передача пакетов практически всегда идёт в режиме диалога обоих модемов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с модемом
СообщениеДобавлено: 10 апр 2015, 00:40 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
очереди (фифо) - это одно, парсер ответов модема - другое. грубо говоря, на прерываниях от uart все надо класть в фифо как есть, и ничего не додумывать. а в каком-то процессе читать этот фифо как успеется и делать соотв. работу. и будет как бы 2 режима: читать до конца строки и читать ровно n байт. и никаких заморочек.

каким образом это относится к дискретной математике?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с модемом
СообщениеДобавлено: 10 апр 2015, 12:02 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 647
Откуда: Киев
Я всегда делал два буфера. В один принимается строка, по окончании копируется во второй буфер и отдаётся на анализ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с модемом
СообщениеДобавлено: 10 апр 2015, 16:24 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
SOVA писал(а):
Я всегда делал два буфера. В один принимается строка, по окончании копируется во второй буфер и отдаётся на анализ.
всегда делал (и если работало) - хорошо. но хорошо бы и объяснение - почему именно так, а не иначе.

тут-то проблема в том, что есть 2 вида данных: строки и бинари.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с модемом
СообщениеДобавлено: 10 апр 2015, 17:50 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 647
Откуда: Киев
Хорошо, объясняю. Приём всегда идёт в свободный буфер. Разборка пакета всегда с собственным буфером. Не важно, сколько времени займёт проверка буфера, лишь бы эта процедура закончилась до окончания приёма второй посылки. Данные всегда разделены и находятся в безопасности. Для полной безопасности можно добавить мютекс или передавать запрос на сообщение флагом.
Это крайний случай FIFO буфера, всего на два значения.
К видам данных это не имеет прямого отношения, для приёмника всё равно, что принимать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB