Arduino - 32 bitu promenna ze 4 byte
Martin Locker
locker na vosrk.cz
Neděle Prosinec 15 17:36:20 CET 2024
Protože nebyla splněna podmínka, kterou jsem uváděl, tj. little endian. Dle uváděného funkčního kódu je to uloženo big endian.
Takže jednoduché zkopírování nemůže fungovat. Je nutné byty přerovnat, takže buď ty shifty, union (viz. níže) nebo ten asembler.
varianta union:
// ----------------------------
union TData {
long x;
byte a[4];
};
TData data;
data.a[0] = RX_Data[10];
data.a[1] = RX_Data[9];
data.a[2] = RX_Data[8];
data.a[3] = RX_Data[7];
// ----------------------------
v data.x je vysledné číslo (doufám, že tam není chybka, píšu to od stolu)
Martin Locker
----- Původní zpráva -----
Odesilatel: Jirka Mww (jirka.mww na gmail.com)
Datum: 15/12/2024 17:23
Příjemce: HW-news (hw-list na list.hw.cz)
Předmět: Re: Arduino - 32 bitu promenna ze 4 byte
To co funguje je tohle :
PowerIO = (((((RX_Data[7] <<8 ) + RX_Data[8]) <<8) + RX_Data[9]) << 8) + RX_Data[10];
to od pana Lockera nefunguje, překladačem to projde, ale dává to nesmyslně vysoké číslo.
Zdravi
Jirka Sloupenský OK1MWW
ne 15. 12. 2024 v 17:18 odesílatel Pavel Hudeček <edizon na seznam.cz> napsal:
A pokud je to opačně, tak ten long dát do unionu s polem bajtů a nakopírovat po jednom ve správném pořadí.
Přesnější rady by mohly být, kdyby byl k dispozici ten kód co fungoval a ten co nefungoval. Možná tem jenom někde chyběl &, možná tam indiáni bojujou.
PH
Dne 15.12.2024 v 16:59 Martin Locker napsal(a):
Za předpokladu, že je to 8-bitové arduino a data jsou little endian, tak třeba takto:
long x;
memcpy(&x, &RX[7], 4);
nebo
long x = *((long*)&RX[7]);
Martin Locker
----- Původní zpráva -----
Odesilatel: Jirka Mww (jirka.mww na gmail.com)
Datum: 15/12/2024 16:22
Příjemce: HW konference (hw-list na list.hw.cz)
Předmět: Arduino - 32 bitu promenna ze 4 byte
dobr7 den,
zase bych potreboval poradit : Mam 4 byte v poli RX[7] az RX[10] (prijata modbus zprava)
a potrebuji z nich udelat 32 bit proměnnou (log int). Postupne nacitani a posuny o 8 bitu do leva mi funguje, ale radeji bych to nejak prekopiroval rovnou, kvuli rychlosti. Zkousel jsem pouzit memcpy , ale asi to delam blbe, muzete mi dat nejaky tip , jak to udelat ? V assembleru bych to umel ((::
Zdravi
Jirka Sloupenský OK1MWW
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241215/9348c6e2/attachment.htm>
Další informace o konferenci Hw-list