www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit sprintf Funktion.


Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jorge (Gast)
Datum:

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

HTH

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

          *pUART0THR = spektrum_senden;      //Übertragung von 8 Bit


durch

  {
    int i;
    for (i = 0; i < 8; i++)
      *pUART0THR = spektrum_senden[i];
    // ggf. hier noch Trennzeichen senden
  }


Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

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

void uartfft(char*spektrum_senden)
{
  
  for (i=0; i<FFT_SIZE; i++)
  {
    sprintf(spektrum_senden,"%8x", (unsigned long) spektrum[i]);

    {
      int i;
      for (i = 0; i < 8; i++)
      {
        do {;}          // Wait for the UART transmitter to be ready
        while ((*pUART0LSR & UARTTHRE) == 0);
        *pUART0THR = spektrum_senden[i]; //Übertragung von 8 Bit
      }
      // ggf. hier noch Trennzeichen senden
    }
  }
}


Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.