Uložení a čtení řetězce

Odpovědět
Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Uložení a čtení řetězce

Příspěvek od Ludek » 14 pro 2019, 10:46

Zdravím a nevím, jestli se dobře vyjádřím.
Čtu po RS485 teploměry. To funguje. Ale potřebuji, aby se teploměr přečetl a uložil do paměti (SRAM nikoli EEPROM).
EEPROM by brzy chcípla... A to třeba 3 čidla :-)
A až budu chtít, tak si to umět přečíst, ale pouze tu teplotu. Né celý řetězec, co on pošle.
Příklad: oslovím čidlo a ono pošle 11 znaků : " *B60+023,6C " a kod 13 a to chci uložit do paměti s názvem.
a pak přečíst pouze 236 jako int. Dokázal by někdo poradit?

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

Re: Uložení a čtení řetězce

Příspěvek od kiRRow » 14 pro 2019, 11:31

Řetězec čteš po znacích a pamatuješ si na kterém znaku jsi. Až dojde k znaku, který prezentuje desetinu stupně, uložíš si ho. Další znak je čárka, přeskočíš. Další znak jsou jednotky stupně, ten vynásobíš 10 a přičteš k dříve uloženému. Další znak jsou desítky stupňů, ten vynásobíš 100 a přičteš. Stovky stupňů, vynásobit 1000, přičíst. Ještě bych se mrknul na další znak, protože tam vidím + ... mohlo by tam ale být i - ( to bych pak musel celý ten sčítaný výsledek vynásobit -1 )
mno a tak nějak teoreticky dostaneš z B60+023,6C hodnotu 236

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Uložení a čtení řetězce

Příspěvek od AstroMiK » 14 pro 2019, 11:49

Pro Stringy se dají použít funkce "substring()" a "toInt()".
https://www.arduino.cc/reference/en/lan ... ons/toint/
https://www.arduino.cc/en/Tutorial/StringSubstring


Pro příklad, který jsi uvedl by mohlo fungovat tohle:

Kód: Vybrat vše

//----------------
    Serial.begin(9600);

    
    String retezec = " *B60+023,6C ";

    Serial.println("Puvodni retezec:");
    Serial.println(retezec);

    int hodnota = retezec.substring(5,9).toInt() * 10;           // cast od znamenka k desetinne carce se vynasobi 10
        hodnota = hodnota + retezec.substring(10,11).toInt();    // 1 znak za desetinnou carkou se jen pricte

    Serial.println("10x teplota:");
    Serial.println(hodnota);


//----------------
(tohle funguje jen pro kladné teploty. Pro záporné teploty by se musela ta desetinná část odečítat)

Osobně bych ale do SRAM neukládal ten celý řetězec co přijde z komunikace, ale jen dvoj nebo trojbajtovou hodnotu:
1. bajt = identifikace čidla
2. bajt = teplota *10
... případně ještě 3. bajt pro případ, že se hodnota teploty bude ukládat jako INT

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Uložení a čtení řetězce

Příspěvek od Ludek » 14 pro 2019, 13:52

OJ díky, jste borci, já se tu tak trápím, až jsem napsal.
Díky to jsem potřeboval...

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Uložení a čtení řetězce

Příspěvek od Ludek » 18 pro 2019, 15:15

Ahoj Astro, ještě jsem narazil na problém.
Tvůj kod jsem analyzoval, abych ho mohl použít a šlape...
Ale né ze Serial... Ty tam máš na tom testovacím řetězci mezeru, s tou to chodí,
bez ní né, a ze Serial mi mezera nepřijde :-( Co s tím?

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

Re: Uložení a čtení řetězce

Příspěvek od kiRRow » 18 pro 2019, 15:33

buď tam tu mezeru doflákneš ... nejrychlejší a nejprasáčtější řešení

nebo popřepisuješ ty čísla v příkazech substring

Kód: Vybrat vše

 int hodnota = retezec.substring(5,9).toInt() * 10;           // cast od znamenka k desetinne carce se vynasobi 10
        hodnota = hodnota + retezec.substring(10,11).toInt();    // 1 znak za desetinnou carkou se jen pricte
Pokud chybí mezera na začátku, tak musíš jeden znak ubrat. Chceš to vybrat od čtvrtého tého do osmého znaku a převést na int. A pak od devátého znaku do desátého a převést na int.

edit:
Měření záporných teplot nehrozí (není plánováno)?

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Uložení a čtení řetězce

Příspěvek od Ludek » 18 pro 2019, 16:08

Oj, smí se tu vulgarizmy? Já jsem Vůl - jasně že to pomohlo přepsat čísla...
díky

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

Re: Uložení a čtení řetězce

Příspěvek od kiRRow » 18 pro 2019, 16:24

No kdybys při analyzování napsal do google "arduino substring" dostal by jsi se sem https://www.arduino.cc/reference/en/lan ... substring/ a když to proženeš překladačem získáš : " Získejte podřetězec řetězce. Počáteční index je včetně (odpovídající znak je součástí podřetězce), ale volitelný koncový index je exkluzivní (odpovídající znak není součástí podřetězce). Pokud je koncový index vynechán, podřetězec pokračuje až do konce řetězce. " Na základě čehož se dá logicky odvodit, proč to zlobí, když je řetězec o první znak kratší.

Odpovědět

Kdo je online

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