Не могу сообразить в какую сторону копать.

Densl
Offline
Зарегистрирован: 28.11.2018

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

1. Сократить пакет за счет избавления от разделителей. Если crc не совпадут то отправить запрос на повторную отправку данных. Недостаток в этом случае только может быть один: придется плодить структуры для разного набора типов данных.

Поток пакетов будет очень активный, поэтому нужно его контролировать и стараться ничего не терять. Может Агурова почитать?

 Может есть другие концепции для обмена между устройствами? Если есть какие нибудь примеры буду благодарен.

Думаю структура пакета будет выглядеть так:

union{

uint_8bit Command;

uint_32bit Data;

uint_8bit crc;

}my_paket;

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

И еще такой вопрос: возможно ли создать массив с элементами типа String?

b707
Offline
Зарегистрирован: 26.05.2017

Densl пишет:

В общем хочу модернезировать свой протокол обмена для UART, который соединяет 2 устройства, но вот пока не знаю как.

эта фраза выносит мозг. Слова "модернизировать свой протокол" предполагают. что вы его сами разработали и  уже написали. Если сами написали - то странно что не знаете как модернизировать....

Цитата:
Может есть другие концепции для обмена между устройствами? .

другие? а какие вы уже изучили?

Цитата:
Как-то читал про проблемы с выравниванием данных в структурах, когда в них содержится разный тип данных, но уже ничего не помню. Не будет ли здесь такой проблемы?

если с обоих сторон будут устройства одной архитектуры - например. два 8-битных МК АВР - на выравнивание можно забить

Цитата:
И еще такой вопрос: возможно ли создать массив с элементами типа String?

как говорится - "можно, но не нужно"

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Думаю, что "структура union" даже не скомпилируется.

Densl
Offline
Зарегистрирован: 28.11.2018

b707 пишет:

Densl пишет:

В общем хочу модернезировать свой протокол обмена для UART, который соединяет 2 устройства, но вот пока не знаю как.

эта фраза выносит мозг. Слова "модернизировать свой протокол" предполагают. что вы его сами разработали и  уже написали. Если сами написали - то странно что не знаете как модернизировать....

Цитата:
Может есть другие концепции для обмена между устройствами? .

другие? а какие вы уже изучили?

Цитата:
Как-то читал про проблемы с выравниванием данных в структурах, когда в них содержится разный тип данных, но уже ничего не помню. Не будет ли здесь такой проблемы?

если с обоих сторон будут устройства одной архитектуры - например. два 8-битных МК АВР - на выравнивание можно забить

Цитата:
И еще такой вопрос: возможно ли создать массив с элементами типа String?

как говорится - "можно, но не нужно"

Как реализовать представляю. Но могут быть ньюансы. Ну и лень писать то, что уже до меня 10000 человек писали.

Я раньше читал по поводу обмена PC по RS232, 485, разбирал чужой код на эту тему. Но это было лет 10 назад уже мало что помню... Сейчас программирование всего лишь хобби.

По поводу архитектуры, то они у меня разные. Одна 8 бит, другая 32. Но я думал в них может отличаться только тип int, а выравнивание от компилятора зависит.

Ладно тогда буду использовать двухмерный массив.

 

Densl
Offline
Зарегистрирован: 28.11.2018

sadman41 пишет:

Думаю, что "структура union" даже не скомпилируется.

У меня с первого раза редко компилируется :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это наверняка выправит байты в разных архитектурах.


#pragma pack(push,1)

typedef struct {
  uint32_t value;        			  
  uint8_t owner;                                 
....
} extInterrupt_t ;
#pragma pack(pop) 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Двумерный это круто. Вот только в основном разные протоколы через байты передаются. Хоть двухмерные хоть n-мерные. На передающей стороне передаваемые данные разбирают на байты, на приёмной собирают из байтов. Правила сборки-разборки-передачи называются протоколом. Пишешь 1 раз эти правила и потом не задумываешся как и что передавать,оно само как то срабатывает.  И даже не зависит от выравнивания и размера int, если протокол правильно придуман. 

Densl
Offline
Зарегистрирован: 28.11.2018

nik182 пишет:

Двумерный это круто. Вот только в основном разные протоколы через байты передаются. Хоть двухмерные хоть n-мерные. На передающей стороне передаваемые данные разбирают на байты, на приёмной собирают из байтов. Правила сборки-разборки-передачи называются протоколом. Пишешь 1 раз эти правила и потом не задумываешся как и что передавать,оно само как то срабатывает.  И даже не зависит от выравнивания и размера int, если протокол правильно придуман. 

Т.е. можно тупо написать что то типа?:

struct to_send{

union A{

char byte1;
char byte2;
char byte3;
char byte4;
long length;
} out_1;

union B{
char byte1;
char byte2;
char byte3;
char byte4;
long length;
} out_2;
}

А дальше эти байты хоть на биты разбивай. Можно ведь еще битовые поля добавить вообще круто будет. И выравнивание не нужно будет. 4 байта я думаю уже не нужно выравнивать. Чтобы обратиться к биту достаточно будет написать: to_send.out1.byte1

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Densl пишет:

У меня с первого раза редко компилируется :)

Не поддавайтесь гордыне и не считайте себя особо уникальным (по крайней мере, в этом) :)))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Densl пишет:

Чтобы обратиться к биту достаточно будет написать: to_send.out1.byte1

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

Densl
Offline
Зарегистрирован: 28.11.2018

xDriver пишет:

Densl пишет:

Чтобы обратиться к биту достаточно будет написать: to_send.out1.byte1

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

В интернете полно примеров, разберусь без труда, спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Densl пишет:
разберусь без труда
Боюсь, без труда не получится.