使用 arduino::String 打印格式而不是值的双精度字符串?

Double to string with arduino::String prints format instead of value?

提问人:Twagnah 提问时间:8/16/2023 最后编辑:Twagnah 更新时间:8/16/2023 访问量:57

问:

我一直在一个项目中遇到这种情况,我正在做大量的双精度和浮点到字符串的转换,但我已将其缩减为非常小的东西,以展示问题。

void setup() {
  double num = 123456789.12;
  String numString = String(num);
  Serial.print("Num String: ");
  Serial.println(numString.c_str());
}

// outputs
// Num String: %4.2f

我相信有人会看到这个并说,当然,这是预期的行为!但我真的很难理解为什么。我一辈子都无法在使用 Serial.print 的日志记录输出中获得正确格式化、精确、双精度或浮点数打印。我已经尝试过其他字符串转换技术,例如:

template <typename T>
std::string MyStringUtil::ToStringWithPrecision(const T a_value, const int n)
{
    std::stringstream stream;
    stream << std::fixed << std::setprecision(n) << a_value;
    return stream.str();
}

但这也返回了同样的东西,我认为是一个格式字符串,但我可能是错的。

谁能解释一下导致这种输出的机制?就上下文而言,这是在 Sparkfun Redboard Nano 上运行的。

编辑:

void setup() {
  double num = 123456789.12;
  String numString = String(num);
  Serial.print("Num String: ");
  Serial.print(num);
  Serial.print(" | ");
  Serial.println(numString);
}

// outputs
// Num String: 123456789.12 | %4.2f

为了增加上下文,这一切都是使用 Arduino IDE 运行的,输出是通过串行监视器直接从 USB 连接的 Redboard Nano 以 9600 波特率读取的。

字符串 Arduino 精度 Arduino-C++

评论

0赞 Some programmer dude 8/16/2023
两件(不相关的)事情:首先做,即使编译器可能会优化你的复制初始化以直接初始化,你也可以自己做。其次,没有必要按照我的记忆去做。 应该足够了。String numString(num);c_str()Serial.println(numString)
0赞 Some programmer dude 8/16/2023
至于您的问题,除了缺少串行端口设置外,它应该可以工作(假设接收串行端口的设置方式与Arduino串行端口默认配置完全相同)。您看到的不是预期行为。因此,现在您的问题变成了:如何在Arduino和接收站点上设置串行端口?你在接收端做什么,你如何接收字符串以及如何显示它?请编辑您的问题以向我们提供这些详细信息。
0赞 Twagnah 8/16/2023
啊,我明白了,罗杰。还通过健全性检查更新了帖子。
0赞 Twagnah 8/16/2023
好吧,我真的很高兴我不只是疯了。或者至少不是因为这个。我正在通过Arduino IDE在SparkFun Redboard Nano上运行它。只需将其直接推送到红板,然后我发布的输出直接来自串行监视器。它都在默认运行,以 9600 波特率与红板对话。

答: 暂无答案