未使用printf函数显示浮点值

问题描述 投票:0回答:2

我一直试图通过使用ATmega8串行端口的printf函数显示浮点值,而不是显示浮点值'?'显示字符。输出是

Float:?

这里是代码

#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);
    }
}
serial-port printf avr stdio usart
2个回答
1
投票

默认情况下,使用的是简约的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. 第5个图标下方的“自定义”
  6. 选择“ [链接器]”选择项
  7. 在“ -Wl,-u,vfprintf和[添加]中键入] >>

0
投票

[我已经成功使用avr studio 4在uart上打印了浮点值,但是没有人可以告诉我如何在avr studio 5中执行相同的操作吗?

© www.soinside.com 2019 - 2024. All rights reserved.