Hallo Zusammen,
brauche eure Unterstützung um meinen Knoten im Hirn zu beseitigen.
Zur Historie:
Ich habe ein kleines Sensorboard mit einem ATMega1284p gebaut. Alle
Sensordaten auf dem Board sind vom Typ int (weil die Temperatur negativ
sein kann). Ich verwende die Funktion itoa, um die Daten in ein char
array zu überführen und per BLE (UART) an meine Handy-App zu übertragen,
was auch wunderbar funktioniert.
Jetzt möchte ich die Daten auf dem Sensorboard noch auf einer
microSD-Karte aufzeichnen. Hierzu verwende ich die Bib von
http://www.mikrocontroller.net/articles/AVR_FAT32, was grundlegend auch
funktioniert. Allerdings verwenden die Bibliotheksfunktionen zum Lesen
und Schreiben durchweg den Datentyp uint8_t.
Aus file.c:
1 | uint8_t ffread(void)
|
2 | void ffwrites( uint8_t *s )
|
Damit die SD-Kartenfunktionalität in mein bisheriges Programm integriert
werden kann, brauche ich nun CODE, welcher ein char-array in uint8_t[]
zum Schreiben und beim Lesen wieder zurück convertiert/castet, um den
"differ in signdeness" Meldungen zu entgehen.
Mein Knoten besteht nun darin, dass ich mir nicht ganz sicher bin, ob
ich durch das "hinundhercasten/convertieren" von Datentypen ungewollte
Probleme bekommen kann bzw ob das nicht eleganter gelöst werden könnte.
Derzeit sieht der CODE wie folgt aus und wird auch ohne Fehlermeldungen
compiliert (AVR Studio 4.19 Build 730):
1 | char write_buffer[16] = "";
|
2 | uint8_t read_buffer [16] = "";
|
3 | uint8_t *ptr_read_buffer = read_buffer;
|
4 |
|
5 |
|
6 | int temp = -99; //beispielhaft ausgelesene Temperatur von Sensor
|
7 | itoa(temp,write_buffer,10); //wandeln in char array und speichern in write_buffer
|
8 |
|
9 | // ------------------------------
|
10 | // das array auf 15-Zeichen füllen (für den hier nicht gegebenen Rest meines Programms erforderlich!)
|
11 | write_buffer[14] = write_buffer[2];
|
12 | write_buffer[13] = write_buffer[1];
|
13 | write_buffer[12] = write_buffer[0];
|
14 | int ii;
|
15 | for (ii=0;ii<12;ii++){
|
16 | write_buffer[ii] = '0';
|
17 | }
|
18 | write_buffer[15] = '\0';
|
19 |
|
20 | // -> 000000000000-99 in write_buffer
|
21 | // ------------------------------
|
22 |
|
23 | // zum Schreiben: char -> uint8_t
|
24 | uint8_t *convert_write_data;
|
25 | convert_write_data=(uint8_t*) &write_buffer;
|
26 |
|
27 | //schreibe Daten in Datei tempmax_file
|
28 | write_to_file(tempmax_file, convert_write_data); // verwendet: void ffwrites( uint8_t *s )
|
29 |
|
30 | //lese geschriebene Daten (Zeichen 0 bis 14) und schreibe diese in read_buffer
|
31 | read_from_file(tempmax_file, 0, 14, ptr_read_buffer); // verwendet: uint8_t ffread(void)
|
32 |
|
33 | // Für BLE/UART-Ausgabe: uint8_t -> char
|
34 | char *convert_read_data;
|
35 | convert_read_data = (char*) &read_buffer;
|
36 |
|
37 |
|
38 |
|
39 | debug_string_send("von SDCard gelesen: "); // eigene Funktion zum Senden von Strings per UART
|
40 | debug_string_sendln(convert_read_data); // Funktion wie oben nur mit LF und CR
|
41 |
|
42 | // Ausgabe:
|
43 | // von SDCard gelesen: 000000000000-99
|
Der Code funktioniert wie gesagt wie gewollt, allerdings hatte ich
diesen Fall von "Typumwandlungen" bisher noch nie gebraucht, daher bin
ich mir unsicher ob das IMMER so funktioniert wie ich mir das erhoffe.
Würde mich sehr freuen wenn mir jemand ein Feedback zukommen lassen
könnte.
Liebe Grüße
Alex