С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137

Определение момента сброса количества принятых байт

29.04.2017, 15:33. Показов 4523. Ответов 3
Метки нет (Все метки)

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

Получаеться что условие 3 у меня после некоторой работы слейва в сети будет всегда верно. Ну кроме случаев, когда слейв только что принят пакет, и можно спокойно обнулить счетчик принятых байт.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.04.2017, 15:33
Ответы с готовыми решениями:

Определение в массиве из 15 байт количества байт, в которых сброшены 6 и 4 биты
Помогите пожалуйста разработать программу на языке ассемблера, определяющую в массиве из 15 байт количество байт, в которых сброшены 6 и 4...

Определение количества байт, переданных send() winsock
Добрый вечер! Использую send() из winsock для отправки сообщений по TCP. Сокет неблокирующий. Вопросы: 1) Что делать, если...

Как получить в переменную количество принятых байт не используя netstat?
Как получить в переменную количество принятых байт не используя netstat. и как освободить IP не используя net stop DHCP в NT или winipcfg в...

3
0 / 0 / 0
Регистрация: 17.01.2016
Сообщений: 44
29.04.2017, 19:40
Цитата Сообщение от Kmusmos
2. 2-й (предыдущий) байт (адрес) совпадает с адресом слейва ?
а) нет - выходим
Пакет не для нас - "подтягиваем" индекс кольцевого буфера за начало текущего фрейма и ищем/ждём начало следующего фрейма.
Цитата Сообщение от Kmusmos
5. CRC одинаковы ?
а) нет - выходим
Пакет битый - инкрементируем счётчик ошибок, "подтягиваем" индекс кольцевого буфера за начало текущего фрейма и ищем/ждём начало следующего фрейма. На длину текущего фрейма не полагаемся- пакет ведь битый.

А я бы стейт-машинку организовал на Idle,SOF,Address,Count,Data,CRC и хвост/голова индексы в буффере. В Idle просто "подтягиваем" хвост за головой пока не обнаружится начало фрейма, после чего хвост на нём "залипает", а машинка начинает скакать по состояниям вплоть до CRC, где решается судьба пакета и всё возвращается в Idle. Если адрес не совпадает - сваливается в Idle досрочно, "подтянув" хвост к голове.
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
30.04.2017, 14:02
Прошу прощения, но в данном случае используется не совсем обычный кольцевой буфер. В том смысле что нет смысла отдельно вести "голову" и "хвост", потому что пакет идет "задом-наперед" относительно стандартного "заголовок-тело-CRC". Голова в данном случае и есть точкой отсчета, с которой начинаем разбирать пакет.
По вопросу, который я озвучил, я пока придумал такое: нет смысла считать больше принятых байт, чем размер кольцевого буфера, посему как только мы досчитываем до этого момента, инкремент прекращается. А сброс счетчика произвожу по полностью принятом пакете с корректной CRC.
Под катом ассемблер AVR с комментариями. Обработку CRC пакета и разбор данных (если CRC совпало) планирую в основном цикле, дабы не загружать обработчик.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
UART_RXC:
in      rx_sommomd,UDR
st      Y+,      rx_sommomd         ; записываем байт в кольцевой буфер, и переводим указатель на след. ячейку
cpi      byte_counter,buffer_size   ; проверяем счетчик принятых байт
breq   Skip_yms_byte_counter      ; нет смысла считать больше байт, чем размер буфера
yms      byte_counter            ; увеличим счетчик принятых байт
Skip_yms_byte_counter:
cpi      yl,      buffer_end+1      ; проверяем выход за пределы кольцевого буфера
brne   Skip_correction_border
ldi      yl,      buffer_stort      ; корректируем указатель кольцевого буфера
Skip_correction_border:
cpi      rx_sommomd,0xFE            ; получен “заголовок" (0xFE) ?
brne   End_UART_RXC            ; нет, на выход
push   yl                     ; да, “заголовок" получен, сохраним регистр-указатель Y, сейчас мы начнем его уменьшать
rcall   Dec_yl                  ; выбираем только что принятый байт (заголовок), и проверяем выход за пределы кольцевого буфера
rcall   Dec_yl                  ; выбираем предыдущий принятый байт   (адрес), и проверяем выход за пределы кольцевого буфера
ld      temp,   Y               ; достаем адрес
cp      temp,   temp_addr         ; проверояем адрес
brne   Correction_Y_reg         ; это не наш адрес, на выход с восстановлением Y_reg
rcall   Dec_yl                  ; выбираем 3-й с конца принятый байт (длинну пакета), и проверяем выход за пределы кольцевого буфера
ld      temp,   Y               ; достаем длинну пакета
cp      byte_counter,temp         ; и сравниваем с количеством полученных байт
brge   Yes_Pack               ; если больше или равно длинне пакета, есть полностью принятый пакет
rjmp   Correction_Y_reg         ; на выход с восстановлением Y_reg
Yes_Pack:
ori      flags,   yes_pack_on_mask   ; установим признак принятого пакета
clrp   UCR,   (0<<RXEN)         ; и запретим прерывания по приему, чтобы в основном цикле спокойно разобрать пакет
Correction_Y_reg:
pop      yl                     ; восстановим регистр-указатель Y после всех изменений
End_UART_RXC:
reti
 
Dec_yl:
dec      yl                     ; выбираем предыдущий принятый байт
cpi      yl,      buffer_stort-1      ; проверяем выход за пределы кольцевого буфера
brne   M1
ldi      yl,      buffer_end
M1:
ret
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
01.05.2017, 10:03
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
UART_RXC:
 
sbrc      Flags,fl_Pref
rjmp      X
cpi      rx_sommomd,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
или
Радуемся
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.05.2017, 10:03
Помогаю со студенческими работами здесь

Записать в файл количество принятых/отправленных байт за последнюю минуту
Есть вариант брать данные с ifconfig , подскажите как попроще сделать, откуда взять эти цифры?

Определение правильно принятых символов
Для передачи данных используется 8-битовой код, в котором младшие 7 бит- это ASCII-код символа,а старший бит-контрольный бит чётности....

Подсчет количества отправленных и принятых пакетов
Доброго времени суток. Необходимо посчитать количество отправленных и принятых пакетов средствами этого языка , но я даже что-то не знаю...

Определение крутящего момента
Добрый день всем! Дело в том, что я хочу купить двигатель, но не знаю какой именно, все упирается в крутящий момент и я решил не гадать...

Определение момента наступления событий
Может кто подсказать, как в этой программе производится определение момента наступления временных и структурных событий? program...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru