Uložení a čtení řetězce
Uložení a čtení řetězce
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?
Č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?
Re: Uložení a čtení řetězce
Ř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
mno a tak nějak teoreticky dostaneš z B60+023,6C hodnotu 236
Re: Uložení a čtení řetězce
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:
(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
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);
//----------------
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
Re: Uložení a čtení řetězce
OJ díky, jste borci, já se tu tak trápím, až jsem napsal.
Díky to jsem potřeboval...
Díky to jsem potřeboval...
Re: Uložení a čtení řetězce
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?
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?
Re: Uložení a čtení řetězce
buď tam tu mezeru doflákneš ... nejrychlejší a nejprasáčtější řešení
nebo popřepisuješ ty čísla v příkazech substring
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)?
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
edit:
Měření záporných teplot nehrozí (není plánováno)?
Re: Uložení a čtení řetězce
Oj, smí se tu vulgarizmy? Já jsem Vůl - jasně že to pomohlo přepsat čísla...
díky
díky
Re: Uložení a čtení řetězce
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ší.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host