Serialport, strumień danych z GPS

0

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).

0

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.

0

Dzięki za odp. Choć niestety pÓÓÓÓki 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 ;)

0

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){}
}
0

Spróbuj przeanalizować kod tego programu, może wpadniesz na jakieś rozwiązanie
http://www.codeproject.com/KB/mobile/Termie.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1