[C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...

  • 17 Odpowiedzi
  • 13004 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline tzok

  • 21
[C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« dnia: Marzec 26, 2009, 21:40:23 »
GPS Intermediate Driver poza dostarczaniem wyników parsowania zdań NMEA umożliwia również współdzielony dostęp do surowych danych z GPS, niestety nie mogę sobie poradzić z dostępem do nich. Są one dostępne przez wirtualny port COM ale nie można go tak zwyczajnie otworzyć, a bardzo mi na tym zależy... mam działający program i dla fizycznego portu COM na którym jest GPS wszystko działa, a dla tego wirtualnego - nie. Natomiast w programie AutoMapa czy wybiorę port fizyczny czy wirtualny - wszystko działa poprawnie.

Zaletą wirtualnego portu jest to, że może z niego korzystać równocześnie wiele aplikacji... tylko jak?

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #1 dnia: Marzec 27, 2009, 06:51:14 »
Grzebałeś tutaj: http://msdn.microsoft.com/en-us/library/ms894898.aspx

tutaj jeszcze masz dyskusję:
http://social.msdn.microsoft.com/Forums/en-US/windowsmobiledev/thread/f0a362e8-d24c-4acf-802c-48a2ba36254c/
wynika stąd, że trzeba załadować urządzenie tego virtualnego gps wcześnej.
Przykład z portem szeregowym poprzedzonym otwarciem urządzenia jest w sekcji odnośnie programowania BT na msdn.
« Ostatnia zmiana: Marzec 27, 2009, 07:30:56 wysłana przez miba »

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #2 dnia: Marzec 27, 2009, 19:04:52 »
Na MSDNie wygrzebałem tylko to - http://msdn.microsoft.com/en-us/library/ms889504.aspx ale nie wiem jak miałbym z tego skorzystać w C#, to o czym tam mowa to natywne funkcje z coredll.dll ale jak i kiedy je wywoływać, komponent portu szeregowego z .NET generuje zdarzenia, a ta funkcja...

W tym poście którym podałeś koleś pisze, że jemu Intermediate Driver nie chce "wstać" a po wirtualnym porcie działa, ale obawiam się że on myli wirtualny port z fizycznym... próbowałem otworzyć ten port tak przed aktywowaniem jak i po aktywowaniu GPSa.
« Ostatnia zmiana: Marzec 27, 2009, 19:29:03 wysłana przez tzok »

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #3 dnia: Marzec 28, 2009, 09:46:39 »
Możesz przesłać kawałek kodu w którym otwierasz ten port i kawałek w którym czytasz dane? Ciężko mi coś konkretnego powiedzieć jak nie mam czarno na białym co nie działa. W netcf chyba też można podłączać sie do natywnego kodu więc nie powinno być tragedii. Byle rozgryźć czy samo otwarcie portu wystarczy. Mi sie wydaje że nie - piszą coś że trzeba ustawić dane w rejestrze i wywołać funkcję kontrolną z komendą odświerz.  Są też jakieś funkcje do włączania i wyłączania drivera. Ja to widzę tak piszesz krótki kod w C włączający/incjalizujący driver. Łączysz kod z C# i dalej używasz już portów szeregowych w net po swojemu.

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #4 dnia: Marzec 28, 2009, 18:37:06 »
Driver działa i odbieram z niego dane, chciałem też wyświetlać "RAW Data" ale w ogóle nie mogę otworzyć wirtualnego portu tworzonego przez driver. GPS mam zintegrowany, do jego portu fizycznego mogę się podłączyć i odczyt RAW data działa, tylko że otwarcie portu fizycznego blokuje inne aplikacje w tym driver.

Nie znam C i nie potrafię w nim nic napisać.

Problem jest do powtórzenia na Device Emulator, wystarczy zainstalować Fake GPS z SDK Windows Mobile 6 (działa z WM 5) i włączyć intermediate driver.

Tak ustalam identyfikator wirtualnego portu obsługiwanego przez Intermediate Driver:

            // BEGIN: Ustalenie ID wirtualnego portu COM
            bool success = true;
            try
            {
                RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\GPS Intermediate Driver\Multiplexer", false);
                gps_com = ((string)reg.GetValue("DriverInterface")).Substring(0, 4);
            }
            catch
            {
                MessageBox.Show("Błąd dostępu do rejestru");
                success = false;
            }

            if (success)
            {
                try
                {
                    comport = new SerialPort(gps_com);
                }
                catch
                {
                    MessageBox.Show("Błąd podczas otwierania portu " + gps_com);
                    success = false;
                }
            }
            if (!success)
                this.Close();
            // END: Ustalenie ID wirtualnego portu COM

Tak go otwieram:

comport.Open();
i dostaję taki wyjątek:

<< -- KLIK

Oczywiście sprawdzałem z portem ustawionym na sztywno jako "COM4" (bo taki jest ustawiony w sterowniku) i ten sam efekt.

Automapa działa zarówno jeśli wybiorę COM4 (wirtualny) jak i COM2 (fizyczny).

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #5 dnia: Marzec 28, 2009, 19:34:37 »
Sprawdzę co i jak z tym wirtualnym GPS na swoim PDA ale mi tu jakby trochę brakuje ustawień fizycznych parametrów portu. Niby wirtualny ale normalnie programy przed rozpoczęciem odczytu ustawiają te parametry i może MS chciał zachować kompatybilność w tym zakresie.

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #6 dnia: Marzec 28, 2009, 19:51:36 »
Mogę podawać parametry, niczego to nie zmienia... testowane zarówno na fizycznym urządzeniu (Mio P550m) jak i na emulatorze.

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #7 dnia: Marzec 29, 2009, 00:59:41 »
Coś te porty seryjne w netcf są pokićkane. Faktycznie mam takie sam jaja jak Ty. Jak podłącze GPS przez BT to ok, otwiera. Jak ten od drivera to klapa. Ale  udało mi się coś takiego:

System.IO.FileStream fs = System.IO.File.Create("COM5:");

na COM5 jest u mnie wirtualny driver. Nie wywaliło wyjątku. Poszło też z GPD1: ( ekwiwalent tego portu ) oraz GPD0:
Może spróbuj czy odczyty dają sensowne wyniki surowych danych.

Jest może jakiś sposób żeby ten deployment aplikacji skrócić dla projektu C#? Ew. żeby nie ładował wszystkich dodatków.

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #8 dnia: Marzec 29, 2009, 13:32:38 »
Jak sobie zrobisz Save State na Device Emulatorze to nie będzie musiał za każdym razem instalować .NET CF 2.0/3.5 (WM ma preinstalowany tylko 1.0).

Niestety nie wiem od czego to zależy ale sam Deploy, bez kompilacji czasem trwa mi 3-4s a czasem koło 30s... sam emulator też nie powala szybkością działania.

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #9 dnia: Marzec 29, 2009, 15:22:24 »
Ładowałem app na prawdziwego pocketa. Mam na nim netcf3.5 zainstalowany przypadkiem i mimo to mi ładował wsparcie dla net-a 2.0 Trochę to chore. Aplikacje w c++ pisane szybko szły.
 
Daj znać co z tego strumienia wyciągasz. Niestety nie mam czasu wczytywać się w spec protokołu a dobrze byłoby wiedzieć czy przez plik da się dobrać do tego virtualnego GPS-u. Niby powinno być ok, bo na najniższym poziomie zdaje się jest wywoływana CreateFile a to jest to, o co chodzi.

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #10 dnia: Marzec 29, 2009, 15:40:06 »
Nie potrafię nic z tego odczytać przy próbie wywołania fs.Read(...) dostaję wyjątek "NotSupportedException".

Powinienem otrzymać ciąg sentencji NMEA, wyglądający mniej więcej tak:
$GPGSA,A,3,08,27,10,28,13,19,,,,,,,2.6,1.4,2.3*3E
$GPRMC,191940.767,A,4738.0173,N,12211.1869,W,0.096214,42.86,291004,,*27
$GPGGA,191941.767,4738.0174,N,12211.1868,W,1,06,1.4,33.1,M,-17.2,M,0.0,0000*74
$GPGLL,4738.0174,N,12211.1868,W,191941.767,A*29
$GPGSA,A,3,08,27,10,28,13,19,,,,,,,2.6,1.4,2.3*3E
$GPRMC,191941.767,A,4738.0174,N,12211.1868,W,0.085352,51.04,291004,,*29
$GPGGA,191942.767,4738.0175,N,12211.1868,W,1,06,1.4,32.9,M,-17.2,M,0.0,0000*7F
$GPGLL,4738.0175,N,12211.1868,W,191942.767,A*2B
$GPGSA,A,3,08,27,10,28,13,19,,,,,,,2.6,1.4,2.3*3E
$GPRMC,191942.767,A,4738.0175,N,12211.1868,W,0.127249,18.18,291004,,*29
$GPGGA,191943.766,4738.0176,N,12211.1868,W,1,06,1.4,32.7,M,-17.2,M,0.0,0000*72
$GPGLL,4738.0176,N,12211.1868,W,191943.766,A*28
$GPGSA,A,3,08,27,10,28,13,19,,,,,,,2.6,1.4,2.3*3E
$GPRMC,191943.766,A,4738.0176,N,12211.1868,W,0.066870,57.51,291004,,*28
$GPGGA,191944.766,4738.0177,N,12211.1868,W,1,06,1.4,32.6,M,-17.2,M,0.0,0000*75
$GPGLL,4738.0177,N,12211.1868,W,191944.766,A*2E
$GPGSA,A,3,08,27,10,28,13,19,,,,,,,2.6,1.4,2.3*3E
$GPGSV,3,1,9,8,71,307,42,27,78,59,42,3,21,47,0,10,26,283,34*76
$GPGSV,3,2,9,29,13,317,0,28,37,226,39,13,32,155,35,19,37,79,41*4C
$GPGSV,3,3,9,134,0,0,0*46

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #11 dnia: Marzec 29, 2009, 15:50:23 »
A jak w ten sposób otworzysz com-a sprzętowego gps-u też nic nie odczytuje? Niestety nie mogę w teraz przetestować. :(

*

Offline globalbus

  • Ekspert PDA
  • ******
  • 6139
  • Płeć: Mężczyzna
  • Power User // ROM Developer
  • Sprzęt: N900
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #12 dnia: Marzec 29, 2009, 15:56:19 »
tak wiem, że to będzie lamerskie rozwiązanie, ale nie prościej włączyć w sterowniku gpsid logowanie info do pliku i odczytywać go na bieżąco?
"Wiedza zdobyta samodzielnie jest więcej warta niż przekazana przez inną osobę"

"ponieważ gotowanie to nie jest copy/paste"
paypal

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #13 dnia: Marzec 29, 2009, 16:00:49 »
Ja tu widzę taki problem, że nie wiedziałbyś z jakich momentów te próbki pochodzą ( chyba że jest to w nich zapisane ). No i dodatkowo troche się wkurzyłem, że ten serial nie działa, a nie lubie nierozwiązanych problemów :S

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #14 dnia: Marzec 29, 2009, 16:07:08 »
Jeśli GPSID w WM5 ma możliwość logowania do pliku to ostatecznie mogło by to być, ale zdecydowanie wolałbym jakoś z portu to czytać, bo tak przynajmniej mam zdarzenie które obsługuję, a w przypadku pliku, skąd mam wiedzieć kiedy go czytać? Potrafię czytać pliki których rozmiar znam, a to jest niekończący się strumień danych, które na dodatek pojawiają się "porcjami".

P.S.
FakeGPS z SDK WM6 działa pod WM5 ale podaje jakieś bzdury (tzn. dokładnie to podaje zamiast 144d 25m 18s - 14425d 18m 1s) jako współrzędne i na początku po włączeniu wywala przykładową aplikację błędem dzielenia przez zero... (nawet tę z SDK WM6 przerobiona na WM5). Tak więc lepiej testować pod WM6.
« Ostatnia zmiana: Marzec 29, 2009, 16:11:10 wysłana przez tzok »

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #15 dnia: Marzec 29, 2009, 16:10:54 »
Proponowałbym jednak rozwalić ten problem. Jakoś się da na pewno. Jak nie robi Ci to problrmu to zmień w kodzie com na ten od sprzętowego gps i sprawdź czy wyjątek wywala Dopiero wieczorkiem będe przy swoim kompie.

*

Offline tzok

  • 21
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #16 dnia: Marzec 29, 2009, 16:17:40 »
Proponowałbym jednak rozwalić ten problem. Jakoś się da na pewno. Jak nie robi Ci to problrmu to zmień w kodzie com na ten od sprzętowego gps i sprawdź czy wyjątek wywala Dopiero wieczorkiem będe przy swoim kompie.

Jeśli wskażę fizyczny port wywala IOException już przy próbie utworzenia strumienia...

*

Offline JaJuzWiemKto

  • *
  • 55
  • Sprzęt: Toshiba G900
Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
« Odpowiedź #17 dnia: Czerwiec 23, 2009, 00:14:45 »
Sprawdź może czy przypadkiem port nie jest już otwarty i jeśli nie jest to dopiero go spróbuj otworzyć.

if(comport.IsOpen == false)
{
          try
          {
                    comport.Open();
          }
          catch
          {
                    MessageBox.Show("Nie można otworzyć portu GPS");
          }
}