2016-05-12 53 views
1

我配置了Atmel的ARM的Cortex M0的UART在控制台打印字符串和整数使用std C函数printf()的爱特梅尔工作室7打印在ARM的Cortex M0 UART控制台中使用printf()的浮点数

案例我

我试图让printf()的函数型打印浮点值,并为我跟着以下的建议可以这样做:

arm-none-eabi-gcc : Printing float number using printf

,后来我编辑/在不同的时间分别添加下列文本链接标志:

-lc -u _printf_float 
-lc -lrdimon -u _printf_float 

案例二

虽然我听不懂他们说的一切,但我跟一些建议编辑makefile也来自这个论坛。

Printf/Sprintf for float point variables not working

并添加以下文本生成文件内

ldflags-gnu-y += -lc -u _printf_float 

生成文件路径(爱特梅尔工作室7,使用ASF):../src/ASF/sam0/utils/make/Makefile。 sam.in

现在我用printf()的用于打印浮点数作为main.c中:

float a = 345.65412; 
char buffr[20];   
/* --- Print Float using printf only --- */ 
printf("Float Number 1 : %f\r\n", a); 
/* --- Print Float using sprintf ---*/ 
sprintf(buffr, "Float Number (Using Sprintf) : %3.3f\r\n", a); 
printf(buffr); 

输出在UART控制台应用程序:

案例一

Float Number 1 : 2.000000 
Float Number (Using Sprintf) : -0.000 

案例二

Float Number 1 : 
Float Number (Using Sprintf) : 

有谁知道配置连接,使的printf() ,sprintf()或vprintf()用于在Atmel Studio 7的ARM Cortex M0(SAM B 11)控制台上打印浮点数?

+0

其他一些环节我也跟着,我可以不上的问题包括: [printf的与armgcc支持浮点运算(http://atmel.force.com/support/articles/en_US/FAQ/Printf-with-floating-point-support-in-armgcc) [使用sprintf,gcc-arm-none-eabi,nRF51822](https://devzone.nordicsemi.com/question/5076/using-floats-with-sprintf-gcc-arm-none-eabi-nrf51822 /) – mrUnfused

回答

0

你的缓冲区太小,为您的数据

char buffr[20]; 

必须至少(考虑0.0作为格式输出)

char buffr[38]; 

小缓冲区导致“写出界”的阵列。这意味着你有一个Undefined Behaviora变量被污染。

sprintf不同于printf。 它将所有字符复制到输出缓冲区,并且您必须为文本和将由格式说明符添加的所有字符授予空间。

在您的特定情况:

  • Float Number (Using Sprintf) : - >需要32个字符
  • %3.3f - >需要7个字符由于345.654
  • \r\n实际输出 - >需要2个字符
  • 空终止符需要最后一个字节'\0'

这menas你的缓冲区必须是:

char buffr[42]; 
+0

增加了数组的大小,但问题没有解决? 如果需要至少37个字节的空间,那么这些字符串是如何在控制台上打印的(如同在I和II中一样)? – mrUnfused

+0

在你的具体情况下,你需要'char buffr [42];'正如我所描述的那样。顺便说一句,发生在你身上的是(正如我写的)[未定义的行为](https://en.wikipedia.org/wiki/Undefined_behavior),这意味着输出是未定义的。 – LPs

相关问题