Jak policzyć CRC mavlink 1.0

Elektronika w modelu i na ziemi

Moderatorzy: moderatorzy2014, moderatorzy

Awatar użytkownika
JSt
Posty: 137
Rejestracja: wtorek 14 kwie 2015, 12:13
Lokalizacja: Kraina Kwitnącej Bulwy

Jak policzyć CRC mavlink 1.0

Post autor: JSt »

Cześć
Czy ktoś może mi łopatologicznie wytłumaczyć jak obliczyć crc do wysłania/sprawdzenia przychodzącego pakietu (msg) w mavlink 1.0 ?
Najlepiej na przykładzie bo czytam różne opisy i nie do końca kumam :-(
Jest sobie ramka (np heartbeat) odebrana:
FE 09 01 01 01 00 10 00 00 00 01 03 11 02 03 D6 BD
Odrzucam bajt startowy: FE, odrzucam końcówkę CRC: D6 BD, zostaje mi 14 bajtów - 5 nagłówka i 9 "treści właściwej"
Jakie operacje kolejno muszę przeprowadzić, aby ze startowego CRC (0xFFFF) uzyskać D6BD? Gdzieś jeszcze muszę dorzucić CRC Extra - gdzie i jak ? (dla heartbeat CRC extra wynosi 50, (0x32)). Czytałem już trochę na ten temat ale jakoś nie do końca rozumiem...
I przy okazji inne pytanko - co się stanie jeśli w kolejnym wysyłanym komunikacie nie zrobię inkrementacji numeru kolejnego wiadomości (bajt 2 - zielony)?
Pozdrawiam
Janusz

Ostatnio zamęczam: S800 na Omnibus F4
Awatar użytkownika
pawelsky
Posty: 9750
Rejestracja: środa 19 mar 2014, 02:03
Lokalizacja: Polska
Kontakt:

Re: Jak policzyć CRC mavlink 1.0

Post autor: pawelsky »

Kolejno dla kazdego z 14 bajtow byte aktualizujesz crc (poczatkowo rowne 0xFFFF) w nastepujacy sposob:

Kod: Zaznacz cały

  uint8_t tmp;
  tmp = byte ^ (uint8_t)(crc & 0xff);
  tmp ^= (tmp << 4);
  crc = (crc >> 8) ^ (tmp << 8) ^ (tmp << 3) ^ (tmp >> 4);
Nastepnie wykonujesz te operacje raz jeszcze dla CRC Extra.

I masz szukane 2 bajty CRC

Kod: Zaznacz cały

(uint8_t)(crc & 0x00FF)
(uint8_t)(crc >> 8)
Awatar użytkownika
JSt
Posty: 137
Rejestracja: wtorek 14 kwie 2015, 12:13
Lokalizacja: Kraina Kwitnącej Bulwy

Re: Jak policzyć CRC mavlink 1.0

Post autor: JSt »

Wielkie dzięki
Zatrybiłem, przerobiłem pod C# - umiem odczytać dane i sprawdzić CRC
A teraz jak wysłać SET_MESSAGE_INTERVAL ???
Patrzę na https://pixhawk.ethz.ch/mavlink i MAVLink Messages (od połowy strony) umiem poskładać, ale te pola MAV_CMD nie wiem jak przypiąć i do czego.
Pozdrawiam
Janusz

Ostatnio zamęczam: S800 na Omnibus F4
Awatar użytkownika
pawelsky
Posty: 9750
Rejestracja: środa 19 mar 2014, 02:03
Lokalizacja: Polska
Kontakt:

Re: Jak policzyć CRC mavlink 1.0

Post autor: pawelsky »

JSt pisze:Wielkie dzięki
Zatrybiłem, przerobiłem pod C# - umiem odczytać dane i sprawdzić CRC
A teraz jak wysłać SET_MESSAGE_INTERVAL ???
Patrzę na https://pixhawk.ethz.ch/mavlink i MAVLink Messages (od połowy strony) umiem poskładać, ale te pola MAV_CMD nie wiem jak przypiąć i do czego.
Pewnie prosciej Ci bedzie zaczac od REQUEST_DATA_STREAM, jest wprawdzie obsolete i masz mniejsza kontrole nad poszczegolnymi komunikatami, ale z tego co widzialem wciaz dziala.
Awatar użytkownika
JSt
Posty: 137
Rejestracja: wtorek 14 kwie 2015, 12:13
Lokalizacja: Kraina Kwitnącej Bulwy

Re: Jak policzyć CRC mavlink 1.0

Post autor: JSt »

Tak, jak napisałem message z zakresu 0 do 255 (od połowy wspomnianej strony umiem poskładać i wysłać), ale właśnie ze względu na: THIS INTERFACE IS DEPRECATED. USE SET_MESSAGE_INTERVAL INSTEAD chcę się nauczyć składać ramkę z SET_MESSAGE_INTERVAL. Nie chcę instalować linuxa i pytona - nie jestem taki multiinformatyczny :-) A jak kumple zapytają - co robiłeś wieczorkiem ? to jak mam odpowiedzieć, że bawiłem się PYTONEM ???
Pozdrawiam
Janusz

Ostatnio zamęczam: S800 na Omnibus F4
Awatar użytkownika
pawelsky
Posty: 9750
Rejestracja: środa 19 mar 2014, 02:03
Lokalizacja: Polska
Kontakt:

Re: Jak policzyć CRC mavlink 1.0

Post autor: pawelsky »

JSt pisze:Tak, jak napisałem message z zakresu 0 do 255 (od połowy wspomnianej strony umiem poskładać i wysłać), ale właśnie ze względu na: THIS INTERFACE IS DEPRECATED. USE SET_MESSAGE_INTERVAL INSTEAD chcę się nauczyć składać ramkę z SET_MESSAGE_INTERVAL. Nie chcę instalować linuxa i pytona - nie jestem taki multiinformatyczny :-) A jak kumple zapytają - co robiłeś wieczorkiem ? to jak mam odpowiedzieć, że bawiłem się PYTONEM ???
No faktycznie troche to krepujace ;-)

Uzyj COMMAND_LONG i oczekuj COMMAND_ACK
Ostatnio zmieniony środa 20 kwie 2016, 14:40 przez pawelsky, łącznie zmieniany 1 raz.
Awatar użytkownika
jelcyn
Posty: 3417
Rejestracja: niedziela 23 sty 2011, 16:56
Lokalizacja: B-stok

Re: Jak policzyć CRC mavlink 1.0

Post autor: jelcyn »

Zrób to sam. ...albo z piękną kobietą ;-)
ODPOWIEDZ