В папке protcol был сделан простейший протокол для передачи цифр и слов. Необходимо понять, достаточный ли функционал модуля
Работоспособность проверена
https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/commit/6bd1021c4eb2de8e5df6e7def5b792ea3c8359bf
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 переводится как слово. У вас же тут строка или буфер. И длину буфера следует вернуть как результат функции.
Не понимаю как правильно записать в 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;`
` }`
Программа не выдает результатов. Очень нужна помощь в этих моментах
Что тут происходит? Сколько будет выделено памяти? Где она будет выделена? Будет ли она выделена?
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
Что тут происходит? Сколько будет выделено памяти? Где она будет выделена? Будет ли она выделена?
В структуре сообщения тип 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;
};
```
Билд в clion под винду для тестов работы протокола
Код расшифровывает сообщение, пришедшее в байтах в message для дальнейшего вывода на экран.
В пришедших битах ищет флаг начала слова, по следующему байту узнает его длину, и дальше проходится по длине
uint8_t encode_message[]
Билд в clion под винду для тестов работы протокола
Код расшифровывает сообщение, пришедшее в байтах в message для дальнейшего вывода на экран.
В пришедших битах ищет флаг начала слова, по следующему байту узнает его длину, и дальше проходится по длине
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];
}
```
Вообще не понятно, что происходит. Раз уж работаете на ПК, то можно посмотреть память в самом удобном виде.
Извиняюсь за неправильную формулировку, мне нужно наоборот, из полученной строки байтов uint8_t конвертировать в поле str(char[64]) структуры message, структура передается ссылкой
Извиняюсь за неправильную формулировку, мне нужно наоборот, из полученной строки байтов uint8_t конвертировать в поле str(char[64]) структуры message, структура передается ссылкой
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
В папке protcol был сделан простейший протокол для передачи цифр и слов. Необходимо понять, достаточный ли функционал модуля
Работоспособность проверена
6bd1021c4eу вас может быть передано 3 разных числа. Где это отображено? Целесообразнее запаковывать из какой-то структуры и распаковывать в неё же.
number тогда хотя бы float. Да, он 4 байта. Запишите его в формате little endian. Снова встаёт вопрос про какой из трёх чисел речь.
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;}Программа не выдает результатов. Очень нужна помощь в этих моментах
Разобрался сам во всем
202598b23eНеобходима оценка
Идея хорошая!
вот тут никакого преобразования не надо. Вы исходную строку (массив байт) копируете в буфер (массив байт).
на самом деле тут можно погореть из-за разного эндинга на двух сторонах. Но ладно.
Да, всё просто и хорошо.
Что тут происходит? Сколько будет выделено памяти? Где она будет выделена? Будет ли она выделена?
В структуре сообщения тип char[64]
Я пытаюсь насильно запихнуть в него строку путем следующего кода
Не работает, массив в принципе не хочет декодится в printf(пустота)
Пытаюсь через второй массив, полностью его заполняю, все хорошо, пытаюсь через strcpy, и снова не хочет декодится. Код ниже
Структура message:
int count_word = 0;Этот код работает в какой среде? Win64? Atmel?
encode_messageкто такой? Что вообще код делает?uint8_t encode_message[]
Билд в clion под винду для тестов работы протокола
Код расшифровывает сообщение, пришедшее в байтах в message для дальнейшего вывода на экран.
В пришедших битах ищет флаг начала слова, по следующему байту узнает его длину, и дальше проходится по длине
Вообще не понятно, что происходит. Раз уж работаете на ПК, то можно посмотреть память в самом удобном виде.
Как мне записать строку в структуру decode_message, которая передается в ссылке?
Извиняюсь за неправильную формулировку, мне нужно наоборот, из полученной строки байтов uint8_t конвертировать в поле str(char[64]) структуры message, структура передается ссылкой