Arduino:printf/fprintf打印问号而不是浮点数

Nic*_*rdu 8 c printf arduino stdio

我有一个Arduino草图的以下代码:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
static FILE lcdout = {0} ;

static int lcd_putchar(char ch, FILE* stream)
{
    lcd.write(ch) ;
    return (0) ;
}

void setup() {
  lcd.begin(16, 2);
  fdev_setup_stream (&lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE);
}

void loop() 
{
  stdout = &lcdout;
  printf("%.2f Volts", 2.0);
}
Run Code Online (Sandbox Code Playgroud)

问题出现在代码的最后一行.这应该打印出"2.00伏特",而是打印"?伏特"(问号而不是实际的浮点值).如果我尝试格式化整数,这很有用.

所以基本上,如果我用以下内容替换printf行,它将正常工作:

printf("%d Volts", 2); //prints correctly "2 Volts"
Run Code Online (Sandbox Code Playgroud)

知道问题是什么?

小智 7

用于AVR的GNU工具链(包含在Arduino IDE中)默认使用C标准库的"缩小"版本,其中,例如,浮点支持减少/从格式化I/O函数中删除(只是为了printf()适应芯片的几千字节长存储空间.)

如果要使用此功能,则必须printf()使用-Wl,-u,vfprintf -lprintf_flt链接器标志再次链接包含正常版本的另一个库.


oua*_*uah 5

来自avr-libc 文档

如果需要包括浮点转换在内的完整功能,则应使用以下选项:

-Wl,-u,vfprintf -lprintf_flt -l

请注意,如果您的 MCU 没有任何浮点支持,则应尽量完全避免浮点运算。浮点运算将在软件中完成,效率非常低并且需要大量闪存。