我一直在尝试使用ATmega8的串口使用printf函数显示浮点值,而不是显示浮点值,'?'字符显示。输出是
浮动:?
这是代码
#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);
}
}
答案 0 :(得分:1)
默认情况下,使用minimalistic printf库,它不支持浮点数并产生“?”作为价值的占位符。您必须告诉链接器使用浮点库。
例如(来自GNU makefile)
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
你必须像这样使用浮点版本:
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
根据您的基本makefile,应该有这样的部分:
# 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的行。
修改强>
如果您在没有自定义makefile的情况下使用AvrStudio4,请执行以下操作: