0

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

1 回答 1

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 的行。

编辑:
如果您使用没有自定义生成文件的 AvrStudio4,请执行以下操作:

  1. 使用项目 - 配置
  2. 选择图标(“库”)
  3. 突出显示“libm.a”并添加到右侧面板
  4. 对“libprintf_flt.a”做同样的事情
  5. 在第 5 个图标“自定义”下
  6. 选择“[链接器]”选项
  7. 输入“-Wl,-u,vfprintf”并[添加]
于 2014-03-20T08:16:51.793 回答