Arduino sprintf float 未格式化

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

我有这个arduino草图,

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

温度打印为

? F

关于如何格式化这个浮动有什么想法吗?我需要它是一个字符串。

c++ arduino printf
5个回答
145
投票

由于某些性能原因,

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

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

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

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);

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


9
投票

正如之前所述,Arduino 上的

sprintf
中不包含 Float 支持。

字符串类

Arduino 有自己的 String 类。

String value = String(3.14);

那么,

char *result = value.c_str();

String 类参考,上面的链接

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

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

2
投票

我努力了几个小时才把这件事做好,但我终于做到了。这使用 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 %

0
投票

dtostrf()
已弃用,并且它并不存在于每个板核心平台上。 另一方面,
sprintf()
不会在 AVR 平台上格式化浮动!


0
投票

在项目已编译的临时目录中打开*.map-文件。查看 sprintf-function 是从哪个库加载的。如果是libc_s.a,则可以在附近找到libc.a。如果您重命名 libc_s.a 并从 libc.a 建立符号链接,您可以获得完整版本的 sprintf。

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