Zabezpieczenie przed błędną ramką

0

Witam,

Stworzyłem przetwornik do pomiarów kątów w przestrzeni. Z procesora Atmega 328p-pu (zewnetrzy kwarc 16MHz, BaudRate 9600) wysyłam ramkę:

printf("%4ld,%4ld,%4ld,%d,%d,%d,%d,\r\n" ,xo,yo,zo,gyrox,gyroy,gyroz,stopnie);

Po stronie odbiorczej napisaną mam aplikację w Visual C# Express. Tam dane rozdzielam do tablicy dane na podstawie przecinka.

string[] dane_pomiarowe = new string[7];
dane_pomiarowe = odebrany_str.Split(','); // rozdziel dane z macierzy pomiarowej na elementy składowe po przez znak ","

Jednak Co jakiś czas pojawiają się błędne w postaci np. :

dane_pomiarowe[0] = -160;
dane_pomiarowe[1] =268
dane_pomiarowe[2] =27-653
dane_pomiarowe[3] =-197
dane_pomiarowe[4] =330
dane_pomiarowe[5] =-57
dane_pomiarowe[6] =-26
dane_pomiarowe[7] =\r\n

W tym przypadku widać błąd w [2] . W jaki sposób zabezpieczyć się przed błędną ramką, aby nie była brana pod uwagę? Wprowadzić sumę kontrolną? Detekcje niepoprawnej sumy kontrolnej realizować na mikroprocesorze, czy w programie?

Inna sprawa:
Stworzyłem wskaźnik graficzny kompasu, jednak przy przeskoku z ekstremalnej wartości 359 stopni na 0 i odwrotnie, nie wykonuje obrotu o jeden stopień lecz robi obrót ("na około") tzn. przelatuje cały obrót w drugą stronę do tej wartości.

pictureBox4.Image = Properties.Resources.kompas; //tarcza kompasu
pictureBox5.Image = Properties.Resources.wskaznik;//wskaznik kompasu
img = new Bitmap(pictureBox4.Image);
int kierunek = Convert.ToInt16(Math.Floor(x_est));//x_est to wypracowany kąt po filtracji Kalmana(double), kierunek to zmienna (int) do obrotu o całe stopnie 
textBox47.Text = Convert.ToString(kierunek);
Image oldImage = pictureBox4.Image;
pictureBox4.Image = Utilities.RotateImage(img, (float)-kierunek);
if (oldImage != null)
{
oldImage.Dispose();
}
0
  1. Suma kontrolna to dobry pomysł, nawet taka prosta suma bajtów liczona na jednym bajcie.
  2. Wystarczy zapis "string[] dane_pomiarowe = odebrany_str.Split(',');" (ale to tylko szczegół).
  3. A ile wynosi zmienna kierunek przy tych ekstremalnych przeskokach?
0
  1. Jak mam rozumieć prostą sumę bajtów na jednym bajcie? Gdybym policzył sumę dziesiętnych wartości i wysyłał na końcu ramki albo też zamienił tą sumę dziesiętną na binarną wartość (np kod U2) to jest to jakieś rozwiązanie?
  2. To fakt.
  3. Może wrócę tutaj do podstaw, a więc wartość x_est(double) w wielkim skrócie to obliczany arctg(y,x), gdzie x i y to zmienne odbierane z czujników do aplikacji. Następnie następuje konwersja x_est na int do zmiennej kierunek, która zmienia się od 0 do 359. Myślę, że należało, by jakieś przejścia z kolejnych ćwiartek uwzględnić, bo arctg w swoich skrajnych ekstremach jest zbieżna?
0
  1. Tak, myślę, że tak będzie ok. Zliczasz kolejne dziesiętne wartości znaków z ramki na jednym bajcie (zmiennej o typie byte) i na końcu ramki (lub na początku) ją dodajesz. Po otrzymaniu ramki zliczasz w ten sam sposób jeszcze raz i porównujesz.
  2. Ja w zasadzie nie wnikam w te obliczenia, interesuje mnie co masz w tej zmiennej kierunek, która wykorzystywana jest jak mniemam przy rysowaniu kompasu, czy co Ty tam rysujesz. W zmiennej kierunek masz kąt, o który przesuwasz, czy kąt (punkt), do którego musisz przesunąć wskazówkę (nie wiem jak to wygląda graficznie, bo się nie pochwaliłeś ;) )?
0
  1. Czyli sprawdzanie robię już na poziomie aplikacji po wysłaniu ramki z mikro-kontrolera i odebraniu jej w PC?
  2. W zmiennej kierunek mam wypracowany przez urządzenie azymut, czyli kąt zawarty między kierunkiem północy a kierunkiem odniesienia urządzenia, czyli kąt równy 0 to północ. Narysowałem w programie autocad tarczę jako odzworowanie kompasu, i ją właśnie obracam w aplikacji o (int)kierunek
0
  1. tak
  2. Ok, mam nadzieję, że dobrze to zrozumiałam. No to pewnie najprościej będzie, (żeby nie przerabiać tych Twoich obliczeń) zastosować poprawkę na kierunek, jeżeli obrót wyniesie więcej niż 180 stopni. Coś w stylu: jeżeli kierunek>180 to kierunek = 360 - kierunek. Tam pewnie trzeba by uwzględnić kierunek (w sensie czy w lewo, czy w prawo), czyli uwzględnić znak +/-, ale to już sobie wydedukujesz i dopracujesz, bo jak tyle ładnie wymyśliłeś to spokojnie dasz radę dokończyć. A mi się myślenie już wyłącza, bo jest 23:23 a ja dalej w pracy na wagonie się męczę :/
0

Zastosowałem podany wyżej zabieg, lecz to sprowadziło mój kompas do obrotów w jednej połówce. Myślę, że należałoby rozważyć 4 ćwiartki układu współrzędnych i może przy wyliczaniu funkcji arctg() zastosować jakieś korekty, przypisania. Niestety szukam rozwiązania, myślę i nic więcej nie mam.

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