Serialport, strumień danych z GPS

szukaj na forum nowy temat odpowiedz

Strona [ 1 ] z 1

adam22_22 ten post 09-03-2010 21:02





Witam, zacznę od tego, że chciałem napisać małą aplikację która pobierze tylko współrzędne z odbiornika GPS.
Jestem posiadaczem nawigacji  Manta GPS 420, dziś ją odblokowałem i na windowsa CE zainstalowałem CF 3.5 .
Przystąpiłem do pracy, lecz niewiele później spotkał mnie pierwszy poważny problem - mianowicie program nie czyta danych z odbiornika GPS. Program nie odczytuje jakichkolwiek danych (i to mnie martwi) , zazwyczaj MapaMap pokazuje dostęp do 3 satelit, sekrety życia w bloku (nawet przy oknie :/). Mapamap również nie pokazuje aktualnej pozycji, ale logicznie rzecz biorąc - skoro mamy już 3 satelity, to jakieś dane muszą do nas docierać, a program (mapamap) pewnie sam wyciąga średnią z kilku nadajników.

Spore kłopoty miałem również z ustaleniem portu i do dziś go nie znam :/ Sprawa jest dość "dziwna" bo AutoMapa wskazuje COM7. W rejestrze systemowym nic nie ma zapisane, jedynie to, że GPS jest na porcie COM i jakaś wartość Index = 7 tam też występuje.

Postanowiłem zrobić bardzo krótki program czyli  :
           
for(int i=1;i<9;i++)
            {
                try
                {
                    port.PortName = ("COM" + i);
                    port.Open();
                    listBox1.Items.Add("Port :" + i + ": został pomyślnie otwarty");
                    port.Close();
                }
                catch (Exception)
                {
                   listBox1.Items.Add("Port :" + i + "nie może zostać otwart !");
                    port.Close();
                }
            }


Wyniki są następujące : COM1, COM2, COM6 są cały czas otwarte. Gdy system złapie sygnał z jakiegoś nadajnika, automatycznie otwierany zostaje port COM5.

Tutaj przedstawię kod, którym próbuję pobrać informacje od odbiornika :
                int dostepne = port.BytesToRead;
                byte[] buffer = new byte[dostepne];
                port.Read(buffer, 0, dostepne);
                string data = Encoding.UTF8.GetString(buffer, 0, dostepne);
                listBox1.Items.Add(data);
                Thread.Sleep(500);


próbowałem także z różnymi ustawieniami port np.
            port.BaudRate = 4800;
            port.DataBits = 8;


Jako, że program do "testowania" portów jest napisany w stylu otwarty <> zamknięty, próbowałem także pobrać  dane z COMa, który może być otwarty (kończyło się crashem aplikacji).
Przejdź na górę strony
cytuj
dam1en ten post 10-03-2010 07:21


Użytkownik
Status: Offline
Dołączył: 27-02-2008

To, na którym porcie działa odbiornik zależy od odbiornika, więc port wyczytasz z manuala odbiornika (jeżeli Mapmap widzi go na 7, to myślę, że działa na 7). Odbiornik zaczyna generować dane dopiero po kilku sekundach od otwarcia portu. Dane z odbiornika wczytuj sobie do stałej tablicy, żeby nie tworzyć co chwilę nowej (i tak aktualne dane to kilka ostatnich linijek). Czytaj z portu nie częściej niż co sekundę bo co sekundę generowane są dane. Chętnie Ci pomogę bo właśnie pisałem taką aplikację na win mobile.
Przejdź na górę strony
cytuj
adam22_22 ten post 10-03-2010 17:02





Dzięki za odp. Choć niestety puki co niewiele ona zmieniła ;) Ogólnie dane pobieram za pomocą przycisku więc i ode mnie zależy czas ( Thread.sleep to pozostałość po timerze). Błąd dalej jest, port COM7 jest cały czas zamknięty, więc nie mogę go otworzyć, a gdy chce popbrać dane robi się crash aplikacji. Gdy dodaję dane z otwartych pól, po prostu dodaje mi do listboxa puste dane i nic więcej. Kod nie jest skomplikowany i nie wiem gdzie może leżeć błąd -- na pewno gdzieś leży ;)

Główną przeszkodą jest czas którego każdy ma bardzo niewiele ;)
Przejdź na górę strony
cytuj
dam1en ten post 10-03-2010 18:03


Użytkownik
Status: Offline
Dołączył: 27-02-2008

Spróbuj tak:
char[] buffer = new char[4096];
int counter;
SerialPort port = new SerialPort("COM3", 4800, Partity.None, StopBits.One);
port.ReadTimeout = 200;
try{
port.Open();
}catch(Exception){}

if(port.IsOpen){
        try{
        counter = port.Read(buffer, 0, 4096);
        }catch(Exception){}
}
Przejdź na górę strony
cytuj
adams85 ten post 11-03-2010 10:20


Użytkownik
Status: Offline
Dołączył: 21-12-2009

Spróbuj przeanalizować kod tego programu, może wpadniesz na jakieś rozwiązanie
http://www.codeproject.com/KB/mobile/Termie.aspx
Przejdź na górę strony
cytuj
szukaj na forum nowy temat odpowiedz

Strona [ 1 ] z 1

1 użytkownik(ów) przegląda ten temat (1 gości)
(żadnych zarejestrowanych użytkowników)

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0474 sek. (zapytań SQL: 9)