arduino - parametry na SD
Moderátor: Moderátoři
arduino - parametry na SD
Dobrý den,
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á.
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á.
Jestli to dobře chápu, máš 10 sad o 20 položkách (bytech), takže cca 200 bytů.
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
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
Typově v C řetězec a pole znaků jedno jest a lze je v případě použití obsahu zaměňovat. Řetězec je de facto reprezentován pointerem.
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ě![Sad :(](./images/smilies/icon_sad.gif)
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;
}
Edit: pozdě
![Sad :(](./images/smilies/icon_sad.gif)
Takhle to funguje, zatím s jedním souborem:
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
}
}
Takhle to taky jde, ale je to takový hybrid mezi lidsky čitelným konfiguračním souborem a binárně uloženými daty.
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átnebo
což 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:
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.
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íč = hodnota
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
{
...
}
Hledej a najdeš: http://overskill.alexshu.com/saving-loa ... h-arduino/