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

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.

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.