2009/12/21

.NET/ GPS/ SerialPort i takie tam

W dzisiejszych czasach wielu z nas posiada w swoich zasobach sprzętowych GPS'a. Czy to na USB, czy BlueTooth czy też w końcu port szeregowy. Wydawałoby się, że jest to urządzenie tak magiczne, że tylko niektórym uda się je poprawnie obsłużyć. Okazuje się jednak, że w rzeczywistości, nie jest to jakieś specjalnie trudne. GPS, jest widoczny w systemie jako port szeregowy, który inicjujemy następującymi parametrami
  • prędkość: 9600 baud
  • parzystość: 1 bit
  • dane: 8 bitów
W .NET można to swobodnie zrobić przy pomocy obiektu SerialPort. Jako, że komunikaty GPS(NMEA) przychodzą do nas w liniach bardzo pomocna będzie metoda ReadLine(). Komunikaty przychodzą w sposób ciągły, więc funkcję odczytującą je należałoby zamknąć w innym wątku.

Tu właśnie zaczynają się schody, gdyż
  • Do odpalania metod obiektów operujących w innym wątku służy Invoke().
Najzwyczajniej w świecie musimy do obiektu wątku przekazać jako parametr obiekt, który będzie aktualizował dane na ekranie.
  • Obiekt SerialPort potrafi rzucić wyjątkiem podczas próby odczytu, w trakcie zamykania z innego wątku. Jest to ten rodzaj wyjątku, którego nie da się w sposób łatwy przechwycić.
Aby pozbyć tego niemiłego akcentu należy wykonać kombinację alpejską i umieścić odczyt danych z portu szeregowego w bloku finally, gdzie musimy przechwytywać wyjątek pochodzący właśnie z SerialPort.

I tym oto sposobem po kilku godzinkach przeglądania stron i przeszukiwania internetu udało mi się popełnić prostą aplikację, która wskazuje na GoogleMaps, gdzie się aktualnie znajdujemy.

Zapraszam do pobrania i lektury kodu aplikacji

Zastrzegam, że nie ponoszę żadnej odpowiedzialności za straty powstałe w wyniku wykorzystania stworznej przeze mnie aplikacji . Taki Lajf :>

Rafał Prasał