使用 %f 打印双精度变量,终端显示“?”
printing a double variable with %f and the terminal is displaying a "?"
我完全不知道如何处理这个问题。我不是很熟悉 c 语言,但我知道足以为控制项目编写我的 Atmel MCU。我 运行 遇到了一个问题,我尝试打印双变量,但我得到的只是问号而不是值。这是一些代码:
axg = ax/MPU6050_AXGAIN;
ayg = ay/MPU6050_AYGAIN;
azg = az/MPU6050_AZGAIN;
gxds = gx/MPU6050_GXGAIN;
gyds = gy/MPU6050_GYGAIN;
gzds = gz/MPU6050_GZGAIN;
printf("converted\n\n");
printf(" %f;\n\n %f;\n\n %f;\n\n %f;\n\n %f;\n\n f;\n\n",axg,ayg,azg,gxds,gyds,gzds);
所有打印的变量都定义为双精度。 ax,ay,ay,gx,gy,gz 都是 uint16_t 个变量。我正在做的是从 IMU 读取 8 位数据并将这些值存储在 ax 等中。然后我需要根据我的 IMU 数据表中的信息转换它们(MPU 6050,以防有人好奇)。谁能指出我解决这个问题的方向?我遇到的一切都表明我应该获得价值,但我不知道该去哪里寻找。
提前致谢。
这是我的终端读出的
converted
?;
?;
?;
?;
?;
?;
What I am doing is reading 8 bit data from an IMU and storing those values in ax,... etc.
对于 8 位数据,我更喜欢 unsigned char。这个问题有打印 uint16_t 类型数据的答案:Format specifiers for uint8_t, uint16_t, …?
告诉我们更多关于您的环境的信息 运行 此代码。
听起来您链接的 printf
版本不支持浮点数。
这通常是嵌入式系统编译器的默认配置,因为它们没有硬件 FPU,软件浮点支持使用大多数应用程序不需要的宝贵 space。
查阅您正在使用的工具链的文档,看看是否讨论了这个问题。 Link to similar thread for gcc/Arduino
还要考虑您的代码是否可以重写为不使用浮点数。
我在开发 AVR 时遇到过类似的问题。
因为我是为了调试目的而实现它并且代码片段不会成为实际源代码的一部分,所以我没有在编译器及其优化级别和其他依赖项上投入太多,因为它可能会在其他地方引起问题优化级别已更改。
所以这个修复对我有用。
#include<stdio.h>
#include<string.h>
void foo(float fl_value, float fl_limit)
{
char str[20];
memset(str, 0, 20);
sprintf(str, "%0.2f", fl_value);
sprintf(str+4, " %0.2f", fl_limit);
printf(str);
}
int main(void)
{
foo(5.4, 10.8);
return 0;
}
我完全不知道如何处理这个问题。我不是很熟悉 c 语言,但我知道足以为控制项目编写我的 Atmel MCU。我 运行 遇到了一个问题,我尝试打印双变量,但我得到的只是问号而不是值。这是一些代码:
axg = ax/MPU6050_AXGAIN;
ayg = ay/MPU6050_AYGAIN;
azg = az/MPU6050_AZGAIN;
gxds = gx/MPU6050_GXGAIN;
gyds = gy/MPU6050_GYGAIN;
gzds = gz/MPU6050_GZGAIN;
printf("converted\n\n");
printf(" %f;\n\n %f;\n\n %f;\n\n %f;\n\n %f;\n\n f;\n\n",axg,ayg,azg,gxds,gyds,gzds);
所有打印的变量都定义为双精度。 ax,ay,ay,gx,gy,gz 都是 uint16_t 个变量。我正在做的是从 IMU 读取 8 位数据并将这些值存储在 ax 等中。然后我需要根据我的 IMU 数据表中的信息转换它们(MPU 6050,以防有人好奇)。谁能指出我解决这个问题的方向?我遇到的一切都表明我应该获得价值,但我不知道该去哪里寻找。
提前致谢。
这是我的终端读出的
converted
?;
?;
?;
?;
?;
?;
What I am doing is reading 8 bit data from an IMU and storing those values in ax,... etc.
对于 8 位数据,我更喜欢 unsigned char。这个问题有打印 uint16_t 类型数据的答案:Format specifiers for uint8_t, uint16_t, …?
告诉我们更多关于您的环境的信息 运行 此代码。
听起来您链接的 printf
版本不支持浮点数。
这通常是嵌入式系统编译器的默认配置,因为它们没有硬件 FPU,软件浮点支持使用大多数应用程序不需要的宝贵 space。
查阅您正在使用的工具链的文档,看看是否讨论了这个问题。 Link to similar thread for gcc/Arduino
还要考虑您的代码是否可以重写为不使用浮点数。
我在开发 AVR 时遇到过类似的问题。 因为我是为了调试目的而实现它并且代码片段不会成为实际源代码的一部分,所以我没有在编译器及其优化级别和其他依赖项上投入太多,因为它可能会在其他地方引起问题优化级别已更改。 所以这个修复对我有用。
#include<stdio.h>
#include<string.h>
void foo(float fl_value, float fl_limit)
{
char str[20];
memset(str, 0, 20);
sprintf(str, "%0.2f", fl_value);
sprintf(str+4, " %0.2f", fl_limit);
printf(str);
}
int main(void)
{
foo(5.4, 10.8);
return 0;
}