реклама на сайте
подробности

 
 
> Как вывести форматированную переменную типа Float в UART?
Ivan Kuznetzov
сообщение Apr 6 2009, 04:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Извините за глупый вопрос...
Например есть значение 5.910 в float, надо чтобы в UART отправлялось 0005.910

туплю я седня...

Сообщение отредактировал Ivan Kuznetzov - Apr 6 2009, 04:45


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
HARMHARM
сообщение Apr 6 2009, 04:45
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Ivan Kuznetzov @ Apr 6 2009, 07:43) *
Извините за глупый вопрос...
Например есть значение 5.910 в float, надо чтобы в UART отправлялось 0005.910

туплю я седня...

С помощью printf/snprintf.
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Apr 6 2009, 05:16
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



все, нашел... надо было в опциях компилятора выставить float у printf

printf("%08.3f\r\n",themp);

Сообщение отредактировал Ivan Kuznetzov - Apr 6 2009, 05:16


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 6 2009, 05:18
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Ivan Kuznetzov @ Apr 6 2009, 08:51) *
а по-конкретнее можно?
Вот так пишу - вообще не то выводится:

printf("%d\r\n",temp);

во-первых, надо printf("%f\r\n",temp); во-вторых, если это WinAVR, то надо еще использовать "полную" версию библиотеки stdio - подключить для компоновки соответствующий объектный файл с поддержкой float-форматирования, т.е. использовать опции -Wl,-u,vfprintf -lprintf_flt -lm


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
velbovv
сообщение Apr 6 2009, 05:24
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 30-07-08
Пользователь №: 39 290



Если отправлять 0005.910 - необходимо использовать prntf(в буфер), а далее этот буфер
просто отправляешь по UART. В данном случае необходимо отправлять 8 байт.
Более оптимально отправлять само число (float), для этого необходимо 4 байт.
Тут проще - извлекает адрес переменной (float), приводите его к типу char, и передаете
его в UART.
Удачи.
Go to the top of the page
 
+Quote Post
Tcom
сообщение Apr 6 2009, 05:28
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Я делаю так:
Код
typedef union myfloat
     {
          float data;
          struct
          {
             unsigned char  data4;
             unsigned char  data3;
             unsigned char  data2;
             unsigned char  data1;
          };
} mfloat;

mfloat               KS;

KS.data = 3.14;


KS.data4; KSdata3;KS.data2; KS.data1; - передаю побайтно в уарт
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 6 2009, 08:49
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Поищите описание на ftoa. И поиск по форуму на тему "folat в строку" м.б. даст пищу для размышлений...
А действительно для чего передавать строкой, Вы что потом в терминале наблюдаете результат или у Вас протокол аскишный?
Эффективнее передавать бинарными данными, как Вам ране уже советовали.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 16 2009, 00:47
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(velbovv @ Apr 6 2009, 08:24) *
Если отправлять 0005.910 - необходимо использовать prntf(в буфер), а далее этот буфер
просто отправляешь по UART.

Не проще printf сразу в uart?

Цитата
А действительно для чего передавать строкой, Вы что потом в терминале наблюдаете результат или у Вас протокол аскишный?

Ну например Log вести или консолька.
Цитата
Эффективнее передавать бинарными данными, как Вам ране уже советовали

неэффективно потом это читать.

Цитата(Tcom @ Apr 6 2009, 08:28) *
Я делаю так:

Но лучше так не делать.

Когда надо слать просто данные побайтово, целесообразно сделать унифицированную функцию отправки данных побайтово:
Код
void xx_SendData( void *ptr, int size)
{
    while(size--)
    {
        put( *(U8 *)ptr );  // ваша функция отправки символа куда требуется
        ptr = (U8 *)ptr + 1;
    }
}

И пользовать ее для передачи любых данных

float x = 3.14;
double y = 3.14;
struct
{
...
} z;

xx_SendData( &x, sizeof( x ));
xx_SendData( &y, sizeof( y ));
xx_SendData( &z, sizeof( z ));
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 15:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016