我试图简单地将一个double转换为C中的字符串
?char printable[9];
snprintf(printable, 9, "%f", 30.356145);
Run Code Online (Sandbox Code Playgroud)
应将printtable设置为"30.35614".当我在在线c编译器上运行此代码时,它正确输出.当我在我的微控制器上输出它时,打印等于这个废话:
"\000\033\000\000\001\000\000\000\024"
Run Code Online (Sandbox Code Playgroud)
从输出中可以看出,snprintf立即终止了带有\0字符的字符串,其余部分保持不变.由于数组是在堆栈上分配的而不是零初始化的,因此其余的数组值是不确定的.
正如@ CountMurphy的评论所证实的那样,问题在于使用了C库newlib-nano.
在微控制器上,Flash是宝贵的,printf相关功能是库中最大的功能之一.因此,对嵌入式微控制器,我们倾向于去掉像不必要的东西float和double格式说明处理代码.
该问题通过显式激活浮点printf支持来解决newlib-nano,正如此处和此处的官方资源中所指示的那样.激活支持的一种方法是添加链接器标志
-u _printf_float
Run Code Online (Sandbox Code Playgroud)
到最后的arm-none-eabi-gcc命令.这将强制包含符号/函数_printf_float,随后使%f格式说明符按预期工作.