Arduino sprintf浮动没有格式化

时间:2014-12-25 21:54:08

标签: c++ arduino printf

我有这个arduino草图,

char temperature[10];
float temp = 10.55;
sprintf(temperature,"%f F", temp);
Serial.println(temperature);

温度打印为

? F

有关如何格式化此浮点数的任何想法?我需要它成为一个字符串。

4 个答案:

答案 0 :(得分:91)

由于某些性能原因,%f未包含在Arduino的sprintf()实现中。更好的选择是使用dtostrf() - 将浮点值转换为C风格的字符串,方法签名如下:

char *dtostrf(double val, signed char width, unsigned char prec, char *s)

使用此方法将其转换为C-Style字符串,然后使用sprintf,例如:

char str_temp[6];

/* 4 is mininum width, 2 is precision; float value is copied onto str_temp*/
dtostrf(temp, 4, 2, str_temp);
sprintf(temperature,"%s F", str_temp);

您可以更改最小宽度和精度以匹配您要转换的浮动。

答案 1 :(得分:2)

如前所述,在Arduino的sprintf中不包含Float支持。

字符串类

Arduino有自己的String类。

String value = String(3.14);

然后,

char *result = value.c_str();

字符串类引用,上面链接

构造String类的实例。有多个版本可以从不同的数据类型构造字符串(即将它们格式化为字符序列),包括:

  • 一个常量字符串,用双引号(即char数组)
  • 单个常量字符,单引号
  • String对象的另一个实例
  • 常数整数或长整数
  • 使用指定基数的常量整数或长整数
  • 整数或长整数变量
  • 使用指定基数
  • 的整数或长整数变量
  • 使用指定的小数点
  • 的浮点数或双精度数

答案 2 :(得分:1)

为了解决这个问题,我已经努力了几个小时,但是我终于做到了。这使用了Platformio提供的现代Espressif C ++,我的目标MCU是ESP32。

我想显示一个前缀标签,即float / int值,然后显示单位,全部内联。

我无法使用单独的Serial.print()语句进行中继,因为我使用的是OLED显示屏。

这是我的代码示例:

  int strLenLight = sizeof("Light ADC: 0000");
  int strLenTemp = sizeof("Temp: 000.0 °C");
  int strLenHumd = sizeof("Humd: 00.0 %");

  char displayLight[strLenLight] = "Light ADC: ";
  char displayTemp[strLenTemp] = "Temp: ";
  char displayHumd[strLenHumd] = "Humd: ";

  snprintf(strchr(displayLight, '\0'), sizeof(displayLight), "%d", light_value);
  snprintf(strchr(displayTemp, '\0'), sizeof(displayTemp), "%.1f °C", temperature); 
  snprintf(strchr(displayHumd, '\0'), sizeof(displayHumd), "%.1f %%", humidity); 

  Serial.println(displayLight);
  Serial.println(displayTemp);
  Serial.println(displayHumd);

哪个显示:

Light ADC: 1777
Temp: 25.4 °C
Humd: 55.0 %

答案 3 :(得分:0)

dtostrf()已过时,并非在每个主板核心平台上都存在。 另一方面,sprintf()在AVR平台上没有格式化浮点数!