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();
}