我完全不知道如何解决这个问题。我对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的数据表中的信息)转换它们以防万一有人好奇。任何人都可以指出我解决这个问题的方向吗?我遇到的一切都表明我应该获得价值观,而且我不知道在哪里再看。
提前感谢。
这是我的终端读出
转化
答案 0 :(得分:2)
听起来你正在链接一个没有浮点支持的printf
版本。
这通常是嵌入式系统编译器的默认配置,因为它们没有硬件FPU,软件浮点支持使用了大多数应用程序不需要的宝贵空间。
请参阅您正在使用的工具链的文档,以了解是否已讨论此问题。 Link to similar thread for gcc/Arduino
还要考虑是否可以将代码重写为不使用浮点数。
答案 1 :(得分:0)
我正在做的是从IMU读取8位数据并将这些值存储在ax,......等。
我更喜欢8位数据的unsigned char。这个问题有一个打印uint16_t类型数据的答案:Format specifiers for uint8_t, uint16_t, …?
告诉我们有关运行此代码的环境的更多信息。
答案 2 :(得分:0)
我在制作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;
}