Odczyt z SerialPortu, dostępy z poziomu innego wątku.

0

Witam.
Na wstępie chciałbym przywitać się w sekcji c# (mój pierwszy post tutaj).
Piszę prosty program, odczytujący z serial portu dane z wkładek mierzących obciążenie, nacisk na podłoże.
Jako początkujący programista c# napotkałem kilka problemów, z którymi próbuję sobie poradzić.

  1. mam prostą funkcję, która odczytuje z serial portu dane, problem zaczyna się na tym, że flaga ETX w tym przetworniku ma postać "\n". Wrzucanie całego pakietu w string niestety nie zdaje egzaminu (flaga ETX jest traktowana jako koniec łańcucha).
    czy taka funkcja, prawidłowo odczyta mi dane z portu w trybie binarnym (odczytując i traktując każda wartość bajtowo?). Czy może traktuje ona odczytane dane tekstowo ?
    Link: http://wklej.org/id/3212914/
    Co do pętli (while, oraz następujący po niej for) - są do pętle bardziej w formie szkicu (niestety nie mam na co dzień dostępu do tych mat/wkładek, wiec jako takie testy są wykonywane co kilka dni). Stąd też kwestia zapisu do pliku (żebym chociaż w pewnym stopniu mógł pracować "offline).
    format pakietu (ogólnikowo):
    STX, sBitmap (informujący, że po nim wysłana zostanie "bitmapa), sx, sy (wymiary bitmapy na osi X i Y), następnie wartości w każdym węźle (2bajtowe, little endian), ETX

  2. uruchamiając nowy wątek odczytujący z portu, chciałem zrobić prostego "command-line" - informowanie mnie w TextBoxie, że np. wątek napotkał daną flagę w pakiecie, udało się stworzyć bitmape itp. Niestety nowouruchomiony wątek nie ma dostępu do danego TextBox'a. Może takie rozwiązanie nie jest niezbędne, natomiast w momencie w którym będę w stanie poprawnie odczytać poszczególne bitmapy, będę chciał kwestie odświeżania PictureBox'a również zrealizować w osobnym wątku, więc problem dostępu będzie podobny. Czy ktoś mógłby zaproponować mi jakieś rozwiązanie?

czekam na odpowiedzi, podpowiedzi, pomysły (hejtu mam nadzieję się nie doczekam :D)
pzdr,
Kwapa

#edit: co do pierwszego punktu, stąd moje pytanie bo o ile zapisanych pakietów do pliku mam sporo, to nie pojawia się fragment, który jednoznacznie określałby ramkę (bitmape), natomiast skopiowane na sztywno z COM'u (cmd -> copy com x >plik) już zawierają pakiety takie jak z dokumentacji.

0

Możesz wymieniać dane pomiędzy wątkami na kilka sposobów, ale chyba najlepszym z nich jest wykorzystanie delegatów..

  1. Uporządkuj ten kod bo masz straszną kaszanę. Np. Jak twój program się zachowa jeśli bytes będzie miało wartość 1?
0

http://wklej.org/hash/30151f26917/ - kod uporządkowany, w tej chwili program karmiony jest danymi z pliku (kopia danych z serial portu)
w takiej postaci prawidłowo tworzy mi pakiety, wrzuca je do kolejki, coś tam wyświetla (tak naprawdę to są to tylko szumy z przetwornika)

0

Witam.
Wiesz może jak działa SerialPort.Read() ? chodzi mi czy dane są w jakiś sposób kolejkowane ?
SerialPort.BytesToRead zwraca mi za każdym inna liczbę (jest to niewątpliwie logiczne). Czy ściąganie z portu do chwili aż SerialPort.BytesToRead osiągnie 0, nawet zwykłym whilem ma sens ?
Pozostaje mi jeszcze kwestia budowania gotowych pakietów (niestety, ale odczytując dane z portu w 90% przypadków dostaję jedynie część pakietu). Pakiet waży zawsze 6405B, SerialPort.BytesToRead zwraca przeważnie 3000-4000.
a może da się odczytywać po bajcie, wtedy poszukałbym jedynie STX'a i od tamtego momentu mógłbym składać pakiety.
pzdr

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