PDAclub.pl - Forum użytkowników technologii mobilnych

Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: tzok w Marzec 26, 2009, 21:40:23

Tytuł: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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?
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w Marzec 27, 2009, 06:51:14
Grzebałeś tutaj: http://msdn.microsoft.com/en-us/library/ms894898.aspx (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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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:

(http://obrazki.elektroda.net/56_1238261711_thumb.gif) (http://obrazki.elektroda.net/56_1238261711.gif) << -- 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).
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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ć. :(
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: globalbus w 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?
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: miba w 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.
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: tzok w 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...
Tytuł: Odp: [C#][WM5] Jak odzczytywać dane z wirtualnego portu COM...
Wiadomość wysłana przez: JaJuzWiemKto w 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");
          }
}