使用printf函数未显示浮点值

时间:2014-03-20 07:34:30

标签: serial-port printf avr stdio usart

我一直在尝试使用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);
    }
}

1 个答案:

答案 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,请执行以下操作:

  1. 使用项目 - 配置
  2. 选择图标(“图书馆”)
  3. 突出显示“libm.a”并添加到右侧面板
  4. 对“libprintf_flt.a”
  5. 执行相同的操作
  6. 在第5个图标“custom”
  7. 选择“[Linker]”optins
  8. 输入“-Wl,-u,vfprintf”和[add]