Форум программистов, компьютерный форум, киберфорум
Наши страницы
GPS, ГЛОНАСС
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Ekalips
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 28
1

Работа с GPS

07.08.2014, 16:19. Просмотров 1988. Ответов 6
Метки нет (Все метки)

Здравствуйте. Пишу программу,частью которой является получение данных от GPS (На всякий случай - GPS фирмы QSTARZ,модель BT-Q890). Проблема в том,что сразу при подключении к GPS данные приходят (координаты и т.д.) ,но после первого получения данные перестают меняться. Точнее не совсем перестают,а меняются очень редко,хотя нужный протокол приходит чуть ли не каждую секунду.

Подключение к GPS
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static void OpenPort(string PortName) {
 
            //port.PortName = PortName;
 
            if (!port.IsOpen)
            {
 
                port.PortName = PortName;
                port.Parity = Parity.None;
                port.BaudRate = 11520;
                port.StopBits = StopBits.One;
                port.DataBits = 8;
                port.Handshake = Handshake.None;
                try
                {
                    port.Open();
                }
                catch {
                    MessageBox.Show("Неверный порт/Порт недоступен");
                    Form1.IsPortOpen = false;
                    
                }
                if (port.IsOpen)
                {
                    Form1.ForOutputInfo = "Connected\n"; //инфо в блок отладки
                    MessageBox.Show("Connected");
                    Form1.IsPortOpen = true;
                }
 
            }
            else { Form1.ForOutputInfo = "PortIsOlreadyOpened\n"; 
            Form1.IsPortOpen = true;
            MessageBox.Show("Connected");
            }
 
          
 
        }

Получение информации
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public static void GetData()
        {
            if (port.IsOpen)
            {
                s = port.ReadLine();
                split = s.Split(',');
                if (split.Length > 1)
                {
                    Form1.ForControl += "\n" + split[0];
                    try
                    {
                        switch (split[0])
                        {
                            //из протокола $GPGGA берём высоту в метрах
 
                            case "$GPGGA": Form1.ForOutputInfo += "\n" + "высота в метрах " + split[9];
                                Height = Convert.ToDouble(split[9].Replace('.', ','));
 
                                break;
 
                            //из протокола $GPRMC берём время (Гринвич), широту, долготу, скорость (в узлах), курс
 
                            case "$GPRMC":
 
                                Form1.ForOutputInfo += "\n";
                                Form1.ForOutputInfo += "\n" + "Время " + split[1];
                                Form1.ForOutputInfo += "\n" + "Широта " + split[3].Substring(0, 2) + " градусов " + split[3].Substring(2, 2) + " минут " + split[3].Substring(5, split[3].Length - 5) + " секунд ";
                                Form1.ForOutputInfo += "\n" + "Долгота " + split[5].Substring(1, 2) + " градусов " + split[5].Substring(3, 2) + " минут " + split[5].Substring(6, split[5].Length - 6) + " секунд ";
                                Form1.ForOutputInfo += "\n" + "Скорость относительно земли, узлов " + split[7];
                                Form1.ForOutputInfo += "\n" + "Курс " + split[8];
                                curs = Convert.ToDouble(split[8].Replace('.', ','));
                                speed = Convert.ToDouble(split[7].Replace('.', ','));
 
                                //перевод широты и долготы в градусы, минуты, секунды
 
                                x1 = Convert.ToInt32(split[3].Substring(0, 2));
                                double temp = Convert.ToInt32(split[3].Substring(2, 2));
                                temp = temp * 0.0166666666667;
                                x1 = x1 + temp;
                                temp = Convert.ToInt32(split[3].Substring(5, split[3].Length - 5));
                                temp = temp / 10000;
                                if (temp >= 60)
                                {
                                    temp = temp - 60;
                                    x1 = x1 + 0.01;
                                }
                                temp = temp * 0.0002777777777778;
                                x1 = x1 + temp;
                                Form1.ForOutputInfo += "\n" + "lat1 = " + x1.ToString();
 
                                y1 = Convert.ToInt32(split[5].Substring(1, 2));
                                temp = Convert.ToInt32(split[5].Substring(3, 2));
                                temp = temp * 0.0166666666667;
                                y1 = y1 + temp;
                                temp = Convert.ToInt32(split[5].Substring(6, split[5].Length - 6));
                                temp = temp / 10000;
                                if (temp >= 60)
                                {
                                    temp = temp - 60;
                                    y1 = y1 + 0.01;
                                }
                                temp = temp * 0.0002777777777778;
                                y1 = y1 + temp;
                                Form1.ForOutputInfo += "\n" + "long1 = " + y1.ToString();
 
                                Distance = Distanse.gps_distance(x1, y1, Form1.lat2, Form1.long2);
                                Azimut = Distanse.gps_azimut(x1, y1, Form1.lat2, Form1.long2);
                                Form1.Distance = Convert.ToString(Distance);
                                Form1.Azimut = Convert.ToString(Azimut);
                                DataHendler.Latitude = x1;
                                DataHendler.Longitude = y1;
                                Form1.Latitude = Convert.ToString(x1);
                                Form1.Longitude = Convert.ToString(y1);
                                Form1.Altitude = Convert.ToString(Height);
                                Form1.ForOutputInfo += "\n" + "Distanse between points = " + Distance;
                                Form1.ForOutputInfo += "\n" + "Azimut between points = " + Azimut;
                                Form1.Speed = Convert.ToString(speed);
                                Form1.Curs = Convert.ToString(curs);
                               
                                break;
                            default: break;
                        }
                    
 
                    //расчёты расстояния и азимута
 
                            //Form1.ForOutputInfo += "\n" + "long1 = " + y1.ToString();
                            Distance = Distanse.gps_distance(x1, y1, Form1.lat2, Form1.long2);
                            Azimut = Distanse.gps_azimut(x1, y1, Form1.lat2, Form1.long2);
                            Form1.Distance = Convert.ToString(Distance);
                            Form1.Azimut = Convert.ToString(Azimut);
                            Form1.Latitude = Convert.ToString(x1);
                            Form1.Longitude = Convert.ToString(y1);
                            Form1.Altitude = Convert.ToString(Height);
                            Form1.ForOutputInfo += "\n" + "Distanse between points = " + Distance;
                            Form1.ForOutputInfo += "\n" + "Azimut between points = " + Azimut;
                            Form1.Speed = Convert.ToString(speed);
                            Form1.Curs = Convert.ToString(curs);
                           // MessageBox.Show("Got It");
 
                    }
                    catch { }
                      
                   
                }
            }
        }
Поток,в котором все это происходит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 public void GPSData()
        {
            while (true)
            {
                if (IsPortOpen)
                {
 
                    try
                    {
                        lat2 = Convert.ToDouble(textBox2.Text);
                        long2 = Convert.ToDouble(textBox3.Text);
                    }
                    catch { }
                    Program.GetData(); 
                    
 
                   // textBox4.Text = Latitude;
                    //DataHendler.Latitude = Convert.ToDouble(Latitude);//долгота
 
                   // textBox5.Text = Longitude;
                    //DataHendler.Longitude = Convert.ToDouble(Longitude);//широта
 
                  //  textBox6.Text = Altitude;
                    DataHendler.Altitude = Convert.ToDouble(Altitude);//высота
 
                  //  textBox7.Text = Distance;
                    DataHendler.Distance = Convert.ToDouble(Distance);//расстояние
 
                   // textBox8.Text = Azimut;
                    DataHendler.Azimut = Convert.ToDouble(Azimut);//азимут
 
                  //  textBox10.Text = Speed;
                    DataHendler.Speed = Convert.ToDouble(Speed);//скорость
 
                  //  textBox14.Text = Curs;
                    DataHendler.Curs = Convert.ToDouble(Curs);//курс 
                   // Thread.Sleep(500);
                }
            }
        }
Дополнительно :То,что происходит каждый тик
C#
1
2
3
4
5
6
7
8
9
10
11
12
 textBox11.Text = Convert.ToString(DataHendler.Wspeed);
                textBox12.Text = Convert.ToString(DataHendler.Press);
                textBox13.Text = Convert.ToString(DataHendler.Temper);
                textBox15.Text = Convert.ToString(DataHendler.Wspeed);
                textBox4.Text = Convert.ToString(DataHendler.Latitude);
                textBox5.Text = Convert.ToString(DataHendler.Longitude);
                textBox6.Text = Convert.ToString(DataHendler.Altitude);
                textBox7.Text = Convert.ToString(DataHendler.Distance);
                textBox8.Text = Convert.ToString(DataHendler.Azimut);
                textBox10.Text = Convert.ToString(DataHendler.Speed);
                textBox14.Text = Convert.ToString(DataHendler.Curs);
                textBox16.Text = Convert.ToString(DataHendler.ArdAltitude);
Буду благодарен за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2014, 16:19
Ответы с готовыми решениями:

Подключение GPS модуля Grove-GPS к Arduino UNO
Подсоединил Grove-GPS к Arduino UNO. Вот код программы: #include...

GPS модуль
Всем привет! Подскажите пожалуйста надёжный GPS модуль с UART и который не...

P(Y) код в GPS
Всем привет! Объясните, пожалуйста, как используется P(Y) код в гражданских...

UART GPS
Здравствуйте уважаемые форумчане! Необходимо подключить GPS приемник к...

Gps трекер
Добрый день. На работе выдали планшеты с gps трекером, отслеживают твой маршрут...

6
raxp
10186 / 6569 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.08.2014, 16:32 2
11520 - странно скопировали, а если так и есть, то скорость для модуля http://www.qstarz.com/download/BT-Q890-Users%20Manual-V2.pdf заявлена 115200 бит/сек (запятая в доке - тысячи).

Точнее не совсем перестают,а меняются очень редко,хотя нужный протокол приходит чуть ли не каждую секунду
сначала ошибка выше. Потом - данные при постоянстве координат и не должны особо меняться, так, десятые доли.

Где же я? Учимся работать с GPS на С++
0
Ekalips
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 28
07.08.2014, 16:46  [ТС] 3
Цитата Сообщение от raxp Посмотреть сообщение
11520 - странно скопировали, а если так и есть, то скорость для модуля http://www.qstarz.com/download/BT-Q8...0Manual-V2.pdf заявлена 115200 бит/сек (запятая в доке - тысячи).
Окей,сейчас попробую проверить
Цитата Сообщение от raxp Посмотреть сообщение
данные при постоянстве координат и не должны особо меняться, так, десятые доли.
Ничего вообще не меняется.
0
raxp
10186 / 6569 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.08.2014, 16:52 4
...определитесь: ничего вообще или все же все остальные месседжи приходят, а месседж $GPRMC приходит редко или не приходит.

Запустите portmon, лог обмена с момента инициализации порта в HEX отображении в txt-файле в тему в полном виде.
0
Ekalips
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 28
07.08.2014, 16:57  [ТС] 5
Цитата Сообщение от raxp Посмотреть сообщение
...определитесь: ничего вообще или все же все остальные месседжи приходят, а месседж $GPRMC приходит редко или не приходит.
$GPRMC приходит ,но данные,которые он "приносит" не меняются,а если и меняются,то раз в минуту,чего быть не может.
Цитата Сообщение от raxp Посмотреть сообщение
Запустите portmon, лог обмена с момента инициализации порта в HEX отображении в txt-файле в тему в полном виде.
Можно по-подробнее?
0
raxp
10186 / 6569 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.08.2014, 18:16 6
чего быть не может.
еще как может. Некоторые чипы так себя и ведут. Ищите полное руководство разработчика, весьма вероятно есть команда задания параметров выдачи.

Можно по-подробнее?
http://technet.microsoft.com/ru-ru/sysinternals/bb896644.aspx
0
Voland_
1663 / 1009 / 96
Регистрация: 04.01.2010
Сообщений: 3,366
12.08.2014, 15:22 7
Ekalips, насколько я помню, в том модуле, что я пробовал (SIM18?) каждая инфа имеет свой период отдачи модулем, в секундах. Можно также управлять присутствием этих самый строчек в перечне ответов. Может быть ваша инфа просто так настроена, чтобы отдаваться редко?
И еще вариант - обычно GPS-модули любят впадать в спячку (active-standby). Поищите в списке настроек когда у вашего модуля таймаут бездействия, и есть ли он. Может быть вы работаете именно из экономного режима, и тогда вполне вероятно, он "отдается" очень редко.
0
12.08.2014, 15:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 15:22

GPS передатчик
Добрый день всем. Нужен GPS передатчик, который можно будет встроить в...

GPS трекинг
Привет, кто сталкивался с проблемой "трекинга". Что я имею ввиду, GPS мне...

карта GPS offline
Есть прибор, который скидывает координаты через GPS навигатор и заносит их в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru