Значение с плавающей точкой не отображается с помощью функции 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-файла, сделайте следующее:
- использовать проект - конфигурация
- выберите значок ("библиотеки")
- выделите "libm.a" и добавьте к правой панели
- сделать то же самое для "libprintf_flt.a"
- под 5-ой иконкой "кастом"
- выберите "[Linker]" optins
- введите "-Wl,-u,vfprintf" и [добавить]