Arduino a zadrhel zacatecnika
Petr Labaj
labaj na volny.cz
Neděle Březen 1 22:26:26 CET 2015
Aniž bych znal knihovny Arduina, tak jste si odpověděl sám.
Pokud chcete posílat data ven v binárním tvaru, a pokud máte
k dispozici jen knihovní funkci pro vyslání jednoho byte (Serial.write),
tak ji prostě musíte v cyklu zavolat tolikrát, kolik byte potřebujete poslat.
Takže jediný problém je, jak z původní 4-bytové proměnné udělat
4 jednobytové. Tak to můžete udělat snadni tak, že ty paměťovou
oblast, kde je to uloženo, prostě přetypujete. Takže procesor místo
po 4 byte najednou to bude brát po jednom. Jenže je to tak trochu
prasácké, protože záleží na tom, jaké máte v tom stroji indiány
(tedy jaká je endianita).
Pokud to chcete udělat čistě (i za cenu pomalejšího zpracování),
tak prostě posuvy vymlátíte z toho intu 4 chary, nějak takhle:
c1 = i & 0xff;
c2 = (i >> 8) & 0xff;
c3 = (i >> 16) & 0xff;
c4 = (i >> 24) & 0xff;
Nebo lépe:
c[0] = i & 0xff;
atd.
PL
*********************************
From: "Pavel Kutina" <hw na prelude.cz>
To: <hw-list na list.hw.cz>
Sent: Sunday, March 01, 2015 10:01 PM
Subject: Arduino a zadrhel zacatecnika
Zdravim,
C neni muj kamarad a to ani v Arduinu... Resim nasledujici problem (prosim,
nebijte mne, fakt vim o C stale dost malo, takze je velmi pravdepodobne, ze
se ptam na trivialitu a unika mi neco zakladniho):
Mam promennou (int), v ni nejakou namerenou hodnotu.
Mam seriovy kanal, pres ktery bych tu hodnotu rad dostal ven.
Kdyz pouziju Serial.print(promenna), tak mi to do serioveho kanalu vysype to
jako soubor znaku.
tedy:
uint32_t pokus = 65;
Serial.print(pokus);
vystupem na seriovem kanalu jsou znaky '6', '5'.
Ano, existuje parametr pro print ve tvaru
Serial.print(pokus, HEX);
pak jsou vystupem znaky '4', '1';
Trochu problem je, ze ja bych si rad obsah te promenne nejdriv rozebral po
bajtech, pridal jeste nejaky bitovy flag, potom udelal kontrolni soucet, ten
prilepil k puvodni zprave a pak to cele odeslal v hex pres seriak do sveta,
jak to tak vidim, tak tu nejjednodussi metodu odeslani HEX cisla asi
nepouziju.
Variantou je Serial.write(char);
Ten samozrejme v tom predchozim prikladu odesle znak 'A', tedy odesle 0x41;
Umi ale odeslat jen bajt po bajtu, takze bych potreboval nejak zkonvertovat
tu hodnotu do hex, nahodit jeste par bitu jako indikator, pak ji bajt po
bajtu nejak zCRCat, prilepit CRC k tomu puvodnimu cislu a zase bajt po bajtu
poslat ven.
Zjevne mi neco zasadniho unika (navic jsem silne nastydly, takze hlava moc
nefunguje) - napadne vas nejake (pokud mozno transparentni a pochopitelne i
pro blbce, pointer na pointer pointeru jsem nepobral dodnes) reseni? Na
druhe strane si to budu resit v Pascalu, tam snad vim, jak na to, ale na
vysilaci mam Arduino a tenhle divny jazyk...
Diky za kazdy kopanec spravnym smerem.
Pavel Kutina
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list