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