Funkcja sprintf nie działa z liczbami typu float.

0

Funkcja z liczbami typu int działa poprawnie:

 
uint8_t pi = (uint8_t)M_PI;
sprintf(tx_buffer, "Value of PI = %d", pi);
DMA_Cmd(DMA1_Stream6, ENABLE);

A na terminalu dostajemy coś takiego:

Value of PI = 3 

Natomiast z liczbami typu float działa ale tylko troche:

 
sprintf(tx_buffer, "Value of PI = %f", M_PI);
DMA_Cmd(DMA1_Stream6, ENABLE);

Na terminalu dostajemy coś takiego:

Value of PI = 

Nie widać wartości liczby PI. Komunikacja z terminalem na pewno działa poprawnie.

1

Sprawdź w dokumentacji czy jest to wspierane i czy nie potrzebujesz czegoś zdefiniować/dolinkować.

1

Czym kompilujesz ten program? Jaki procesor? Jakiej biblioteki C używasz? Bardzo możliwe, że biblioteka C ma wyłączoną obsługę float, aby nie marnować flasha. Działa jak zrobisz %Lf?

0

M_PI jest definiowane jako #define M_PI 3.14159265358979323846 czyli literał typu double, a ten typ wymaga formatu "%lf".

0

Dobra jedynie wyjaśnienie jakie teraz widzę, to że twój tx_buffer wskazuje na niewłaściwy fragment pamięci lub pamięć ta jet za mała, albo czymś innym nadpisujesz ten string.
Pokaż dokładnie czym jest ten twój tx_buffer i jak drukujesz dane na konsolę.
A tak ogólnie pokaż więcej kontekstu tego kodu.

0

"%lf" nic nie zmieniło. Środowisko to Coocox, a mikrokontroler STM32F4. tx_buffer jest tablicą typu char o rozmiarze 80 elementów.

#define TX_BUFFER_SIZE 80

char tx_buffer[TX_BUFFER_SIZE];

Stringa wysyłam na terminal za pomocą DMa

while(1)
    {
    	if(flag_1s)
    	{
    		LED_ON(BLUE);
    		int n = sprintf(tx_buffer, "Value of PI = %lf\r\n",M_PI);
    		DMA_Cmd(DMA1_Stream6, ENABLE);
    		LED_OFF(BLUE);
    		flag_1s = 0;
    	}
    } 

tx_buffer używam tylko w pętli głównej i raczej nie ma możliwości abym gdzie go nadpisał.

0

To zdaje się tutaj http://www.coocox.org/forum/viewtopic.php?f=2&t=346 jest rozwiązanie, spróbuj.

Stack aligned, and that failure to do so would cause the problem.

According to ARM AAPCS:

"5.2.1.2 Stack constraints at a public interface

The stack must also conform to the following constraint at a public

interface:

SP mod 8 = 0. The stack must be double-word aligned."

It seems a little odd that sprint would fail when the stack was more highly aligned;

So, in the startup code startup_LPC17xx.c:

  1. makesure STACK_SIZE is even.

  2. change The initial stack pointer in the vector table:

(void )&pulStack[STACK_SIZE-1],

to

(void ()(void))((unsigned long)pulStack + sizeof(pulStack)),

Reference:

  1. CodeSourcery > mailing list:[arm-gnu] sprintf issue on Cortex-M3
    http://www.codesourcery.com/archives/arm-gnu/msg03115.html
  2. Procedure Call Standard for the ARM Architecture:
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

1 użytkowników online, w tym zalogowanych: 0, gości: 1