Jak zapsat data do seriove linky?
Josef Štengl
ok1ced na nagano.cz
Neděle Květen 8 23:17:32 CEST 2016
Opravdu to chcete na všech kompilatorech/ procesorech stejně? Tak to nejde. Ale můžete dosáhnout stejného chování.
1) zapomeňte na u08 a podobně. To je věc historie. Použijte uint_least8_t (16, 32 ...) ze stdint.h, minimálně pro ty kusy,
které mají být přenositelné (to také znamená vyhnout se #pragma (__atribute__) tam ke to jde).
Proč? Protože existují i platformy, kde není uint8_t definovaný, protože char je na nich například 16 bit. Nebo tak nějak.
Co já vím, byli i stroje s 9 bitovým bytem. I když je možné, že i tak narazíme, uint_least8_t je v normě pouhých 17 let a
někomu to ještě nedošlo a jiný to aktivně ignoruje.
Pozn. Ve vašem případě push ani pack nemá význam, protože máte typy od největšího po nejmenší. Zkuste si je seřadit opačně
a vypsat sizeof struktury (je jedno na jaké architektuře). Budou pravděpodobně různé. Souvisí to se zarovnáním a je to věc
kompilátoru. Ale to jen tak na okraj.
2) Pomocí memcopy se obecně důrazně nedoporučuje kopírovat struktury.
3) C je o otrocké práci :-). Ono je navrženo tak, že dělá jen to co napíšete a ještě musíte vědět, jak to napsat správně.
Což se dá dělat stará nemoderní škola :-)
Takže hezky:
uint_least8_t Buffer[m]
Buffer[0] = (uint_least8_t)MereniZdroj >> 24;
Buffer[1] = (uint_least8_t)MereniZdroj >> 16;
Buffer[2] = (uint_least8_t)MereniZdroj >> 8;
Buffer[3] = (uint_least8_t)MereniZdroj;
Buffer[n] = JeChyba;
Takhle by to mělo pracovat i na platformě c28 od TI.
Jestli jste to tak myslel, tak se omlouvám za nadbytečnost.
No a jako bonus je nám vědomí, že je to rychlejší (minimálně stejně rychlé) než pomocí memcopy();
Dne 7.5.2016 v 09:13 Michal Gregor napsal(a):
> JAk resite zapis dat do seriove linky?
> Mame strukturu:
> struct
> {
> u32 MereniZdroj;
> u32 MereniTeplota;
> u08 PocitadloVysledku;
> u08 PosledniChyby[10];
> bool JeChyba;
> bool Zmereno;
> }
>
> Teoreticky lze doplnit
> #pragma pack(push)
> #pragma pack(1)
>
> struct...
>
> #pragma pack(pop)
> a do vystupniho bufru zkopirovat celou struct pomoci funkce memcpy Je to nejak standartizovane? Bude to funguvat na vsech
> kompilatorech/ procesorech stejne?
>
> Nebo je lepsi otrocky napsat cely zapis do bufru ruce?
>
> Buffer[0] = VratByte0(MereniZdroj);
> Buffer[1] = VratByte1(MereniZdroj);
> Buffer[2] = VratByte2(MereniZdroj);
> Buffer[3] = VratByte3(MereniZdroj);
>
> ....
> Buffer[n] = JeChyba;
>
>
> Michal Gregor
> _______________________________________________
> 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