Visual C# — Port COM – część 2

Visual C# — Port COM – część 2
Razem głosów: 5 co stanowi: 92% całości.

rs_232_logo

Najprostszą z możliwych metodę połączenia z COM (RS-232) już poznaliśmy w poprzedniej części, ale 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 też zrobimy w prostym terminalu…

Zaczynamy….

Nasz formularz zatem w nowym projekcie wyposażamy w :
kilka labeli , przyciski 2 , combo box , textboxy …
oraz dodajemy komponenty serialPort i InfoStrip,. a całość może wyglądać tak:

54cd3be028a04851e2c25d641bb7d5b0

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:

Nie owijając w bawełnę nasz kod powinien wyglądać w całości tak :

Pewnie nie zauważyliście , ale komponent serialPort umożliwia nam w łatwy sposób uzyskanie nazw wszystkich dostępnych portów COM w komputerze poprzez funkcję :

dzięki temu gdy już znamy wszystkie porty możemy łatwo wstawić je do naszego comboBoxa:

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:

Lub jeśli chcemy coś wysłać bez wybrania portu i jego otwarcia :

Co jak widać umieszczamy w evencie przycisku Wyślij , gdzie w wypadku nie wybrania portu dostaniemy komunikat :

54cd3be028a04851e2c25d641bb7d5b0

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

i teraz funkcję SetText(); zdefiniujemy bezpiecznie:

Nasza funkcja jak widać porówna ID wątku wywołującego z ID wątku który utworzył połączenie i jeśli będą one różne zwróci wartość TRUE:

Proste prawda ?

Oczywiście reszta wynika z kodu który jest banalnie prosty …. i większego omówienia nie wymaga:),  później opiszę jeszcze bardziej specjalne wywołania portów Serial w naszych aplikacjach które naprawdę łatwo napisać i używać do sterowania urządzeń

 

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay