w przypadku zaawansowanego używania zaawansowanych funkcji portu COM w języku C# należy
już tak napisać program by nie był związany z konkretnym numerem portu COM , a umożliwiał jego wybór
ale też nie tylko wysyłał znaki (char) ale też odbierał i wysyłał stringi.. co tez zrobimy w prostym terminalu
Oczywiście nie będziemy się bawić w opisywanie jak utworzyć projekt i takie tam , bo jest to opisane na
forum i nie tylko , a jak ktoś nie wie to niech zacznie od początku albo sobie poszuka
Zaczynamy....
Nasz formularz zatem w nowym projekcie wyposażamy w :
kilka labeli , przyciski 2 , combo box , textboxy ...
oraz dodajem coponenty serialPort i InfoStrip
całość może wyglądać tak:
nie ważne .... to tylko wygląd ....
zmieniamy sobie wpisy w labelach i na butonach na odpowiednie opisujące spełnianą funkcję co widać wyżej
i przechodzimy do kodu:
Jak widzicie tutaj zadziałamy jeszcze inaczej gdyż niema klawisza Otwórz port
ale będziemy wybierać port z naszego comboBoxa, istotne też są okna Odebranych i wysyłanych danych
oraz pasek statusu który nas poinformuje o ustawieniach wybranego portu COM:
wiec jedziemy :
Nie owijając w bawełnę nasz kod powinien wyglądać w całości tak :
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wielu pewnie nie zauważyło , ale component serialPort umożliwia nam w łatwy sposób uzyskanie nazw wszystkich
dostępnych portów COM w komputerze poprzez funkcję :
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
dzięki temu gdy już znamy wszystkie porty możemy łatwo wstawić je do naszego comboBoxa:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dzięki powyższemu wpisowi możemy łatwo wybierać port com z rozwijalnej listy comboBoxa:)
Jednak zawsze istnieje obawa że wybrany port jest już używany w innym programie dlatego możemy
próbować przechwycić informacje i wyświetlić komunikat odpowiedni np w taki sposób:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Lub jeśli chcemy coś wysłać bez wybrania portu i jego otwarcia :
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Co jak widać umieszczamy w evencie przycisku Wyślij , gdzie w wypadku nie wybrania portu dostaniemy komunikat :
Oczywiście niema kłopotu z transmisją danych do okna Odbiorczego co moglibyśmy
prosto zapisać np :
textIn.Text = InputData; Ale mimo iż jest to proste będziemy mieć kłopoty z transmisją danych , gdyż bedziemy mnożyć
różne wątki ... np w powyższym wypadku problem polega na tym że wątek przekazujący dane z RS do pola
tekstowego , będzie inny niż wątek który zaczynał przekaz (mam nadzieję ze jest to zrozumiałe) i dlatego
zamiast stosować np:
SetText(InputData); utworzymy sobie delegata calbacka
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i teraz funkcję SetText(); zdefiniujemy bezpiecznie:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nasza funkcja jak widać porówna ID wątku wywołującego z ID wątku który utworzył połaczenie
i jeśli będą one różne zwróci wartość TRUE:
łatwe prawda ?
Oczywiście reszta wynika z kodu który jest banalnie prosty .... i większego omówienia nie wymaga:)
Skompilowany program do zabawy macie w załączniku
A później opiszemy jeszcze bardziej specjalne wywołania portów Serial w naszych aplikacjach które naprawdę
łatwo napisać i używać do sterowania urzadzeń