zapis / cteni promenne ze souboru

cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

zapis / cteni promenne ze souboru

Příspěvek od cz_marek » 15 pro 2021, 21:17

Ahoj, mohli by jste mi prosim poradit - nemuzu se nejak domluvit s tim jak ulozit do souboru promenne a pak je zase precist.
Soubor vytvorim, zapisu do nej ale nejsem pak schopny to precist tak abych ten obsah souboru priradil spravnym promenným.

Mam např 3 proměnné - naplnim je a potřebuji je uložit do souboru a pak je přečíst a hodnoty priradit spravne promenné.

Asi je to pro mistni mistry uplne jednoduche ale nevim co furt delam blbe ze mi to nefunguje :-)

Diky

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: zapis / cteni promenne ze souboru

Příspěvek od kiRRow » 15 pro 2021, 21:33

Data do souboru se ukládají pod nějakou "struktůrou". Jde to třeba tak, že data od sebe oddělíš určitým znakem, nebo počtem byte. Při ukládání rozložené data složíš do nějaké struktůry a při načítání musíš umět tu struktůru zase rozložit. To děláš třeba tak, že načítáš data dokud nedostaneš ukončovací znak, pak víš, že máš celou jednu proměnou a další data načítáš pak do druhé.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: zapis / cteni promenne ze souboru

Příspěvek od martinius96 » 15 pro 2021, 21:34

Aký je to súbor (.csv, .txt)?
Ako vyzerajú dáta, sú nejako formátované?
Čítaš to z nejakého webservera na ktorý sa pripájaš? Alebo je to z SD karty? Aký mikrokontróler používaš?

Štandardne sa robí nejaký oddelovač (terminátor) podľa ktorého sa dáta rozparsujú cez C funkciu strtok(), kde sa ten terminátor použije, napríklad:

Kód: Vybrat vše

Termínator ";" (bodkočiarka), výstup načítaného súboru: 123;456;789
Parser vráti:
variable 1 = 123
variable 2 = 456
variable 3 = 789
Prípadne sú dáta na riadkoch pod sebou a čítaš riadok po riadku, počítaš riadky a vieš na ktorej pozícii si a ktorej premennej máš priradiť hodnotu.

Môžeš si to uložiť aj ako JSON súbor a každej hodnote priradíš kľúč podľa ktorého si konkrétnu hodnotu vyparsuješ.
Funkcia nato v knižnici ArduinoJSON bude na riadok... JSON súbor je super štruktúra, nakoľko si to môžeš ľahko rozširovať. Bežne sú takto uložené napr. konfiguračné a riadiace dáta pre mikrokontróler. Možností ako to urobiť je fakt veľa, záleží najmä na tom, ako tie dáta v súbore vyzerajú, aké sú ich dátové typy.

Príklad JSON dát, ktoré sú vyparsované a následne odoslané po MQTT na Broker do subtopicov pod main topic hladinomer/:
Obrázek

cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Re: zapis / cteni promenne ze souboru

Příspěvek od cz_marek » 15 pro 2021, 22:04

je to txt soubor ulozeny ve spiffs. S tim vytvorenim a otevrenim pro cteni neni problem vypisu si obsah do seriove linky ale nevim prave jak to rozsekat tak abych mel treba

Kód: Vybrat vše

int a = 1;
int b = 1;
int c = 1;
namerim nejakou hodnotu a, b, c, a potrebuji je nejak "strukturovane" ulozit do toho souboru tak abych to mohl pouzit v pripade potreby (resetu) jako vychozi hodnotu pro ty promenne a,b,c ktere se naplnim v setupu

Neumim si poradit s tim strukturovanim zapisu a rozdelenim pri cteni. nepotrebuji nic vic než tři INT promenné

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: zapis / cteni promenne ze souboru

Příspěvek od kiRRow » 16 pro 2021, 09:33

Musíš v tom souboru použít i nějaký oddělovací znak. Třeba zalomení řádku. Když pak při čtení souboru narazíš na konec řádku, tak víš, že jsi načetl první proměnnou a další data patří do jiné proměnné.

Nebo se můžeš kouknout na tohle https://playground.arduino.cc/Code/Struct/ a tohle https://hackingmajenkoblog.wordpress.co ... n-arduino/ . Když do souboru uložíš struktůru dat, tak po načtení těchto dat zpátky do struktůry, se sami rozškatulkují.

Já bych doporučil spíše tu druhou cestu.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: zapis / cteni promenne ze souboru

Příspěvek od ondraN » 16 pro 2021, 09:40

Tak ty inty normálně ulož na extra řádky pomoci println() a pak ze souboru přečti vždycky řádek do stringu a zpracuj funkcí toInt()
https://www.arduino.cc/reference/en/lan ... ons/toint/

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: zapis / cteni promenne ze souboru

Příspěvek od kiRRow » 16 pro 2021, 10:59

Ono i ukládat každou proměnnou do svého vlastního souboru by bylo řešení. Tak trošku kostrbatější, ale určitě funkční.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: zapis / cteni promenne ze souboru

Příspěvek od KamilV » 16 pro 2021, 11:29

A ten soubor se bude někam přenášet nebo ručně editovat, že se to musí lámat přes TXT?
Pokud ne, tak bych uložil binárně 3x int a pak zase 3x int přečetl. Jak to v tom souboru bude fyzicky vypadat mne v takovém případě zajímat nemusí.

P.S. v případě tak malého objemu dat by to šlo i jen do EEPROM. Takže mě to navádí zpět k tomu, že se možná ten soubor bude někde jinde používat, je to tak?

cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Re: zapis / cteni promenne ze souboru

Příspěvek od cz_marek » 16 pro 2021, 16:42

Ne ne ja to chtel pres TXT protoze nic jineho neumim :-)

Opravdu se jedna jen o to ze prubezne se mi meni 3x hodnota INT a tu potrebuji ulozit - ne moc casto ta zmena je treba 1x za den až 1x za týden ale potřebuji aby pri resetu ESPecka se obnovily hodnoty z posledniho "zaznamu".
Pokud by se to dalo udelat jednoduseji tak bych byl urcite rad za kazdou radu. Navic se tim zase neco priucim :-)

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: zapis / cteni promenne ze souboru

Příspěvek od kiRRow » 16 pro 2021, 18:14

Pokud :
Nechceš se nic přiučit, a řešit co nejrychleji, ulož každou hodnotu do svého vlastního souboru co bude obsahovat pouze jeden int.
Pokud se může stát, že jednou těch hodnot bude 5 a po druhé 15. Použij metodu čtení souboru po řádcích, nebo jak jsem psal zastaralejší metodu čtení dokud nenarazím na znak co znamená konec řádku.
Pokud víš že počet hodnot a jejich typ nikdy nebude změněn a chceš mrknout na novou fintu, koukni na to s těma struktůrama. Je to fakt elegantní. Prostě si řekneš, že máš struktůru mojeUlozeneData .... a ta obsahuje 3x int ... a jmenujou se a b c ... prosím uložit na kartu. A stejně naopak to i čteš ... mám mojeUlozeneData, ktere obsahují 3x int ... a chci aby se jmenovaly a b c ... prosím načíst to sem z karty.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 9 hostů