35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
||||||
1 | ||||||
Передать float через usart 328p02.05.2019, 17:17. Показов 9507. Ответов 46
Метки нет (Все метки)
Добрый день!
Уже несколько несколько дней не могу решить такую задачу: Передать через usart float. Вот код:
Что я сделал не так?
0
|
02.05.2019, 17:17 | |
Ответы с готовыми решениями:
46
atmega 328p USART Как вывести float число через USART? Как передать данные через usart Передача сообщения через UART для Atmega 328P |
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
03.05.2019, 21:24 [ТС] | 21 |
tatarva87, можете скинуть инфу где описывается как и что там мк преобразует и делает с float, а то 8 16 цифр это уже 16 байт, я окончательно запутался.
Добавлено через 5 минут Можете скинуть инфу о том как хранится float в памяти avr, а то я уже запутался. Один говорит float в МК преобразуется в 16 битное число, в интернете пишут то что float хранится как 4 байта. Моя задача разобраться со всем этим и передать float собственными силами без всяких высокоуровневых функций. И эту статью, которую сейчас скинули я уже читал.
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
|
03.05.2019, 21:44 | 22 |
Число float занимает 4 байта или 32 бита. Тот код, что тебе приводили - это распаковка при помощи функции sprintf числа float в символьный вид из 16 цифр. Но если ты не хочешь использовать библиотечную функцию, то забудь про этот пример. Повторяю число float занимает 4 байта или 32 бита.
1
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|||||||||||
03.05.2019, 21:47 [ТС] | 23 | ||||||||||
А если так?
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
||||||||||||||||
03.05.2019, 22:00 | 24 | |||||||||||||||
Опять же, повторяю: это не годится. То что ты выводишь непосредственно из переменной float побайтно в порте будет отображаться абракадаброй. Тебе нужно реализовать собственную функцию аналогичную printf, в которой нужно произвести распаковку числа float в поразрядное представление и каждый разряд выводить в порт, преобразуя эту разрядную цифру в символьное представление из таблицы ASCII и не забыть про точку.
Например, если при распаковке float ты получишь цифры 12.456, то тебе нужно взять цифру 1, найти в кодовой странице её код (для единицы это будет код 49) и вывести этот код:
1
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
03.05.2019, 22:13 [ТС] | 25 |
Я понимаю то что побайтово это превращается в черте что, но я написал свой пример монитора порта и скидывал его код. Он принимает 4 байта и превращает их в последовательность 32 бит и эти биты должны будут превратиться во float
Но проблема в том, что самый первый бит из этих 32-ух, который определяет знак всегда равен 0(даже если число -54.43), значит. Значит косячит avr Добавлено через 1 минуту Вот 4 байта, и дальше я с ними буду работать begin 00000000 00000000 00000000 00000010 end
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
|
03.05.2019, 22:35 | 26 |
Не совсем понял. Нужно распаковать или запаковать во float десятичное число?
1
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
03.05.2019, 22:42 [ТС] | 27 |
Еще раз весь процесс.
Вообщем, программа на МК находит число float в памяти МК, которое занимает 4 байта и передает их через USART по одному. Далее моя программа на ПК принимает эти четыре байта и превращает их в последовательность 32 бит, далее 32 бита должны будут превратиться во float число. Добавлено через 48 секунд Вот эти биты, но они не похожи на правду
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
||||||
03.05.2019, 23:31 | 28 | |||||
А, вот как! Я-то думал, что всё это нужно сделать средствами микроконтроллера и вывести в человеческом виде в порт.
Ну а если так, то в чём дело-то тогда? При выводе в порт тогда и должна получаться абракадабра и пусть её забирает компьютер и работает дальше. Главное порядок байт не перепутать при выводе в порт. Добавлено через 7 минут
0
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
03.05.2019, 23:33 [ТС] | 29 |
Просто вот эти байты, которые получает комп в бинарном виде:
00000000 00000000 00000000 00000010 не зависимо от того, отрицательное или положительное число первый бит всегда 0. Программу на пк проверял она правильно работает это МК чудит
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
|
03.05.2019, 23:39 | 30 |
Попробовал функцию, что я привёл?
0
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
03.05.2019, 23:40 [ТС] | 31 |
6.84
00010010 10000111 01011011 00000010 -6.84 00010010 10000111 01011011 00000010 Не смотря на знак биты одинаковые, а ведь один бит во float определяет знак 34.84 10010100 00111010 11010000 00000010 -34.84 10010100 00111010 11010000 00000010 Добавлено через 38 секунд Да, только что
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
|
04.05.2019, 00:04 | 32 |
Да, действительно, старший бит почему-то 0.
Но у тебя и порядок бит инвертирован и порядок байт. Например число -6.84 от старшего бита к младшему и от старшего байта к младшему должен идти вот так, то есть в обратном порядке. 11000000 11011010 11100001 01001000 Но это в принципе не особо важно, если ты сам знаешь свой порядок и правильно его интерпретируешь в программе. А вот бит отвечающий за знак всё же почему-то нулевой.
0
|
04.05.2019, 00:10 | 33 | |||||
На компе результат.
Код
01001000 11100001 11011010 01000000 Тестовый код.
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
|
04.05.2019, 00:18 | 34 |
Здесь порядок байт от младшего к старшему, то есть старший байт внизу, а порядок бит от старшего к младшему, то есть старший бит в каждом байте слева, а младший - справа.
0
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
04.05.2019, 00:28 [ТС] | 36 |
Да какая разница как они расположены(так просто было проще вывести их в консоль), обрабатываться они будут уже в нормальном виде
Добавлено через 21 секунду Проблема в другом
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
|
04.05.2019, 00:39 | 37 |
Попробовал у себя на ардуинке число -6.84, выводит нормально, со знаком.
Может у тебя в функции показывающей биты ошибка?
0
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
||||||
04.05.2019, 00:57 [ТС] | 38 | |||||
Нет, ее проверял отдельно.
Вот она: Добавлено через 9 секунд
Мне кажется что именно с отправкой байтой на avr(в самой программе), может не до чет какой-то.
0
|
11 / 10 / 3
Регистрация: 30.04.2019
Сообщений: 60
|
||||||
04.05.2019, 00:59 | 39 | |||||
Попробуй мою
Вот её вывод чисел -6.84 и 6.84 у меня:
0
|
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
|
|
04.05.2019, 11:47 [ТС] | 40 |
А программу, которая принимает биты ты сам писал? Можешь кинуть? А то проблема со старшем битом решена, а вот остальные биты все одинаковые, какое число бы я не кидал. Значит моя программа тупит. Хотя я ее проверял. Скармливал обычные числа и проверял правильно ли она выводит их в бинарном виде.
И вот мой вывод 6.84: 00001100 10001100 00001100 00000010
0
|
04.05.2019, 11:47 | |
04.05.2019, 11:47 | |
Помогаю со студенческими работами здесь
40
Приём данных с usart через dma в память периферии и вывод обратно на usart (для проверки) Не Получается Передать Байт С Выхода Usart Как передать по modbus float Передать в функцию два значения float Прошивка stm32f105 через USART Программирование STM43F407VG через USART xmega: usart - какой глубины буфер в USART? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |