Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как вывести форматированную переменную типа Float в UART?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Ivan Kuznetzov
Извините за глупый вопрос...
Например есть значение 5.910 в float, надо чтобы в UART отправлялось 0005.910

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

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

С помощью printf/snprintf.
Ivan Kuznetzov
все, нашел... надо было в опциях компилятора выставить float у printf

printf("%08.3f\r\n",themp);
ARV
Цитата(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
velbovv
Если отправлять 0005.910 - необходимо использовать prntf(в буфер), а далее этот буфер
просто отправляешь по UART. В данном случае необходимо отправлять 8 байт.
Более оптимально отправлять само число (float), для этого необходимо 4 байт.
Тут проще - извлекает адрес переменной (float), приводите его к типу char, и передаете
его в UART.
Удачи.
Tcom
Я делаю так:
Код
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; - передаю побайтно в уарт
demiurg_spb
Поищите описание на ftoa. И поиск по форуму на тему "folat в строку" м.б. даст пищу для размышлений...
А действительно для чего передавать строкой, Вы что потом в терминале наблюдаете результат или у Вас протокол аскишный?
Эффективнее передавать бинарными данными, как Вам ране уже советовали.
defunct
Цитата(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 ));
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.