Обсуждение протокола собственного производства #14

Open
opened 2024-02-16 09:11:37 +00:00 by stud126186 · 13 comments
Owner

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

Работоспособность проверена

6bd1021c4e

В папке protcol был сделан простейший протокол для передачи цифр и слов. Необходимо понять, достаточный ли функционал модуля Работоспособность проверена https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/6bd1021c4eb2de8e5df6e7def5b792ea3c8359bf
Owner

void protocol_decode(uint8_t encode_message[], size_t len_encode_message, char decode_message[], size_t* len_decode_message){

у вас может быть передано 3 разных числа. Где это отображено? Целесообразнее запаковывать из какой-то структуры и распаковывать в неё же.

void protocol_encode_number(char number, uint8_t encode_message[], size_t* len_encode_message){

number тогда хотя бы float. Да, он 4 байта. Запишите его в формате little endian. Снова встаёт вопрос про какой из трёх чисел речь.

void protocol_encode_word(char decode_word[], size_t len_encode_word, uint8_t encode_message[], size_t* len_encode_message){

word переводится как слово. У вас же тут строка или буфер. И длину буфера следует вернуть как результат функции.

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/6bd1021c4eb2de8e5df6e7def5b792ea3c8359bf/protocol/protocol.c#L3 у вас может быть передано 3 разных числа. Где это отображено? Целесообразнее запаковывать из какой-то структуры и распаковывать в неё же. https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/6bd1021c4eb2de8e5df6e7def5b792ea3c8359bf/protocol/protocol.c#L24 number тогда хотя бы float. Да, он 4 байта. Запишите его в формате [little endian](https://stackoverflow.com/a/9057216/4950336). Снова встаёт вопрос про какой из трёх чисел речь. https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/6bd1021c4eb2de8e5df6e7def5b792ea3c8359bf/protocol/protocol.c#L31 word переводится как слово. У вас же тут строка или буфер. И длину буфера следует вернуть как результат функции.
Author
Owner

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

for (int i = 0; i < message->len_numbers; i++){
encode_message[count++] = FLAG_NUMBER;
uint8_t *tmp;
tmp = (uint8_t*)(&message->numbers[i]);
for (int z = 0; z < 4; z++){
encode_message[count++] = tmp[z];
}
}

Numbers это массив float, который записан в структуре сообщения.

Также непонятен момент, зачем использовать в принципе uint8_t, если его нельзя кастить к char. Пример ниже

if (encode_message[i] == FLAG_WORD){
int count_word = 0;
i++;
for (int z = 0; z < encode_message[i]; z++){
printf("%d\n", encode_message[i]);
i++;
decode_message->str[count_word++] = encode_message[i];
}
decode_message->len_str = count_word;
}

Программа не выдает результатов. Очень нужна помощь в этих моментах

Не понимаю как правильно записать в uint8_t массив данных. Конвертировать в 4 бита получается, но дальше он просто не записывает. Код прилагаю ` for (int i = 0; i < message->len_numbers; i++){` ` encode_message[count++] = FLAG_NUMBER;` ` uint8_t *tmp;` ` tmp = (uint8_t*)(&message->numbers[i]);` ` for (int z = 0; z < 4; z++){` ` encode_message[count++] = tmp[z];` ` }` ` }` Numbers это массив float, который записан в структуре сообщения. Также непонятен момент, зачем использовать в принципе uint8_t, если его нельзя кастить к char. Пример ниже `if (encode_message[i] == FLAG_WORD){` ` int count_word = 0;` ` i++;` ` for (int z = 0; z < encode_message[i]; z++){` ` printf("%d\n", encode_message[i]);` ` i++;` ` decode_message->str[count_word++] = encode_message[i];` ` }` ` decode_message->len_str = count_word;` ` }` Программа не выдает результатов. Очень нужна помощь в этих моментах
Author
Owner

Разобрался сам во всем

202598b23e

Необходима оценка

Разобрался сам во всем https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/202598b23e6083ae4c1f97624de0ab14bb02cdc5 Необходима оценка
Owner

void protocol_encode(struct message message, uint8_t encode_message[], size_t* len_encode_message){

Идея хорошая!

union convert_char sample;

вот тут никакого преобразования не надо. Вы исходную строку (массив байт) копируете в буфер (массив байт).

sample.fVal = message.numbers[i];

на самом деле тут можно погореть из-за разного эндинга на двух сторонах. Но ладно.

Да, всё просто и хорошо.

uint8_t buffer_number[] = {};

Что тут происходит? Сколько будет выделено памяти? Где она будет выделена? Будет ли она выделена?

https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/202598b23e6083ae4c1f97624de0ab14bb02cdc5/protocol/protocol.c#L32 Идея хорошая! https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/202598b23e6083ae4c1f97624de0ab14bb02cdc5/protocol/protocol.c#L48 вот тут никакого преобразования не надо. Вы исходную строку (массив байт) копируете в буфер (массив байт). https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/202598b23e6083ae4c1f97624de0ab14bb02cdc5/protocol/protocol.c#L38 на самом деле тут можно погореть из-за разного эндинга на двух сторонах. Но ладно. Да, всё просто и хорошо. https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/commit/202598b23e6083ae4c1f97624de0ab14bb02cdc5/protocol/main.c#L63 Что тут происходит? Сколько будет выделено памяти? Где она будет выделена? Будет ли она выделена?
Author
Owner

В структуре сообщения тип char[64]

Я пытаюсь насильно запихнуть в него строку путем следующего кода

for (int z = 0; z < encode_message[i]; z++){
                i++;
                decode_message->str[count_word++] = encode_message[i];
            }

Не работает, массив в принципе не хочет декодится в printf(пустота)

Пытаюсь через второй массив, полностью его заполняю, все хорошо, пытаюсь через strcpy, и снова не хочет декодится. Код ниже

char tmp[64];
            for (int z = 0; z < encode_message[i]; z++){
               i++;
                tmp[count_word++] = encode_message[i];
                printf("buf %d: %d\n", count_word, tmp[count_word]);
            }
            strcpy(decode_message->str, tmp);

Структура message:

struct message{
    float numbers[4];
    size_t len_numbers;
    char str[64];
    size_t len_str;
};
В структуре сообщения тип char[64] Я пытаюсь насильно запихнуть в него строку путем следующего кода ``` for (int z = 0; z < encode_message[i]; z++){ i++; decode_message->str[count_word++] = encode_message[i]; } ``` Не работает, массив в принципе не хочет декодится в printf(пустота) Пытаюсь через второй массив, полностью его заполняю, все хорошо, пытаюсь через strcpy, и снова не хочет декодится. Код ниже ``` char tmp[64]; for (int z = 0; z < encode_message[i]; z++){ i++; tmp[count_word++] = encode_message[i]; printf("buf %d: %d\n", count_word, tmp[count_word]); } strcpy(decode_message->str, tmp); ``` Структура message: ``` struct message{ float numbers[4]; size_t len_numbers; char str[64]; size_t len_str; }; ```
Author
Owner

int count_word = 0;

`int count_word = 0;`
Owner

Этот код работает в какой среде? Win64? Atmel?

encode_message кто такой? Что вообще код делает?

Этот код работает в какой среде? Win64? Atmel? `encode_message `кто такой? Что вообще код делает?
Author
Owner

uint8_t encode_message[]

Билд в clion под винду для тестов работы протокола

Код расшифровывает сообщение, пришедшее в байтах в message для дальнейшего вывода на экран.

В пришедших битах ищет флаг начала слова, по следующему байту узнает его длину, и дальше проходится по длине

uint8_t encode_message[] Билд в clion под винду для тестов работы протокола Код расшифровывает сообщение, пришедшее в байтах в message для дальнейшего вывода на экран. В пришедших битах ищет флаг начала слова, по следующему байту узнает его длину, и дальше проходится по длине
Owner
for (int z = 0; z < encode_message[i]; z++){
                i++;
                decode_message->str[count_word++] = encode_message[i];
            }

Вообще не понятно, что происходит. Раз уж работаете на ПК, то можно посмотреть память в самом удобном виде.

``` for (int z = 0; z < encode_message[i]; z++){ i++; decode_message->str[count_word++] = encode_message[i]; } ``` Вообще не понятно, что происходит. Раз уж работаете на ПК, то можно посмотреть память в самом удобном виде.
Author
Owner

Как мне записать строку в структуру decode_message, которая передается в ссылке?

Как мне записать строку в структуру decode_message, которая передается в ссылке?
Owner
struct message *msg; // msg - ссылка.
char tmp[64];
// ... msg чем-то вдруг наполнена
for(int i = 0; i < msg->len_str; i++){
  tmp[i] = msg->str[i];
}
tmp[msg->len_str] = 0; // null-terminated string(!)
struct message msg; // msg - сам объект.
char tmp[64];
// ... msg чем-то вдруг наполнена
for(int i = 0; i < msg.len_str; i++){
  tmp[i] = msg.str[i];
}
tmp[msg.len_str] = 0; // null-terminated string(!)
``` struct message *msg; // msg - ссылка. char tmp[64]; // ... msg чем-то вдруг наполнена for(int i = 0; i < msg->len_str; i++){ tmp[i] = msg->str[i]; } tmp[msg->len_str] = 0; // null-terminated string(!) ``` ``` struct message msg; // msg - сам объект. char tmp[64]; // ... msg чем-то вдруг наполнена for(int i = 0; i < msg.len_str; i++){ tmp[i] = msg.str[i]; } tmp[msg.len_str] = 0; // null-terminated string(!) ```
Author
Owner

Извиняюсь за неправильную формулировку, мне нужно наоборот, из полученной строки байтов uint8_t конвертировать в поле str(char[64]) структуры message, структура передается ссылкой

Извиняюсь за неправильную формулировку, мне нужно наоборот, из полученной строки байтов uint8_t конвертировать в поле str(char[64]) структуры message, структура передается ссылкой
Owner
struct message *msg; // msg - ссылка.
char tmp[64];
size_t len_str; // как-то определили длину строки
// ...
msg->len_str = len_str;
for(int i = 0; i < msg->len_str; i++){
  msg->str[i] = tmp[i];
}
``` struct message *msg; // msg - ссылка. char tmp[64]; size_t len_str; // как-то определили длину строки // ... msg->len_str = len_str; for(int i = 0; i < msg->len_str; i++){ msg->str[i] = tmp[i]; } ```
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#14
No description provided.