(przeniesione z działu programowanie C#)
Hej
Od jakiegoś czasu mam problem z nietypowym zastosowaniem Serial Port. Wszystkie poradniki pokazują jak wykorzystać go w celu odbierania danych w trybie terminalu, a ja potrzebuję go użyć nieco inaczej i nie mogę sobie z tym poradzić (to znaczy niby napisałem jakiś kod który działa, ale mnie zbluzgali na elektrodzie że jest brzydki i w sumie to mają rację
). Oto co potrzebuję osiągnąć.
Chcę napisać osobną klasę do komunikacji z AVRem na zasadzie rozkazów i odpowiedzi. Wymusza to jedną poważną rzecz: w funkcji wysyłającej komendę muszę ZATRZYMAĆ program do czasu otrzymania odpowiedzi. Tak dokładniej, to najpierw trzeba utworzyć ramkę, potem ją wysłać, a następnie odczytywać dane aż w buforze nie będzie całej ramki odpowiedzi.
Do tego celu napisałem sobie funkcję ReadBytes, która zatrzymuje program i czeka dopóki nie odczyta zadanej ilości bajtów. Tak to wyglądało w moim pierwotnym rozwiązaniu:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Działać - działało, jednak mimo że nie znam się na pisaniu aplikacji okienkowych pod PC, to nawet ja widzę że to rozwiązanie jest po prostu złe
.
Ostatnio postanowiłem trochę to przerobić - poczytałem o zdarzeniu DataReceived i zapowiadało się całkiem fajnie, ale wyszło jak zwykle... próbowałem czegoś takiego:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Niestety podczas używania w serial_DataReceived otrzymuję błąd o indeksie spoza zakresu tablicy. W debugerze wygląda to jakby bufferindex miał przypisaną losową ujemną wartość. Zamieniłem to na coś takiego:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ale efekt jest identyczny. Coś czytałem o tym że jak tworzony jest drugi wątek to nie można się w nim odnosić do kontrolek z pierwszego, ale przecież tablica i liczba to nie kontrolki
.
Moglibyście mi coś doradzić w tym temacie? Jak najlepiej to rozegrać? Tylko proszę o wyjaśnienie jak dla laika, nigdy nie pisałem w C#, ani nie projektowałem aplikacji wielowątkowych.