2

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

案例一

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

arm-none-eabi-gcc :使用 printf 打印浮点数

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

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

案例二

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

浮点变量的 Printf/Sprintf 不起作用

并在makefile中添加了以下文本

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

生成文件路径(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 控制台应用程序上输出:

案例一

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) 的控制台上打印浮点数?

4

1 回答 1

1

您的缓冲区对于您的数据来说太小了

char buffr[20];

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

char buffr[38];

小缓冲区导致数组“写入越界”。这意味着您有未定义的行为并且a变量被污染。

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

在您的具体情况下:

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

那意味着您的缓冲区必须是:

char buffr[42];
于 2016-05-12T08:21:10.040 回答