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