Witam na forum.
Borykam się z takim problemem już około tygodnia. Piszę program do komunikacji z urządzeniem na porcie RS232. Program był wcześniej napisany w C++ i dane pobierane z portu były pakowane do struktury, która wygląda mniej więcej tak:
union Dane{
struct{
unsigned int zmienna1;
unsigned int zmienna2;
union{
struct{
unsigned int bit1 :1;
unsigned int bit2 :1;
unsigned int bit3 :1;
unsigned int bit4 :1;
unsigned int bit5 :1;
unsigned int bit6 :1;
unsigned int bit7 :1;
unsigned int bit8 :1;
unsigned int bit9 :1;
}bit;
unsigned int ALL;
}unia1;
}SLOWO;
unsigned int Bufor[3];
};
Taka jest budowa tej struktury, jest więcej tych zagnieżdżonych unii i więcej danych, ale chodzi mi bardziej o tą tablicę, bo jak widać jak zmienimy któryś z elementów tablicy odpowiadający mu element unii też zmieni wartość.
W C# napisałem to mniej więcej tak:
[StructLayoutAttribute(LayoutKind.Explicit, CharSet = CharSet.Ansi, Size=96)]
public unsafe struct Dane
{
[FieldOffsetAttribute(0)] public UInt16* bufor;
[FieldOffsetAttribute(0)] public UInt16 zmienna1;
[FieldOffsetAttribute(2)] public UInt16 zmienna2;
[FieldOffsetAttribute(4)] public Unia1 unia1;
gdzie Unia1 wygląda tak:
[Flags]
public enum Unia1 : ushort
{
bit1 = 0,
bit2 = 1,
bit3 = 2,
bit4 = 4,
bit5 = 8,
bit6 = 16,
bit7= 32,
bit8= 64,
bit9= 128,
}
No i teraz nie mogę zrobić przypisania
Dane dane = new Dane();
/*tu wypełniana jest tablica Uint16[] Bufor */
unsafe
{
fixed (dane.bufor = Bufor);
}
Kompilator wyrzuca mi "Identifier expected". Jak ktoś może coś poradzić w tym temacie, a może zrobić to jakoś inaczej, to od razu z góry dziękuję.
Dodam jeszcze tylko, że zależy mi na szybkim wysyłaniu i odbieraniu całej tej struktury z portu