2byty na 2inty a zpet. 2inty -> 2byty

tmx

2byty na 2inty a zpet. 2inty -> 2byty
« kdy: 08. 11. 2022, 21:20:38 »
panove, takovej problem. seriova komunikace, data chodi jen jednim smerem, jako vstup.
mejme pole 16B, prvni 2B nepotrebuju /aktualne/, takze zustava 14B, to jest 7 dvojic bytu.
dvojici bytu na vstupu /zjednodusene/ mam takle:
1st byte je v promene prvniByte a
2nd byte je v promene druhyByte.
vystupem ma byt prvniINT a druhyINT

problemu jsem porozumel takto:
na prvniINT potrebuju levych 5bitu z prvniByte /vznikne mi 5bit velky prvniINT/
na druhyINT potrebuju posledni 3bity z prvniByte a k tomu cely druhyByte /vznikne 11bit velky druhyINT.
znova #1: prvniINT je v levych 5bitech prvniho bytu, druhyINT je ve zbyvajich 3bitech /prvniByte/ a k tomu cely druhyByte.
znova #2: 2B = 16b, v levych 5b je jeden prvniINT, ze zbyvajicich 11b je druhyINT
znova #3: levych 5bitu mi da kombinaci 2^5 = 32 /prvniINT/, zbyvajicih 11b mi da kombinaci 2^11 = 2048 /druhyINT/

delam to takto a funguje to:
prvniINT = ( prvniByte & 0b01111000) >> 3; //levych 5bitu pouziju /vlastne 4/ a zbavim se pravych 3bitu, mam 5b
druhyINT = ( ((prvniByte & 0b00000111) << 8 ) | druhyByte); //zlikvidovane 3bity dam dopredu a za neho mrsknu druhyByte, mam 11b
druhyINT = 988 + (druhyINT >> 1); //nejak zaokrouhluji ci co

bezi to na ESP i v pythonu na raspberry.

a ted potrebuju z dvojice prvniINT a druhyINT zpatky udelat dvojici prvniByte a druhyByte

jedna se mi tohle:
https://www.spektrumrc.com/on/demandware.static/-/Sites-horizon-master/default/dwb89fec2c/Manuals/SPM%20Remote%20Receiver%20Interfacing-Manual-EN.pdf

potrebuji seriova data rozlustit na inty /to mam/, inty zmenit /to taky zvladnu, druhyINT + nejaky_cislo/, zakodovat inty zpet do dvou bytes /to neumim/ a poslat po jinym seriaku dal /to zvladnu/

potreboval bych vedet jak ty 3 rovnicky obratit stylem:
prvniByte = vezmi z prvniINT 5 bitu a posun o 3 doleva, zbyvaji 3 bity vezmi z zacatku druhyINT
druhyByte = vezmi spodnich 8 bitu z druhyINT

kdyby se nad tim nekdo zamyslel budu rad, dekuju
snad jsem to popsal srozumitelne





a6b

  • ***
  • 119
    • Zobrazit profil
    • E-mail
Re:2byty na 2inty a zpet. 2inty -> 2byty
« Odpověď #1 kdy: 08. 11. 2022, 21:38:04 »
bud  to nasypes do jineho intu, tam si to ruzne vymaskujes a vyrotujes bity abys mel jistotu, ze mas hodnotu mensi nez 256 a pak ten int pretypujes na jeden byte (typ char).

nebo to poresis v jednom intu a ten pak pretypujes na pole bajtu, int jsou myslim 4 bajty.

mhi

  • *****
  • 500
    • Zobrazit profil
Re:2byty na 2inty a zpet. 2inty -> 2byty
« Odpověď #2 kdy: 08. 11. 2022, 22:03:02 »
Nedochazi mi kde je problem?? Kazdopadne to cele vypada jen jako cislo, takze prvni/druhyInt bych nahradil za jedinyInt,

Kód: [Vybrat]
// rev druhyINT = 988 + (druhyINT >> 1); //nejak zaokrouhluji ci co
druhyInt -= 988;
druhyInt <<= 1;


// prvniByte = vezmi z prvniINT 5 bitu a posun o 3 doleva, zbyvaji 3 bity vezmi z zacatku druhyINT
prvniByte = (prvniINT<<3) | (druhyINT&0x7);



// druhyByte = vezmi spodnich 8 bitu z druhyINT

druhyByte = druhyINT&0xFF;

z_sk

Re:2byty na 2inty a zpet. 2inty -> 2byty
« Odpověď #3 kdy: 08. 11. 2022, 22:52:39 »
Používaj C - Bit Fields a na 2 prístupnosť (1 dvojbat alebo 2 jedno-bajt) použi C - Unions.

RDa

  • *****
  • 2 709
    • Zobrazit profil
    • E-mail
Re:2byty na 2inty a zpet. 2inty -> 2byty
« Odpověď #4 kdy: 09. 11. 2022, 11:05:19 »
bych to resil unsigned shortem a pak si jen overil, zda prekladac a platforma ma stejne smysleni o endianite


Re:2byty na 2inty a zpet. 2inty -> 2byty
« Odpověď #5 kdy: 10. 11. 2022, 07:17:01 »
Na to by mělo stačit něco jako
Kód: [Vybrat]
prvniByte = (prvniInt << 3) | (druhyInt >> 8);
druhyByte = druhyInt & 0xff;
nebo tak? Pokud bych chtěl mít jistotu, že nic nikde nepřeteče, a chtěl to názorně, tak
Kód: [Vybrat]
prvniByte = ((prvniInt & 0b00011111) << 3) | ((druhyInt & 0b11100000000) >> 8);
druhyByte = druhyInt & 0b11111111;