Обсуждение HDLC #10

Open
opened 2023-11-14 15:36:27 +00:00 by stud126186 · 27 comments
Owner
  1. Можно ли в рамках курсовой работы остановится на том, что мы выдадим готовый массив с фреймом для отправки, и просто будем посылать его снова, если не будет ответа?

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

1. Можно ли в рамках курсовой работы остановится на том, что мы выдадим готовый массив с фреймом для отправки, и просто будем посылать его снова, если не будет ответа? 2. Получается, чтобы создать соединение, мне нужно сделать функцию, которая будет отдавать этот буфер, но я пока плохо понимаю, как мне придет ответ. Как его разобрать я понимаю
Owner
  1. Можно ли в рамках курсовой работы остановится на том, что мы выдадим готовый массив с фреймом для отправки, и просто будем посылать его снова, если не будет ответа?

Что значит остановиться?

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

Чтобы создать соединение нужно

  • переодически слать пакет устанвоки соединения
  • получить ответ на этот пакет. Какой именно пакеты, вы уже видели в PDF.

И мы снова приходим к тому, что я уже говорил не раз: есть API вашего модуля. Где оно? Какие имеет функции? Где алгоритмы в конце концов? Где диаграммы, раз не можем сделать алгоритмы?

> 1. Можно ли в рамках курсовой работы остановится на том, что мы выдадим готовый массив с фреймом для отправки, и просто будем посылать его снова, если не будет ответа? Что значит остановиться? > 2. Получается, чтобы создать соединение, мне нужно сделать функцию, которая будет отдавать этот буфер, но я пока плохо понимаю, как мне придет ответ. Как его разобрать я понимаю Чтобы создать соединение нужно - переодически слать пакет устанвоки соединения - получить ответ на этот пакет. Какой именно пакеты, вы уже видели в PDF. И мы снова приходим к тому, что я уже говорил не раз: есть API вашего модуля. Где оно? Какие имеет функции? Где алгоритмы в конце концов? Где диаграммы, раз не можем сделать алгоритмы?
Author
Owner

Метод send

image

Методы connect

image

Метод connect_recive

image

Метод recive

image

Как я в принципе понимаю логику работы своего протокола. Жду комментариев

### Метод send ![image](/attachments/a8c0d9f6-3813-49b7-b513-80687749266a) ### Методы connect ![image](/attachments/dbee24b5-6aed-4ed8-a596-cbed9883c8b4) ### Метод connect_recive ![image](/attachments/6553fec8-ca21-4157-b9e9-d694683a6183) ### Метод recive ![image](/attachments/d1be719e-fdf4-4cf4-af2d-ee1301913f84) ### Как я в принципе понимаю логику работы своего протокола. Жду комментариев
Author
Owner

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

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

Чтобы понять, нужно было сделать диаграмму последовательности.
image

В вашем случае сущноси будут Главная программа (человечек, Вы), UART, какой-то блок создающий и потребляющий информацию из подключения, экземпляр подключения (ваш модуль). И таких диаграмм надо сделать несколько: рассмотретсь случаи когда все пакеты доходят с первого раза, когда какие-то пропадают, когда без очереди приходят. Давайте 2 диаграммы для начала.

Чтобы понять, нужно было сделать диаграмму последовательности. ![image](/attachments/795410e1-50f1-40b1-bbff-696791f1a6c8) В вашем случае сущноси будут Главная программа (человечек, Вы), UART, какой-то блок создающий и потребляющий информацию из подключения, экземпляр подключения (ваш модуль). И таких диаграмм надо сделать несколько: рассмотретсь случаи когда все пакеты доходят с первого раза, когда какие-то пропадают, когда без очереди приходят. Давайте 2 диаграммы для начала.
Author
Owner

Вроде как переделал под все требования первую схему, когда все дошло, и соединение установлено.

https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

Буду посылать ссылкой на гугл диск, чтобы было удобнее отслеживать актуальную версию

Вроде как переделал под все требования первую схему, когда все дошло, и соединение установлено. https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link Буду посылать ссылкой на гугл диск, чтобы было удобнее отслеживать актуальную версию
Owner

image

![image](/attachments/d80d231a-e8d3-4785-a63d-66859729bfb3)
Author
Owner

Не уверен, что правильно переделал, жду комментариев

Последовательная диаграмма соединения:
https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

Не уверен, что правильно переделал, жду комментариев Последовательная диаграмма соединения: https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link
Owner

image

![image](/attachments/85811322-07bb-4426-ab72-82d5badbeb03)
Author
Owner

Спасибо! По вашему примеру переделаю, а также сделаю диграммы для других сценариев. Завтра до 13 постараюсь управиться

Спасибо! По вашему примеру переделаю, а также сделаю диграммы для других сценариев. Завтра до 13 постараюсь управиться
Author
Owner

Диаграмма connect, когда все успешно
https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

Диаграмма not_connect, когда пакет не дошел сразу
https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing
Нужно ли делать отдельную диаграмму, когда не дошел пакет?

Диаграмма send, когда все успешно
https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing

Диаграмма send_err, когда пришел не тот пакет в ответ
https://drive.google.com/file/d/10tvV3DAOhxO4ssRB3UVaw87HMS5lbzS1/view?usp=sharing
Нужно ли делать отдельную диаграмму, когда не дошел пакет?

Диаграмма connect, когда все успешно https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link Диаграмма not_connect, когда пакет не дошел сразу https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing Нужно ли делать отдельную диаграмму, когда не дошел пакет? Диаграмма send, когда все успешно https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing Диаграмма send_err, когда пришел не тот пакет в ответ https://drive.google.com/file/d/10tvV3DAOhxO4ssRB3UVaw87HMS5lbzS1/view?usp=sharing Нужно ли делать отдельную диаграмму, когда не дошел пакет?
Owner

image

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

Теперь на месте "создай соединение со 2 стороной" Нужно написать connect()

При том явно напрашивается то, что connect() не возвращает нам байты для отправки. connect() только изменяет состояние объекта соединения.

Наводящий вопрос: как понять, что пришла пора повторно отправлять пакет? Не важно пакет соединенния и информационный пакет.

Ответ: должна быть функция, которую надо вызывать часто. В качестве параметра этой функции должно быть значение: сколько времени прошло с последнего вызова этой функции. Таки образом для каждого отправленного пакета можно будет установить таймер. При каждом вызове функции вычитать из таймеров значени параметра функции.

И всё равно не эта функция должна возвращать данные для отправки. Должна быть функция, которая делает одно: даёт данные, которые надо будет отправить по UART или любому другому интерфейсу.

![image](/attachments/00f4fbc6-eb4b-48f8-b39a-5ceae46bb920) Диаграммы уже лучше отображают действительность и идею. Нужно понимать, что каждая стрелочка вправо - это вызов функции, а стрелочка влево - возврат из функции. Теперь на месте "создай соединение со 2 стороной" Нужно написать `connect()` При том явно напрашивается то, что connect() не возвращает нам байты для отправки. `connect()` только изменяет состояние объекта соединения. Наводящий вопрос: как понять, что пришла пора повторно отправлять пакет? Не важно пакет соединенния и информационный пакет. Ответ: должна быть функция, которую надо вызывать часто. В качестве параметра этой функции должно быть значение: сколько времени прошло с последнего вызова этой функции. Таки образом для каждого отправленного пакета можно будет установить таймер. При каждом вызове функции вычитать из таймеров значени параметра функции. И всё равно не эта функция должна возвращать данные для отправки. Должна быть функция, которая делает одно: даёт данные, которые надо будет отправить по UART или любому другому интерфейсу.
Author
Owner

На данный момент переделал только connect. Завтра с утра займусь остальными, до этого закрывал учебу, посылаю ещё раз, чтобы не искать.

https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

На данный момент переделал только connect. Завтра с утра займусь остальными, до этого закрывал учебу, посылаю ещё раз, чтобы не искать. https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link
Owner

Отлично! Вы этой диаграммой описали один индеальный случай. Но при этом всё верно!

Отлично! Вы этой диаграммой описали один индеальный случай. Но при этом всё верно!
Author
Owner

Диаграмма connect, когда все успешно
https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

Диаграмма not_connect, когда пакет не дошел сразу
https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing

Диаграмма send, когда все успешно
https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing

Очень нужны ваши комментарии, правильно ли я понимаю логику отправки информационных фреймов. Также немного поправил connect и сделал, когда пакет не дошел с первого раза, попутно все расписав с комментариями

Диаграмма connect, когда все успешно https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link Диаграмма not_connect, когда пакет не дошел сразу https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing Диаграмма send, когда все успешно https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing Очень нужны ваши комментарии, правильно ли я понимаю логику отправки информационных фреймов. Также немного поправил connect и сделал, когда пакет не дошел с первого раза, попутно все расписав с комментариями
Owner

image

не вы говорите модулю, что надо отправить повторно пакет. Вы как раз разрабатываете модуль, который делает это за вас. Вы лишь должны вызывать функцию, которая ведёт учёт таймаутов. А параметр этой функции - дельта времени с последнего вызова этой функции. Человеческим языком: если вы вызываете эту функцию каждую миллисекунду, то параметр всегда будет равен 1.

![image](/attachments/3742b98f-d07f-41ac-8eed-0ab9bf04dc0b) не вы говорите модулю, что надо отправить повторно пакет. Вы как раз разрабатываете модуль, который делает это за вас. Вы лишь должны вызывать функцию, которая ведёт учёт таймаутов. А параметр этой функции - дельта времени с последнего вызова этой функции. Человеческим языком: если вы вызываете эту функцию каждую миллисекунду, то параметр всегда будет равен 1.
Owner

image

Нужно понимать, что UART принимает байты, а не пакеты. Вы не знаете, получили вы пакет или нет. Это делает ваш модуль. Ваш модуль декодирует фреймы (ждёт FD, деэкранирует).

Не будет у вас публичной функции check_frame. У вас будет функция hdlc_got_raw_data() или как-то так. и уже в неё отдаёте полученные байты.

![image](/attachments/c0aa8dbe-2ca1-44ff-be1d-5ee5f534668e) Нужно понимать, что UART принимает байты, а не пакеты. Вы не знаете, получили вы пакет или нет. Это делает ваш модуль. Ваш модуль декодирует фреймы (ждёт FD, деэкранирует). Не будет у вас публичной функции check_frame. У вас будет функция hdlc_got_raw_data() или как-то так. и уже в неё отдаёте полученные байты.
Owner

Также нужно соблюдать нотацию. Посмотрите примеры.

Также нужно соблюдать нотацию. Посмотрите примеры.
Author
Owner

Диаграмма connect, когда все успешно
https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

Диаграмма not_connect, когда пакет не дошел сразу
https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing

Диаграмма send, когда все успешно
https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing

Диаграмма send_err, когда пришел не тот пакет в ответ
https://drive.google.com/file/d/10tvV3DAOhxO4ssRB3UVaw87HMS5lbzS1/view?usp=sharing

Не уверен все ли правильно, но хотелось бы поговорить о реализации функций, чтобы закрыть все недочеты в диаграммах

Диаграмма connect, когда все успешно https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link Диаграмма not_connect, когда пакет не дошел сразу https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing Диаграмма send, когда все успешно https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing Диаграмма send_err, когда пришел не тот пакет в ответ https://drive.google.com/file/d/10tvV3DAOhxO4ssRB3UVaw87HMS5lbzS1/view?usp=sharing Не уверен все ли правильно, но хотелось бы поговорить о реализации функций, чтобы закрыть все недочеты в диаграммах
Owner

image

Не нарушать нотацию. Иначе не понятно, как прочитать

![image](/attachments/c360e0d9-1c09-4665-b424-7b749a886727) Не нарушать нотацию. Иначе не понятно, как прочитать
Owner

image

ранее мы говорили:

Вы как раз разрабатываете модуль, который делает это за вас. Вы лишь должны вызывать функцию, которая ведёт учёт таймаутов. А параметр этой функции - дельта времени с последнего вызова этой функции. Человеческим языком: если вы вызываете эту функцию каждую миллисекунду, то параметр всегда будет равен 1.

Чтобы что-то отправлять, вы должны сначала спросить свой модуль, есть ли что отправлять. А вот ваш модуль будет отправлять пакет заново, когда наступит таймаут. На диаграммах до сих пор отсутствует что-либо связанное с уведомлением вашего модуля о прошедшем времени.

![image](/attachments/9229c9a2-5274-477e-8d82-6527da43a282) ранее мы говорили: > Вы как раз разрабатываете модуль, который делает это за вас. Вы лишь должны вызывать функцию, которая ведёт учёт таймаутов. А параметр этой функции - дельта времени с последнего вызова этой функции. Человеческим языком: если вы вызываете эту функцию каждую миллисекунду, то параметр всегда будет равен 1. Чтобы что-то отправлять, вы должны сначала спросить свой модуль, есть ли что отправлять. А вот ваш модуль будет отправлять пакет заново, когда наступит таймаут. На диаграммах до сих пор отсутствует что-либо связанное с уведомлением вашего модуля о прошедшем времени.
Author
Owner

Диаграмма connect, когда все успешно
https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link

Диаграмма not_connect, когда пакет не дошел сразу
https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing

Диаграмма send, когда все успешно
https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing

Диаграмма send_err, когда пришел не тот пакет в ответ
https://drive.google.com/file/d/10tvV3DAOhxO4ssRB3UVaw87HMS5lbzS1/view?usp=sharing

Нотации все поправлены. Вопрос, можно ли сделать обработчик ошибок в си, наподобие го, где можно в условиях сравнивать, вернулась та ли ошибка?

Жду ваших комментариев

Диаграмма connect, когда все успешно https://drive.google.com/file/d/1zTlphz4DXeDvR3_lOIHZ-LBTHXp-UOUR/view?usp=drive_link Диаграмма not_connect, когда пакет не дошел сразу https://drive.google.com/file/d/1JqhlFN7W-glqe-T7DDJOaTSGi0Tv0-IF/view?usp=sharing Диаграмма send, когда все успешно https://drive.google.com/file/d/1mYgZ_ZPXZuS-zRomPgyMpuswglhmQB4f/view?usp=sharing Диаграмма send_err, когда пришел не тот пакет в ответ https://drive.google.com/file/d/10tvV3DAOhxO4ssRB3UVaw87HMS5lbzS1/view?usp=sharing Нотации все поправлены. Вопрос, можно ли сделать обработчик ошибок в си, наподобие го, где можно в условиях сравнивать, вернулась та ли ошибка? Жду ваших комментариев
Owner

Коммиты должны содержать описание, которое отражает суть изменений
image

Коммиты должны содержать описание, которое отражает суть изменений ![image](/attachments/c2cf0c25-879b-4ac9-acaf-46f09cab635b)
Owner

client->connecting_frame_timeout -= delta_time;

А дальше? А пакет, который мы отправили? Когда его в следующий раз отправим?

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/26c316f47a79e853b0141b8afca4ea25177e9a05/hdlc/client.c#L143 А дальше? А пакет, который мы отправили? Когда его в следующий раз отправим?
Owner

bool FLAG_FILL_BUFFER1 = false;

Если мне нужно будет уменьшить или увеличить количество пакетов?

#define COUNT_BUFFERS 4 // Вот это правильно!

bool FLAG_FILL_BUFFER1 = false; // Нет
bool FLAG_FILL_BUFFER2 = false; // Нет
bool FLAG_FILL_BUFFER3 = false; // Нет
bool FLAG_FILL_BUFFER4 = false; // Нет

bool FLAG_SEND_BUFFER1 = false; // Нет
bool FLAG_SEND_BUFFER2 = false; // Нет
bool FLAG_SEND_BUFFER3 = false; // Нет
bool FLAG_SEND_BUFFER4 = false; // Нет

uint8_t buffer_data[COUNT_BUFFERS][SIZE_DATA_BUFFER];  // Нет

прямо напрашивается структура (struct ...) и объявление переменной-массива, где размер массива - COUNT_BUFFERS

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/26c316f47a79e853b0141b8afca4ea25177e9a05/hdlc/client.c#L10 Если мне нужно будет уменьшить или увеличить количество пакетов? ``` #define COUNT_BUFFERS 4 // Вот это правильно! bool FLAG_FILL_BUFFER1 = false; // Нет bool FLAG_FILL_BUFFER2 = false; // Нет bool FLAG_FILL_BUFFER3 = false; // Нет bool FLAG_FILL_BUFFER4 = false; // Нет bool FLAG_SEND_BUFFER1 = false; // Нет bool FLAG_SEND_BUFFER2 = false; // Нет bool FLAG_SEND_BUFFER3 = false; // Нет bool FLAG_SEND_BUFFER4 = false; // Нет uint8_t buffer_data[COUNT_BUFFERS][SIZE_DATA_BUFFER]; // Нет ``` прямо напрашивается структура (`struct ...`) и объявление переменной-массива, где размер массива - `COUNT_BUFFERS `
Author
Owner
  1. Добавить в client структуру hdlc_state_t
  2. Если пришел пакет не того номера, в запасной буффер добавить пакет REJ.
1. Добавить в client структуру hdlc_state_t 2. Если пришел пакет не того номера, в запасной буффер добавить пакет REJ.
Owner

hdlc_control_t frame;

Вот эта структура фрейма что делает в main и вообще вне вашего модуля. Ваш модуль предоставляет только структуру соединения и функции работы с этим соединением.

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/80cd73c3d606748e33223f0ac6a83ff285cbcbe5/main_sketch/main_sketch.ino#L18 Вот эта структура фрейма что делает в main и вообще вне вашего модуля. Ваш модуль предоставляет только структуру соединения и функции работы с этим соединением.
Author
Owner

Структура фрейма была убрана

800f48bc11

Структура фрейма была убрана https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/800f48bc118f5fd1a627eb7ece16bb7108774fdc
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: ICS-Microprocessor-2020/Display_Avr_3#10
No description provided.