代码之家  ›  专栏  ›  技术社区  ›  CountMurphy

snprintf在微控制器上打印乱码,但在其他环境中也可以

arm c
  •  0
  • CountMurphy  · 技术社区  · 8 年前

    我试图简单地将C中的double转换为字符串

    
char printable[9];
    
    snprintf(printable, 9, "%f", 30.356145);
    

    应将printable设置为“30.35614”。当我运行此代码时 on an online c compiler 输出正确。当我在我的微控制器上输出它时,可打印的数据等于这个胡说八道:

    "\000\033\000\000\001\000\000\000\024"
    
    1. 为什么我要得到这些垃圾数据?
    2. 这是什么垃圾数据?
    3. 如何让snprintf正常工作?
    1 回复  |  直到 8 年前
        1
  •  7
  •   Maximilian Gerhardt    8 年前

    从输出可以看出 snprintf 立即终止字符串 \0 角色,其余部分保持不变。由于数组是在堆栈上分配的,并且没有初始化为零,因此其余的数组值是不确定的。

    正如@CountMurphy的评论所证实的,问题是C库 newlib-nano 已使用。

    在微控制器上,闪存非常宝贵 printf 相关功能是图书馆最大的功能之一。因此,在嵌入式微控制器上,我们倾向于去掉不必要的东西,如 float 和 double 格式说明符处理代码。

    该问题通过显式激活浮点来解决 打印F 中的支持 newlib纳米 ,如官方资源中所述 here 和 here 。激活支持的一种方法是添加链接器标志

    -u _printf_float
    

    进入决赛 arm-none-eabi-gcc 命令这将强制包含符号/功能 _printf_float 随后 %f 格式说明符按预期工作。