arduino - parametry na SD

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

arduino - parametry na SD

#1 Příspěvek 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á.

Uživatelský avatar
microlan
Příspěvky: 1646
Registrován: 09 kvě 2017, 02:00
Bydliště: Kósek vod Brna

#2 Příspěvek od microlan »

V jakém jazyku? V C je to tuším funkce strtoint()

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#3 Příspěvek 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

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#4 Příspěvek od ok1f »

Díky pánové za informace. Nastuduji, odzkouším.
Naposledy upravil(a) ok1f dne 12 zář 2017, 09:24, celkem upraveno 1 x.

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#5 Příspěvek od popopepe »

text na číslo je ta funkce StrtoInt(). Na webu najdeš milion příkladů...

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#6 Příspěvek od ok1f »

Ještě jednou dík

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#7 Příspěvek od ok1f »

A když potřebuji dostat řetězec do pole? Je na to nějaká funkce?

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#8 Příspěvek od popopepe »


Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#9 Příspěvek 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ě :(

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#10 Příspěvek 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     
  }

}

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#11 Příspěvek 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

Kód: Vybrat vše

[sekce]
klíč = hodnota
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.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#12 Příspěvek od rnbw »

Pre Arduino urcite existuje kniznica na INI subory.

Uživatelský avatar
LukinoOl
Příspěvky: 66
Registrován: 09 čer 2016, 02:00

#13 Příspěvek od LukinoOl »


Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#14 Příspěvek 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.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“