Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Visual C# 2010 Express - Zabezpieczenie przed "krzakami" z PortCOM.

lbrycht 02 Gru 2013 16:23 1665 5
  • #1 02 Gru 2013 16:23
    lbrycht
    Poziom 7  

    Witam,

    Tworzę terminal do odbioru danych z Atmegi 328p-pu. Wysyłam ramkę z mikroporcesora:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Po stronie komputera dane rozdzielane są na podstawie przecinka jako "token" i koniec ramki wykrywany jest na podstawie "\n". Mam też zabezpieczenie przed pierwszym pomiarem gdyby chciał czytać ramkę od środka.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Niestety przy szybkich zmianach położenia układu (żyroskop, kompas) zdarza się odbiór pojedyńczych linii "krzaków". Wtedy program się zawiesza.

    Ponadto przy zamykaniu połączenia w aplikacji prawie zawsze przy linii kodu:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    pojawia się ERROR:"IOException was unhandled Operacja We/Wy została przerwana z powodu zakończenia wątku lub żadania aplikacji."

    Wydaje mi się, że raz na jakiś czas, gdy trafię akurat na koniec ramki to aplikacja poprawnie się wyłącza ale zazwyczaj jest ten błąd.


    Jak zabezpieczyć się przed tymi krzakami, utratą połączenia, oraz tym błędem przy wyłączaniu programu i zamykaniu portu?

    0 5
  • #2 02 Gru 2013 22:51
    LED5W
    Poziom 32  

    lbrycht napisał:
    Po stronie komputera dane rozdzielane są na podstawie przecinka jako "token" i koniec ramki wykrywany jest na podstawie "\n".
    A dlaczego nie \r\n? Dlaczego nie ReadLine?

    lbrycht napisał:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Niestety przy szybkich zmianach położenia układu (żyroskop, kompas) zdarza się odbiór pojedyńczych linii "krzaków". Wtedy program się zawiesza.
    Przy spełnieniu warunku niepotrzebnie czytasz do rx_str. Dziwne też, że przypisujesz spację a nie pusty ciąg. Rozumiem, że jest to zabezpieczenie przed odebraniem części ramki. Jednak takie zabezpieczenie powinno być zaimplementowane w metodzie parsującej. Uważam, że w DataReceived nie powinno się używać metod, które czekają na więcej danych niż jest dostępnych. Zauważ, że stracisz ramkę, jeśli w DataReceived "przyjdzie" więcej niż jedna ramka. Sugeruję stworzyć nowy wątek (z użyciem klasy Thread) i w nim, w pętli odbierać dane.

    lbrycht napisał:
    Ponadto przy zamykaniu połączenia w aplikacji prawie zawsze przy linii kodu:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    pojawia się ERROR:"IOException was unhandled Operacja We/Wy została przerwana z powodu zakończenia wątku lub żadania aplikacji."

    Wydaje mi się, że raz na jakiś czas, gdy trafię akurat na koniec ramki to aplikacja poprawnie się wyłącza ale zazwyczaj jest ten błąd.
    Podczas zamykania aplikacji port jest zamykany, metoda nie ma już szans zwrócić oczekiwanej wartości, więc zostaje jej rzucenie wyjątku. Wyjątki się obsługuje.

    0
  • #3 19 Kwi 2014 20:09
    tomi1800
    Poziom 9  

    Witam, czy rozwiązałeś już swój problem? Bo mam coś podobnego, a mianowicie (wskazuje mi na ten fragment kodu, na linijkę "com_string2 = serialPort2.ReadLine();"):

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Błąd typu: IOException was unhandled
    o treści: "Operacja We/Wy została przerwana z powodu zakończenia wątku lub żądania aplikacji."

    Błąd pojawia się losowo, ogólnie piszę aplikację do odczytywania ramek NMEA w RT, które są wyświetlane w richTextBox'ie. Błąd wyskakuje gdy zamykam port com.

    Jeśli ktoś wie co może być przyczyną, to proszę o pomoc.

    Sorry, następnym razem poprawnie wrzucę kod w syntax :). Dzięki za poprawienie.

    0
  • #4 19 Kwi 2014 21:46
    LED5W
    Poziom 32  

    Przeczytaj mój post wyżej.
    Przyczyna rzucania wyjątku jest taka sama.

    0
  • #5 19 Kwi 2014 21:59
    tomi1800
    Poziom 9  

    Ok, dzięki nie pomyślałem, że to tyczy się tego samego. Myślałem, że kolega wyżej olał problem.

    LED5W - możesz mi troszkę bardziej pomóc, bo nie bardzo wiem co masz na myśli z utworzeniem nowego wątku. Jakiś przykładowy sampel albo artykuł? Ewentualnie fragment kodu. Proszę o pomoc, ponieważ nie jestem jakimś prawdziwym programistą, tylko uczę się od marca, a wszystko to na rzecz napisania programu, która ułatwi mi pomiary do pracy magisterskiej. Z tego powodu nie uczyłem się języka C# w sposób prawdopodobnie "idealny/poprawny" tylko "szarpany" i "intuicyjny". Krótko mówiąc: staram się pisać, to co mi potrzebne w danym momencie, a jeśli nie wychodzi, to szukam przykładów/gotowców/artykułów, coś czytam i dłubie :).

    0
  • #6 19 Kwi 2014 22:07
    Mirek Z.
    Moderator

    Nie dopisujemy się do obcych tematów! Zamykam.

    0