Jak zapsat data do seriove linky?

Pavel Hudecek edizon na seznam.cz
Sobota Květen 7 14:20:40 CEST 2016


__attribute__((packed)) jsem nedávno v podobné situaci použil. Na jedné 
straně ARM a C, na druhé PC a C#.
Union jsem nepoužil, odesílací funkce dostane pointer na strukturu a sizeof.
Funguje k plné spokojenosti. Jak již bylo řečeno, důležité je, aby indiáni 
na obou stranách byli ze stejného kmene.

PH

-----Původní zpráva----- 
From: Miroslav Mraz
V zásadě to možné je, pokud máte data jako celá čísla bez znaménka a
dodržíte několik jednoduchých pravidel.
1. Pokud je šířka dat větší než jeden byte, nebude takto jednoduše
fungovat přenos dat mezi procesory s malým a velkým indiánem. Používají
se proto převodní funkce jako htons(), htonl()..., které přeházejí
pořadí bytů, pokud je to potřeba.
Problém je tyto funkce použít na vhodném místě a nezapomenout na ně. A
protože vám to bude fungovat většinou i bez nich, je to zdroj potíží.
2. Bool jako datový typ v C++ může mít i šířku nativního slova
procesoru, takže je lépe použít bitová pole. Což sice produkuje kratší
paket, ale působí problémy - různé kompilátory si to mohou přelouskat
různě. Zase bude asi rozdíl mezi malým a velkým indiánem. Takhle nějak
se to většinou píše, ale jestli to funguje nevím, nikdy jsem to
nezkoušel na velkém indiánu, většina procesorů má malý.

struct paket {
   u32 MereniZdroj;
   u32 MereniTeplota;
   u08 PocitadloVysledku;
   u08 PosledniChyby[10];

   union {       // možná zbutečné, ale pro názornost
     u08 Status; // jen toto půjde ven - 1 byte
     struct {    // zde jsou definovány jedn. bity
#if INDIAN==MALY
       u08 JeChyba : 1;
       u08 Zmereno : 1;
       u08 UNUSED  : 6;
#else
       u08 UNUSED  : 6;
       u08 Zmereno : 1;
       u08 JeChyba : 1;
#endif
     };
   };
}__attribute__((packed));

3. Jak je naznačeno, některé překladače mají pro zapakování struktury
odlišnou syntaxi. Příklad je z GCC.

Možná někdo vzpomene na něco dalšího.

Mrazík



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; 



Další informace o konferenci Hw-list