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
8 Ziffern reichen nicht, denn es muss noch die abschliessende Null \0 ins Array. HTH
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.
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
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 | }
|
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.