我有这个arduino草图,
char temperature[10];
float temp = 10.55;
sprintf(temperature,"%f F", temp);
Serial.println(temperature);
温度打印为
? F
关于如何格式化这个浮动有什么想法吗?我需要它是一个字符串。
由于某些性能原因,
%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);
您可以更改最小宽度和精度以匹配您要转换的浮点数。
正如之前所述,Arduino 上的
sprintf
中不包含 Float 支持。
Arduino 有自己的 String 类。
String value = String(3.14);
那么,
char *result = value.c_str();
构造 String 类的实例。有多个版本可以从不同的数据类型构造字符串(即将它们格式化为字符序列),包括:
我努力了几个小时才把这件事做好,但我终于做到了。这使用 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 %
dtostrf()
已弃用,并且它并不存在于每个板核心平台上。
另一方面,sprintf()
不会在 AVR 平台上格式化浮动!
在项目已编译的临时目录中打开*.map-文件。查看 sprintf-function 是从哪个库加载的。如果是libc_s.a,则可以在附近找到libc.a。如果您重命名 libc_s.a 并从 libc.a 建立符号链接,您可以获得完整版本的 sprintf。