我使用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)的控制台上打印浮点数?
答案 0 :(得分:1)
您的数据缓冲区太小
char buffr[20];
必须至少(考虑0.0
作为格式输出)
char buffr[38];
小缓冲区导致数组的“写出范围”。这意味着您的Undefined Behavior和a
变量已被污染。
sprintf与printf
不同。
它将所有字符复制到输出缓冲区,您必须为文本和格式说明符添加的所有字符授予空间。
在您的具体案例中:
Float Number ( Using Sprintf) :
- >需要32个字符%3.3f
- >由于345.654
\r\n
- >需要2个字符'\0'
你的缓冲区必须是:
char buffr[42];