Stránka 1 z 1
arduino - parametry na SD
Napsal: 12 zář 2017, 08:38
od ok1f
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á.
Napsal: 12 zář 2017, 08:49
od microlan
V jakém jazyku? V C je to tuším funkce strtoint()
Napsal: 12 zář 2017, 08:51
od popopepe
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
Napsal: 12 zář 2017, 09:09
od ok1f
Díky pánové za informace. Nastuduji, odzkouším.
Napsal: 12 zář 2017, 09:14
od popopepe
text na číslo je ta funkce StrtoInt(). Na webu najdeš milion příkladů...
Napsal: 12 zář 2017, 09:26
od ok1f
Ještě jednou dík
Napsal: 12 zář 2017, 10:53
od ok1f
A když potřebuji dostat řetězec do pole? Je na to nějaká funkce?
Napsal: 12 zář 2017, 11:22
od popopepe
Napsal: 12 zář 2017, 11:26
od mtajovsky
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.
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ě

Napsal: 12 zář 2017, 15:52
od ok1f
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
}
}
Napsal: 12 zář 2017, 16:48
od mtajovsky
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át
Kód: Vybrat vše
klíč1 = hodnota
klíč2 = hodnota2
atd.
nebo
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:
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.
Napsal: 12 zář 2017, 17:51
od rnbw
Pre Arduino urcite existuje kniznica na INI subory.
Napsal: 16 zář 2017, 13:33
od LukinoOl
Napsal: 26 zář 2017, 14:15
od ok1f
Mám to zabudované ve svém programu a je to paráda. Přehledné řešení jednoduché na použití. Díky moc všem.