arduino - parametry na SD
Moderátor: Moderátoři
arduino - parametry na SD
jak se obvykle realizuje načtení parametrů potřebných pro běh programu uložených na SD?
Napadá mě načíst řetězec, nějak ho rozdělit na jednotlivé hodnoty a ty potom převést na int čísla. Protože jsem toto nikdy neřešil, prosím o radu, jestli je tato myšlenka správná, nebo jestli se to dá řešit elegantněji. Případně nějaký odkaz by také pomohl.
Potřebuji načíst dle výběru sadu asi 20ti hodnot, sad bude cca 10 a vždy se načte pouze ta potřebná.
Můžeš třeba na SD vytvořit 10 různých souborů ( aka 10 sad) a každý bude obsahovat těch 20 různých položek. A otevřeš si jen ten soubor, co potřebuješ a přečteš ho celý.
https://www.arduino.cc/en/Tutorial/ReadWrite
Pokud se ty sady a položky nebudou měnit, tak je můžeš strčit do EEPROM. K těm můžeš přistupovat rovnou.
https://www.arduino.cc/en/Tutorial/EEPROMWrite
https://www.arduino.cc/en/Tutorial/EEPROMRead
Edit: pokud jde o ten vlastní převod, tak třeba ten strtoint
https://www.arduino.cc/en/Tutorial/StringToIntExample
Kód: Vybrat vše
#include "stdio.h"
#include "string.h"
char* str = "ahoj ";
char arr[7] = {'p', 'a', 'r', 'd', 'e', '\n', '\x00'};
int main(int argc, char** argv)
{
printf(str);
printf(arr);
strcpy(arr, str);
strcat(arr, "\n\x00");
printf(arr);
return 0;
}
Přestože typově jsou str a arr stejné, nejsou to stejné objekty. To se projeví například u sizeof(), kdy v našem příkladě sizeof(arr) odevzdá 7 a sizeof(str) odevzdá v 32 bitové architektuře 4, což je velikost pointeru.
Edit: pozdě
Kód: Vybrat vše
void SDread() {
String vRetezci;
int i;
File cteniDat = SD.open("par.txt", FILE_READ); // otevře soubor data.txt
if (cteniDat) // když soubor existuje
{
while (cteniDat.available()) // dokud nebudeme na konci souboru tak:
{
byte data = cteniDat.read(); // přečte jeden bajt (znak) a uloží do proměné data
vRetezci += (char)data;
if (data == ',') { //kdyz nacte carku
nastaveni[m] = vRetezci.toInt(); //zapise int cislo do pole
vRetezci = ""; //vymaze promennou pro dalsi cislo
m = m + 1; //nastavi index pole pro dalsi cislo
}
}
cteniDat.close(); //zavreni souboru
for (i = 0; i < 10; i++) {
Serial.println(nastaveni[i]);
}
m = 0; //pole pri dalsim volani tohoto podprogramu od zacatku
cti = 0; //vypne volani tohoto podprogramu
}
}Pro konfigurační soubory, které mají být přímo editovány člověkem a také být čitelné, se volí například INI formát
Kód: Vybrat vše
klíč1 = hodnota
klíč2 = hodnota2
atd.Kód: Vybrat vše
[sekce]
klíč = hodnotacož ovšem vyžaduje více práce při parsování. Nebo se volí přímo binární zápis celé konfigurační struktury do souboru, což by se pak použilo jako:
Kód: Vybrat vše
typedef struct
{
int item1; // nějaké konfigurační položky
char item2;
float item3;
} ConfigStruct; // deklarace konfigurační struktury
...
ConfigStruct g_config; // definice globáních konfiguračních dat
...
SD.read(&g_config, sizeof(g_config));// přečtení konfigurace
...
if(g_config.item1 == 0) // použití konfigurace
{
...
}
Pokud není potřeba rozlišovat mezi položkami podle jejich názvu, je to jen sada 20 hodnot a to 10x, nedělal bych to do 10 souborů, ale do 10 řádek jednoho souboru. Potřebná řádka se vyhledá pomocí detekce znaku odřádkování (\n) a pak už se čte stejně, jak to máte.