2016-05-12 57 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

相關問題