Easyelectronics.ru

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

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



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

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос о целесообразности введения кольцевого буфера
СообщениеДобавлено: 19 окт 2018, 22:48 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
Доброго времени суток.
До сегодняшнего дня для работы с ответами модуля SIMCOM пользовался самописной функцией парсинга:
Show


Обработчик прерывания
Show


Эта связка прекрасно работала, если я знал, какого ответа от модуля ожидать: сперва я парсил команду ответа (без числового значения пареметра), а затем сразу за командой отдельно принимал и анализировал параметр (уровень сигнала, состояние регистрации и прочее). Также эта схема работала, когда я принимал какое-то одно асинхронное событие снаружи: звонки, либо входящие смс.

Теперь у меня возникла необходимость принимать и звонки, и смс ОДНОВРЕМЕННО. То есть, я не знаю, что мне может придти в следующий момент времени: это может быть как звонок (строка "\r\nRING\r\n\r\n+CLIP: \""), так и смс (строка "\r\n+CMTI: \"SM\","). Я вижу только 1 адекватное решение - введение кольцевого буфера на прием. В основном цикле я буду анализировать хвост буфера на соответствие символу перевода строки (\n) - признак конца любой команды, и смотреть, что бы в буфере было больше 2 невычитанных байт (это условие необходимо, так как незапрашиваемые уведомления начинаются с \r\n), и уже тогда вычитывать и анализировать пришедшую команду.

Может кто-то видит более оптимальное решение ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о целесообразности введения кольцевого буфера
СообщениеДобавлено: 22 окт 2018, 09:48 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Строку в кольцевом буффере не очень удобно анализировать.
Я обычно делаю так:

Драйвер usart содержит кольцевой буффер висит на приём и при приходе данных пинает терминал.
Терминал, когда настанет его очередь исполняться по байту переписывает пришедшие данные в свой буффер. Если приходит символ конца строки, начинается анализ строки.
Если приём успешный, вызывается соответствующий содержанию строки коллбэк.

При успешном или неуспешном окончании приёма буффер терминала очищается.

Достоинства: Логика драйвера и парсера разнесены. Драйвер более универсален. Логика парсера более простая.
Недостатки: Требуется место под два буфера, появляется дополнительное копирование.


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


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


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

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


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

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

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