Easyelectronics.ru

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

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Определение момента сброса количества принятых байт
СообщениеДобавлено: 30 апр 2017, 16:20 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 829
Откуда: Earth
Доброго времени суток. В поисках основы для своего самодельного протокола наткнулся на вот такой вариант: http://ziblog.ru/2016/02/18/hudp.html
Я пытаюсь сделать его реализацию для сети типа 1 мастер - много слейвов.
И мне не понятен такой момент. Каким образом можно в слейве обнулять счетчик принятых байт при отсутствии пакета для этого слейва. Ведь если не обнулять, то условие "совпадение размера" после нескольких принятых байт будет всегда соблюдаться.
Сейчас алгоритм такой:
Непрерывно накапливаем ВСЕ принятые байты в кольцевой буфер (размер буфера чуть больше размера максимально большого сообщения, на всякий пожарный)
1. В обработчике прерывания по приему байта записываем байт в буфер, и анализируем, получен ли “заголовок” (0xFE) ?
а) нет - выходим
б) да - проверяем 2-й (предыдущий) байт (адрес)
2. 2-й (предыдущий) байт (адрес) совпадает с адресом слейва ?
а) нет - выходим
б) да - смотрим 3-й байт (длинну пакета) и сравниваем с полученным количеством байт
3. Принято нужное количество байт ? (можно и больше)
а) нет - выходим
б) да - подсчитываем CRC всех байтов пакета (крома байта CRC)
4. CRC пакета подсчитана ?
а) нет - продолжаем подсчет CRC пакета
б) да - сравниваем с принятым CRC
5. CRC одинаковы ?
а) нет - выходим
б) да - пакет принят !!!

Получаеться что условие 3 у меня после некоторой работы слейва в сети будет всегда верно. Ну кроме случаев, когда слейв только что принят пакет, и можно спокойно обнулить счетчик принятых байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение момента сброса количества принятых байт
СообщениеДобавлено: 30 апр 2017, 20:27 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 175
Gnusmas писал(а):
2. 2-й (предыдущий) байт (адрес) совпадает с адресом слейва ?
а) нет - выходим

Пакет не для нас - "подтягиваем" индекс кольцевого буфера за начало текущего фрейма и ищем/ждём начало следующего фрейма.
Gnusmas писал(а):
5. CRC одинаковы ?
а) нет - выходим

Пакет битый - инкрементируем счётчик ошибок, "подтягиваем" индекс кольцевого буфера за начало текущего фрейма и ищем/ждём начало следующего фрейма. На длину текущего фрейма не полагаемся- пакет ведь битый.

А я бы стейт-машинку организовал на Idle,SOF,Address,Count,Data,CRC и хвост/голова индексы в буффере. В Idle просто "подтягиваем" хвост за головой пока не обнаружится начало фрейма, после чего хвост на нём "залипает", а машинка начинает скакать по состояниям вплоть до CRC, где решается судьба пакета и всё возвращается в Idle. Если адрес не совпадает - сваливается в Idle досрочно, "подтянув" хвост к голове.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение момента сброса количества принятых байт
СообщениеДобавлено: 01 май 2017, 14:49 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 829
Откуда: Earth
Прошу прощения, но в данном случае используется не совсем обычный кольцевой буфер. В том смысле что нет смысла отдельно вести "голову" и "хвост", потому что пакет идет "задом-наперед" относительно стандартного "заголовок-тело-CRC". Голова в данном случае и есть точкой отсчета, с которой начинаем разбирать пакет.
По вопросу, который я озвучил, я пока придумал такое: нет смысла считать больше принятых байт, чем размер кольцевого буфера, посему как только мы досчитываем до этого момента, инкремент прекращается. А сброс счетчика произвожу по полностью принятом пакете с корректной CRC.
Под катом ассемблер AVR с комментариями. Обработку CRC пакета и разбор данных (если CRC совпало) планирую в основном цикле, дабы не загружать обработчик.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение момента сброса количества принятых байт
СообщениеДобавлено: 02 май 2017, 10:50 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2649
Откуда: Москва
Код:
UART_RXC:
   
   sbrc      Flags,fl_Pref
   rjmp      X
   cpi      rx_command,0xFE            ; получен “заголовок” (0xFE) ?
   brne   End_UART_RXC            ; нет, на выход   
   sbr    Flags,1<<fl_Pref
   rjmp      End_UART_RXC
X:
   sbrc   Flags,fl_adress
   rjmp  XX
   cpi   XZ,adress
   brne YYY   
       sbr    Flags,1<<fl_adress
       rjmp      End_UART_RXC
XX:
   Заносим количество байт в пакете в счётчик
   Выходим
XXX:
   [Херачим в буффер]
   dec счётчик
   brne End_UART_RXC
YYY:
   Буфер на начало и сбрасываем флаги
End_UART_RXC:
   Reti
MAin:
   Считаем CRC
   Говно?
или
   rjmp    Main
или
   Радуемся


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


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


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

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


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

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

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