Arduino ESP8266 sscanf 可以处理 %lld 吗?

Can Arduino ESP8266 sscanf handle %lld?

我在使用 Arduino ESP8266 和 sscanf 函数时遇到问题。我正在尝试从我从串行端口收到的字符串中解析一个 64 位整数,如下所示:

int64_t temp_freq = 0;
sscanf(buffer, "FOUT = %lld Hz\r\n", &temp_freq);

编辑:我也试过`"FOUT = %" SCNd64 " Hz\r\n",结果相同

我知道我从串行端口得到了正确的字符串,因为我的代码检查我是否收到了特定类型的消息被触发并且是 运行。

我还可以确认 %lld 正在与 Serial.printf() 一起使用,所以我假设它也适用于 sscanf

但是,如果字符串中的值 > 2^31 - 1,我会将 2^31 - 1 写入我的 int64_t 变量。因此,例如 "FOUT = 18010000000 Hz\r\n" 在我的 int64_t 变量中给出 2,147,483,647。

我是在使用 sscanf 不正确,还是在平台上没有正确实施?

我同时使用以下方法作为解决方法:

int64_t temp_freq = 0;
char temp_buf[30] = {0x00};
sscanf(buffer, "FOUT = %s Hz\r\n", &temp_buf);
for (int i = 0; i < strlen(temp_buf); ++i) {
  temp_freq *= 10;
  temp_freq += temp_buf[i] - '0';
}

但我宁愿采用标准的工作方式和正确的方式,以免我不得不在任何地方维护我的手动解决方案。

PS:我标记为 C++ 和 C,因为它在技术上是 Arduino 上的 C++,但我编写的代码看起来更像 C 并使用 C 的 sscanf 而不是 stringstream 或 C++ 中的类似内容。

is it simply not implemented correctly on the platform?

您的工具链正在使用 newlib 作为 C 标准库实现,而且您很可能正在使用它的 nano 版本。 Newlib-nano 在 printf/scanf 系列函数中没有 long long 支持。

您可以:

  • 使用完整的 newlib 版本而不是 nano 版本。在 gcc 编译器的情况下 不要 -specs=nano.specs-lnano 传递给您的编译器选项。
  • 使用不同的标准库或在启用选项的情况下重新编译 newlib。
  • 自己重新实现所需的功能。

请注意,将 %lldint64_t 一起使用在技术上可能是错误的 - 您应该使用 inttypes.h 中的 SCNd64