我有这个Arduino的草图,
char temperature[10];
float temp = 10.55;
sprintf(temperature,"%f F", temp);
Serial.println(temperature);
温度打印为
? F
你对如何格式化这个float有什么想法吗?我需要它成为一个char字符串。
由于一些性能原因,%f
在Arduino的sprintf()
实现中没有包含。更好的选择是使用dtostrf()
- 将浮点数值转换为C风格的字符串,方法签名如下:
char *dtostrf(double val, signed char width, unsigned char prec, char *s)
使用此方法将其转换为C风格字符串,然后使用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);
您可以更改最小宽度和精度,以匹配您要转换的浮点数。如前所述,Arduino的sprintf
不支持浮点数。
Arduino有自己的String类。
String value = String(3.14);
char *result = value.c_str();
构造一个String类的实例。有多个版本可以从不同的数据类型(即将它们格式化为字符序列)构造字符串,包括:
String(3.1434, 4)
中的第二个参数可以设置小数点后的精度,例如将数字3.1434保留4位小数。 - Orkhan Alikhanov我曾经花费了几个小时来解决这个问题,但最终还是成功了。这里使用的是Platformio提供的现代Espressif C++,我的目标MCU是ESP32。
我想要显示一个前缀标签、浮点/整数值,然后是单位,全部都在一行内。
由于我正在使用OLED显示器,所以无法依赖于单独的Serial.print()语句。
以下是我的代码示例:
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()
已经被弃用,并且并不在每个板子的核心平台上存在。
另一方面,在AVR平台上,sprintf()
无法格式化浮点数!
sprintf()
不支持%f
,但如果需要,可以链接完整版本的sprintf()
。 - Gerhard