RS232 - formowanie ramki danych

0

Witam,

Potrzebuję zaimplementować obsługę portu szeregowego w C#. Przez port szeregowy wysłane są ramki danych - chodzi mi o to, jak uformować taką ramkę danych.

Przykład - nagłówek ramki:

  • pierwszy i drugi bajt: znaki ASCII 'A' i 'C'
  • trzeci i czwarty baj t - 2 bajtowa liczba bez znaku

Załóżmy, że chcę wysłać 'A', 'C' i liczbę 0xFFFF jako 3 i 4 bajt. Metoda write jest taka:

void Write(byte[] buffer, int offset, int count)

Tylko ze nie bardzo wiem, jak mam wypełnić moją zmienną buffer odpowiednimi danymi, zwłaszcza że dwubajtową liczbę 0xFFFF muszę "rozdzielić" na bajty - jak to zrobić w C#?

No chyba ze tak? Tylko że to jest bezsensowne raczej, bo podzielilem to 0xFFFF sam, a nie programowo.

byte[] buff = { (byte)'A', (byte)'C', 0xFF, 0xFF };
0
othello napisał(a)

No chyba ze tak? Tylko że to jest bezsensowne raczej, bo podzielilem to 0xFFFF sam, a nie programowo.

byte[] buff = { (byte)'A', (byte)'C', 0xFF, 0xFF };

niestety

0

lol

Czyli co, wyzerowac mlodszy bajt, zostanie mi starszy. I na odwrot, czyz nie? Tylko ze akurat takie myslenie niewiele mi da, no chyba ze bede przesuwac o 16 bitów w prawo lub w lewo?

0

Hm co do "wyciagania" bajtów z liczb to skleciłem coś takiego:

  • rozkład liczby dwubajtowej:
byte[] bajty =   {
                         (byte)(a - (a >> 0x8 << 0x8)),
                         (byte)(a >> 0x8) 
                        };
  • rozkład liczby czterobajtowej:
byte[] bajty = {
                        (byte)(a - (a >> 0x8 << 0x8)),
                        (byte)(a - (a >> 0x10 << 0x10) >> 0x8),
                        (byte)((a >> 0x10) - (a >> 0x18 << 0x8)),
                        (byte)(a >> 0x18) 
                      };

Ale jezeli ktos ma lepszy sposob to chetnie sie dowiem.

A co do wykorzystania w rzeczywistym programie - chyba najlepszy pomysl to zdefiniowanie klasy z przeciążonym operatorem = dla liczby typu uint i ushort oraz z przeciazonym operatorem [] do pobierania bajtów liczby hmm...

[edit]
Odpowiem sobie sam: byte[] bits = BitConverter.GetBytes(a); :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1