Значение с плавающей точкой не отображается с помощью функции printf

Я пытался отобразить значение с плавающей запятой, используя функцию printf, используя последовательный порт ATmega8, но вместо отображения значения с плавающей запятой '?' символ отображается. Выход

Поплавок:?

Вот код

#include <stdio.h>
#include <float.h>
#include <avr/io.h>

int printCHAR(char character, FILE *stream) 
{
    while(!(UCSRA&0x20));
    UDR=data;
    return 0;
}
FILE uart_str = FDEV_SETUP_STREAM(printCHAR, NULL, _FDEV_SETUP_RW);

int main(void)
{
    float fl = 1.3;
    stdout = &uart_str;         
    UCSRB=0x18; // RXEN=1, TXEN=1 
    UCSRC=0x06; // no parit, 1-bit stop, 8-bit data
    UBRRH=0;
    UBRRL=71;     //9600 baud rate
    while(1)
    {               
        printf("\r\nFloat: %f",fl);
    }
}

1 ответ

Решение

По умолчанию используется минималистичная библиотека printf, которая не поддерживает числа с плавающей точкой и приводит к "?" в качестве заполнителя для значения. Вы должны указать компоновщику использовать библиотеку с плавающей запятой.

Например (из GNU makefile)

PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min

Вы должны использовать версию с плавающей запятой примерно так:

PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

В зависимости от вашего базового make-файла уже должен быть раздел, подобный следующему:

# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB = 
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)

Просто раскомментируйте строку, содержащую PRINTF_LIB_FLOAT.

РЕДАКТИРОВАТЬ:
Если вы используете AvrStudio4 без собственного make-файла, сделайте следующее:

  1. использовать проект - конфигурация
  2. выберите значок ("библиотеки")
  3. выделите "libm.a" и добавьте к правой панели
  4. сделать то же самое для "libprintf_flt.a"
  5. под 5-ой иконкой "кастом"
  6. выберите "[Linker]" optins
  7. введите "-Wl,-u,vfprintf" и [добавить]
Другие вопросы по тегам