关于C ++:Arduino sprintf float不格式化

Arduino sprintf float not formatting

我有这个arduino草图,

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

温度打印为

1
? F

对如何格式化此浮动有任何想法吗? 我需要它是一个char字符串。


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

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

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

1
2
3
4
5
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);

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


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

弦类

Arduino有自己的String类。

1
String value = String(3.14);

然后,

1
char *result = value.c_str();

字符串类参考,上面的链接

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

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


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