2016-05-12 27 views
1

I konfiguriert Atmel ARM Cortex M0 der UART für Druckzeichenfolgen und ganze Zahlen an der Konsole std C Funktion printf() in Atmel Studio 7.Drucken Gleitkommazahl mit printf() am ARM Cortex M0 uart Konsole

Fall der Verwendung ich

ich versuche, printf() Funktionstyp Druck Gleitkommawerte zu machen und für die ich verfolgt folgende Vorschläge zu tun, so:

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

und ich später bearbeitet/die Linker-Flags folgenden Texte getrennt zu verschiedener Zeit hinzugefügt:

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

Fall II

Obwohl ich nicht alles, was sie sagte, verstehen konnte, aber ich einige der Vorschläge gefolgt zu bearbeiten Makefile von diesem Forum auch.

Printf/Sprintf for float point variables not working

und fügte folgenden Text innerhalb der Make-Datei

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

Makefile Pfad (Atmel Studio 7, ASF verwenden): ../src/ASF/sam0/utils/make/Makefile. sam.in

nun in der main.c I printf() verwendet zum Drucken von Gleitkommazahl als:

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); 

Ausgabe auf einer UART-Konsole App .:

Fall I:

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

Fall II:

Float Number 1 : 
Float Number (Using Sprintf) : 

Kennt jemand Linker Konfiguration printf zu machen() , sprintf() oder vprintf() arbeiten zum Drucken von Fließkommazahl auf der Konsole für ARM Cortex M0 (SAM B 11) in Atmel Studio 7?

+0

Einige andere Links, die ich gefolgt, die ich nicht auf die Frage enthalten könnte: [Printf mit Floating-Point-Unterstützung in armgcc] (http://atmel.force.com/support/articles/de_DE/FAQ/Printf-mit-floating-point-support-in-armgcc) [Verwenden von Gleitkommazahlen mit sprintf, gcc-arm-none-eabi, nRF51822] (https://devzone.nordicsemi.com/question/5076/using-floats-with-sprintf-gcc-arm-none-eabi-nrf51822 /) – mrUnfused

Antwort

0

Sie Puffer ist zu klein für Ihre Daten

char buffr[20]; 

zumindest werden müssen (0.0 als Format Ausgabe unter Berücksichtigung)

char buffr[38]; 

Der kleine Puffer bewirkt, dass ein von „außerhalb der Grenzen schreiben“ das Array. Es bedeutet, dass Sie eine Undefined Behavior und a Variable verschmutzt haben.

sprintf ist anders als printf. Es kopiert alle Zeichen in den Ausgabepuffer und Sie müssen Platz für Text und für alle Zeichen, die von Formatbezeichnern hinzugefügt werden.

In Ihrem speziellen Fall:

  • Float Number (Using Sprintf) : -> nimmt 32 Zeichen
  • %3.3f -> dauert 7 Zeichen aufgrund der realen Produktion von 345.654
  • \r\n -> 2 Zeichen nimmt
  • wird eine endgültige Byte für den Nullabschluss benötigt '\0'

Das Ihr Puffer menas sein müssen:

char buffr[42]; 
+0

Die Größe des Arrays wurde erhöht, aber das Problem wurde nicht gelöst? Wenn mindestens 37 Bytes Speicherplatz benötigt wurden, wie diese Strings kamen, um auf der Konsole gedruckt zu werden (wie in beiden Fällen I und II)? – mrUnfused

+0

In Ihrem speziellen Fall benötigen Sie 'char buffr [42];' wie ich beschrieben habe. Was mit dir passiert, ist (wie ich geschrieben habe) [undefiniertes Verhalten] (https://en.wikipedia.org/wiki/Undefined_behavior), was bedeutet, dass die Ausgabe undefiniert ist. – LPs