在ARM Cortex M0 uart控制台上使用printf()打印浮点数

时间:2016-05-12 07:54:14

标签: c gcc arm embedded atmelstudio

我使用Atmel工作室7中的std C函数printf()配置了Atmel的ARM Cortex M0的UART,用于在控制台上打印字符串和整数。

案例I

我正在尝试使printf()类型的函数打印浮点值,为此我遵循以下建议:

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

以后我在不同时间分别编辑/添加了文本后面的链接器标志:

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

案例II

虽然我无法理解他们所说的一切,但我也遵循了一些建议来编辑这个论坛的makefile。

Printf/Sprintf for float point variables not working

并在makefile中添加了以下文本

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

Makefile Path(Atmel Studio 7,使用ASF): ../ src / ASF / sam0 / utils / make / Makefile.sam.in

现在在main.c中我使用printf()将浮点数打印为:

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控制台应用程序的输出:

案例I

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

案例II

Float Number 1 : 
Float Number ( Using Sprintf) :

有没有人知道配置链接器使printf(),sprintf()或vprintf()能够在Atmel Studio 7中为ARM Cortex M0(SAM B 11)的控制台上打印浮点数?

1 个答案:

答案 0 :(得分:1)

您的数据缓冲区太小

char buffr[20];

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

char buffr[38];

小缓冲区导致数组的“写出范围”。这意味着您的Undefined Behaviora变量已被污染。

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

在您的具体案例中:

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

你的缓冲区必须是:

char buffr[42];