Wenn ist dir nur darum geht RAM zu sparen, kann man auch probieren die Daten mit PROGMEM im Flash abzulegen. Man kann auch structs im Flash ablegen und dann Byte-weise auslesen. Das Auslesen kann man wie ein Byte Array betrachten und danach auf ein struct casten.
Auf SD schreibst du jeden Datensatz in eine eigene Zeile. Da alles durch Komma getrennt ist, kann man dann immer von Linefeed zu Linefeed lesen für die Zeile und von Komma zu Komma für die einzelnen Teile.
Du kannst auch die SdFat Lib verwenden. Die hat mit fgets() eine Methode um eine Zeile auf einmal auszulesen. Da das dann i.d.R. ein String ist, muss man noch die Teil-Strings wieder in Zahlen wandeln. Dafür gibt es Methoden wie atoi() und atof()
Ich habe bei mir nur Zahlen drin, die so aussehen:
071,001,040,008
070,001,041,020
070,-05,045,017
070,007,050,011
Mit SdFat kann ich das dann einfach so lesen (wobei stringBuffer ein globaler Puffer ist):
bool getLine(const char* filename, int line)
{
if(sd.begin())
{
if(file.open(filename, O_READ))
{
int count = 1;
while(file.fgets(stringBuffer, STRING_BUFFER_SIZE) > 0)
{
if(count == line)
break;
count++;
}
file.close();
if(count != line)
return false;
return true;
}
}
return false;
}
Und z.B. so konvertieren:
void getCurveSettings(Curve* curve)
{
if(curve != NULL)
{
curve->tk_max = atoi(strtok(stringBuffer, ","));
curve->ta_min = atoi(strtok(NULL, ","));
curve->tk_min = atoi(strtok(NULL, ","));
curve->ta_max = atoi(strtok(NULL, ","));
}
}
Hier wird der Methode ein Zeiger auf ein struct übergeben. strtok() gibt mir dann immer die Teil-Strings zurück und mit atoi() werden sie in Integer konvertiert. Für Details google die Namen der Funktionen.
Da die Zahlen immer gleich lang sind, könnte man hier auch mit festen Offsets arbeiten und auf strtrok() verzichten, aber so is es flexibler.
Der Code ist wie gesagt für SdFat und nicht die normale Arduino SD Lib. Es gibt hier aber mehrere Wege um hier ans Ziel zu kommen ![]()
P.S.:
Du musst dann aber unbedingt dein struct so ändern, dass es char Arrays enthält und nicht nur Zeiger. Sonst bekommst du Probleme! Die Strings von der SD Karte kann man dann mit strncpy() in das struct kopieren.