Forum: Mikrocontroller und Digitale Elektronik Problem mit sprintf Funktion.


von Basti (Gast)


Lesenswert?

Nabend,

ich bräuchte mal eure Hilfe! Es geht darum das mir mein Programm das 
Spektrum von einem Eingangssignal berechnet. Das Ergebnis legt wird dann 
im Floatarray 'spektrum[FFT_SIZE]' gespeichert. Da es sich um Daten
vom Typ Float handelt, hat jeder Wert eine Länge von 32Bit. Diese Daten 
möchte ich nun in ein 8Bit Array vom Typ char umwandeln und per UART an 
den PC senden.
Um das zu realisieren möchte ich die Funktion 'sprintf' nutzen.
Die Syntax der Funktion ist in der Hilfe folgendermaßen beschrieben:

-----------------
Synopsis
#include <stdio.h>

int sprintf (char *str, const char *format, /* args */...);
-----------------

Im folgenden der betreffende Programmausschnitt, in dem hoffentlich alle 
essentiellen Angaben enthalten sind ;)



define FFT_SIZE 1024

float spektrum[FFT_SIZE];    // In dem Array stehen die 32Bit Ergebnisse
char  spektrum_senden[FFT_SIZE];  // 8 Bit Array zum Senden der Daten
int i;



void uartfft(char*spektrum_senden){

  for (i=0; i<FFT_SIZE; i++)
        {
          do {;}          // Wait for the UART transmitter to be ready
          while ((*pUART0LSR & UARTTHRE) == 0);

          sprintf(spektrum_senden,"%8x",&spektrum[i]);
          *pUART0THR = spektrum_senden;      //Übertragung von 8 Bit

        }

}


Wenn ich die Umwandlung so mache, dann sendet er mir genau 1024 mal eine 
'0' zum PC.
Wo liegt der Fehler? Ich hoffe ihr könnt mir helfen.

Vielen Dank schonmal!



Gruß Basti


P.s.: Ziel ist ein SHARC DSP von Analog Devices

von Jorge (Gast)


Lesenswert?

8 Ziffern reichen nicht, denn es muss noch die abschliessende Null \0 
ins Array.

HTH

von Jorge (Gast)


Lesenswert?

Ach ich nochmal.

Das char-Array muss in deinem Fall nur 9 Elemente aufnehmen und nicht 
FFT-SIZE. Du möchtest die floats Sedezimal (HEX) ausgeben (???). Dann 
fehlt natürlich noch ein Delimiterzeichen etwas wie ein Space oder ":".

Deine Lösung:

char  spektrum_senden[10];  // 8 Bit Array zum Senden der Daten

sprintf(spektrum_senden,"%8x ",&spektrum[i]);

mit einem Space als Delimiter.

von Basti (Gast)


Lesenswert?

Gut Danke für den Hinweis!
Ich werd das mal ändern, aber eigentlich müsste er dann doch wenigestens 
grob die Daten senden, oder?
Also kann ich schonmal davon ausgehen, dass der Aufbau richtig ist. 
Oder?


Gruß Basti

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du bist zu schweigsam, was pUART0THR sein soll.

Wenn es nur ein Zeiger auf ein zu sendendes Zeichen ist (was ich stark 
vermute, wenn du nur ein Zeichen empfängst), dann ersetze
1
          *pUART0THR = spektrum_senden;      //Übertragung von 8 Bit

durch
1
  {
2
    int i;
3
    for (i = 0; i < 8; i++)
4
      *pUART0THR = spektrum_senden[i];
5
    // ggf. hier noch Trennzeichen senden
6
  }

von Stefan B. (stefan) Benutzerseite


Lesenswert?

ADD:

Natürlich steht dann dein Warten-bis-UART-ready Code an der falschen 
Stelle. Der muss dann unmittelbar vor die Sendeaktion (d.h. die 
Zuweisung an *pUART0THR).

ADD2:

Was du da ausgibst, sind auch nicht die Float-Werte der FFT, sondern 
deren Adressen (wg. &), d.h. wo die Float-Werte gespeichert sind. Das & 
im sprintf ist zuviel.
1
define FFT_SIZE 1024
2
float spektrum[FFT_SIZE];    // In dem Array stehen die 32Bit Ergebnisse
3
char  spektrum_senden[9];    // 8 Bit Array zum Senden der Daten
4
int i;
5
6
void uartfft(char*spektrum_senden)
7
{
8
  
9
  for (i=0; i<FFT_SIZE; i++)
10
  {
11
    sprintf(spektrum_senden,"%8x", (unsigned long) spektrum[i]);
12
13
    {
14
      int i;
15
      for (i = 0; i < 8; i++)
16
      {
17
        do {;}          // Wait for the UART transmitter to be ready
18
        while ((*pUART0LSR & UARTTHRE) == 0);
19
        *pUART0THR = spektrum_senden[i]; //Übertragung von 8 Bit
20
      }
21
      // ggf. hier noch Trennzeichen senden
22
    }
23
  }
24
}

von Basti (Gast)


Lesenswert?

Danke Stefan!

Richtig, "UART0THR" ist ein Register, welches die Daten (8Bit) sendet. 
Mein Problem war das ich meine 32Bit float Werte nicht über die serielle 
Schnittstelle bekommen habe, was ja auch logisch ist.
Da im Display, in der Höhe, etwa 220 Punkte zur Verfügung stehen, 
genügen auch locker 256Punkte - also 8Bit. Aus diesem Grunde musste ich 
die Daten konvertieren.
Soweit ich das sehe müsste der Code jetzt passen, werde ich morgen 
gleich testen. Vielen Dank Jorge & Stefan!


Schönen Abend noch1
Basti


P.s.: Falls nicht schrei ich morgen nochmal ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.