Помогите правильно организовать прием и обработку пакетов

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 17
Зарегистрирован: Ср ноя 29, 2017 00:14:49

Сообщение Orel007127 »

Здравствуйте. Хочу сделать свой простенький протокол. Будут всего один-два провода для данных, но в целом вопросы не про это. В общем по таймеру или прерыванию МК будет получать биты пакета. Хотелось бы что бы они по приходу попадали в какой-либо буфер, а основная программа бы в любой момент (возможно даже по среди приема очередного пакета) могла их от туда забрать и передать в процедуру обработки пакета. Я так понял, что для этого обычно используют кольцевой буфер, но возникли некоторые вопросы:
1. Возможно ли в с кольцевым буфером работать по битам? Или мне нужно при приеме накопить сначала восемь бит и только потом отправить их в буфер? Если нужна переменная, то как это сделать? Просто две переменный сделать (одну под счетчик, другую под биты) и после записи если счетчик равен восьми, то обнуляю счетчик и байт отправить в кольцевой?
2. Если не ошибаюсь, то чтение из буфера занимает не один такт. Что будет если посреди чтения сработает прерывание и в этом прерывании начнется процедура записи? Могут ли так потеряться, исказиться или остаться необработанными данные в буфере? Может нужно сделать флаг, который запретит записывать в буфер, пока идет процедура чтения? Или потеря данных таки образом исключена?

Ну и вообще подход правильный? Может советы какие есть. Свой протокол делаю что бы просто научится. В основном интересует
только правильная организация буфера (физический уровень протокола и процедура обработки пакетов - это другой вопрос), поскольку и чтение и запись могут начаться в абсолютно любой момент (даже одновременно), а организовать желательно так, что бы я ничего не потерял (ну не считая переполнения буфера конечно же).
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Сдаётся мне ТС UART изобретает?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

поскольку минимальная порция данных, обрабатываемая АЛУ "за раз" это байт, вам придется накапливать порции по 8 битов, "упаковывая" их в последовательность байтов. пока не представляю ситуации, когда "протокол" будет именно БИТОВЫМ.
думаю, прежде чем городить свой протокол, вам стоит ознакомиться со стандартными последовательными синхронными и асинхронными протоколами.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

Если пакет содержит признак начала пакета и/или контрольную сумму, то принимать надо сразу весь пакет в буфер, проверять контрольную сумму и передавать на обработку. В таком случае речи о кольцевом буфере идти не может. Нужен только счётчик принятых байтов (ну или битов, как вы хотели) - указатель на место в буфере.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»