logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wyodrębnić bajty z liczby dla komunikacji UART?

Pan Korsarz 13 Lut 2019 16:07 588 4
  • #1 17775256
    Pan Korsarz
    Poziom 3  
    Witam,
    jak waszym zdaniem najefektowniej z liczby (dajny na to 454857, binarnie 110 11110000 11001001 (3 bajty)) wyodrębnić poszczególne bajty.
    Pytanie wynika stąd, że opracowuję komunikację, gdzie ramka danych składa się z konkretnej ilości bajtów, każda składowa informacja tej ramki zawiera się w pewnej określonej liczbie bajtów. Więc na przykład, jeśli odbiornik, przez UART odbierze 5 bajtów (np. 5 charów) to wie że pierwszy bajt jest adresem dwa kolejne są zadaniem do wykonania a reszta to CRC itp.
    Myślałem nad przesunięciem bitowym, ale jeśli informacja będzie zawierała się w 4 bajtach to nie wiem czy przy przesunięciu bitowym o 32 kompilator nie będzie krzyczał o przepełnieniu. Ogólnie prosił bym o jakieś wskazówki czy porady.
    Pozdrawiam.
  • #2 17775276
    szwagros
    Poziom 33  
    Pan Korsarz napisał:
    jak waszym zdaniem najefektowniej z liczby (dajny na to 454857, binarnie 110 11110000 11001001 (3 bajty)) wyodrębnić poszczególne bajty.

    A jaka architektura? Bo jeśli 8-bitowa, to bajty masz wyodrębionie niejako z automatu...
  • #3 17775434
    simw
    Poziom 27  
    Pan Korsarz napisał:
    Witam,
    jak waszym zdaniem najefektowniej z liczby (dajny na to 454857, binarnie 110 11110000 11001001 (3 bajty)) wyodrębnić poszczególne bajty.


    Osobiście to bym to przerzucił na kompilator, tzn. stworzyłbym unię składającą się z jednej liczby 32-bitowej i z 4 8 bitowych, albo z liczby 32-bitowej i struktury anonimowej składającej się z 4 pól 8-bitowych.
    Przy wyodrębnianiu praktycznie nic nie trzeba robić od strony programisty, jedynie wiedzieć, które bajty znajdują się na jakiej pozycji w słowie 32-bit.
    Natomiast przy takim sposobie trzeba pamiętać o utrudnionej przenośności kodu na inne platformy.
  • #4 17775495
    Pan Korsarz
    Poziom 3  
    szwagros napisał:
    Pan Korsarz napisał:
    jak waszym zdaniem najefektowniej z liczby (dajny na to 454857, binarnie 110 11110000 11001001 (3 bajty)) wyodrębnić poszczególne bajty.

    A jaka architektura? Bo jeśli 8-bitowa, to bajty masz wyodrębionie niejako z automatu...


    Mikrokontroler 8-bit konkretnie Atmega 1284. Z automatu tz ?

    Dodano po 1 [minuty]:

    simw napisał:
    Pan Korsarz napisał:
    Witam,
    jak waszym zdaniem najefektowniej z liczby (dajny na to 454857, binarnie 110 11110000 11001001 (3 bajty)) wyodrębnić poszczególne bajty.


    Osobiście to bym to przerzucił na kompilator, tzn. stworzyłbym unię składającą się z jednej liczby 32-bitowej i z 4 8 bitowych, albo z liczby 32-bitowej i struktury anonimowej składającej się z 4 pól 8-bitowych.
    Przy wyodrębnianiu praktycznie nic nie trzeba robić od strony programisty, jedynie wiedzieć, które bajty znajdują się na jakiej pozycji w słowie 32-bit.
    Natomiast przy takim sposobie trzeba pamiętać o utrudnionej przenośności kodu na inne platformy.


    Ciekawy sposób, z chęcią wytestuje jutro , przenoszenie na inne platformy raczej nie będzie konieczne.
  • #5 17775849
    tmf
    VIP Zasłużony dla elektroda
    Pan Korsarz napisał:
    Mikrokontroler 8-bit konkretnie Atmega 1284. Z automatu tz ?

    Twoje bajty już są w 8-bitowych rejestrach, więc żadne przesunięcia i wyodrębnianie nie jest potrzebne. Kompilator sam załatwi sprawę. Zapis np.( x >> 8) & 0xFF sam da ci drugi bajt, co kompilator zapewne zamieni na jedną instrukcję.
REKLAMA