реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> NMEA информация с GPS, Как правильно считать и разобрать NMEA информацию
wookX
сообщение Apr 13 2007, 14:23
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 30-03-07
Пользователь №: 26 626



День добрый.
У меня возникла проблема.
Подключил ГПС приемник к компу.
Открыл в Матлаб СОМ порт. Подключился к ГПС приемнику. Считал NMEA информацию. А как теперь ее разобрать? Чтоб выделить Широту, долготу, время?
Листинг программы следующй:

%Create a serial port object.
obj1 = instrfind('Type', 'serial', 'Port', 'COM3', 'Tag', '');

%Create the serial port object if it does not exist
%otherwise use the object that was found.
if isempty(obj1)
obj1 = serial('COM3');
else
fclose(obj1);
obj1 = obj1(1)
end

%Connect to instrument object, obj1.
fopen(obj1);

%Read NMEA sequencies
for i=1:100
data1 = fscanf(obj1);
ID=sscanf(data1,'%6c',1)
If ID == '$GPRMC'
[UTC, Status, Latitude, NS, Longitude, EW, Speed, Course, Date, Magnetic, Mode]=strread(data1(8:end),'%s %s %s %s %s %s %s %s %s %s %s', 'delimiter',',')
Time(i)=str2num(UTC(1:2));
Time(i)=Time(i)+str2num(UTC(3:4))/60;
Time(i)=Time(i)+str2num(UTC(5:end))/3600;
%Time(i)=Time(i)+str2num(UTC(5:9))/3600;
Lat(i)=str2num(Latitude(1:2));
Lat(i)=Lat(i)+str2num(Latitude(3:end))/60;
%Lat(i)=Lat(i)+str2num(Latitude(3:10))/60;
if (NS == 'S')|(NS == 's')
Lat(i)=-Lat(i);
end
Long(i)=str2num(Longitude(1:3));
Long(i)=Long(i)+str2num(Longitude(4:end))/60;
%Long(i)=Long(i)+str2num(Longitude(4:11))/60;
if (EW == 'W')|(EW == 'w')
Long(i)=360-Long(i);
end
Vt(i)=str2num(Speed);
Psi(i)=str2num(Course);
end
%Disconnect from instrument object, obj1.
fclose(obj1);

%Clean up all objects.
delete(obj1);

Но вот не работает код sad.gif
После строки
[UTC, Status, Latitude, NS, Longitude, EW, Speed, Course, Date, Magnetic, Mode]=strread(data1(8:end),'%s %s %s %s %s %s %s %s %s %s %s', 'delimiter',',')

вылезает ошибка. Index Exceed Matrix Dimension
Когда я открыл переменную Status, то там было следующее:
UTC =
'182524'
С ковычками!!!!
А str2num не воспринимает строковую переменную в данном виде!
Может кто подскажет в чем проблема и как выделить информацию из NMEA???
Go to the top of the page
 
+Quote Post
Doka
сообщение Apr 13 2007, 15:53
Сообщение #2


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



Цитата(wookX @ Apr 13 2007, 15:23) *
Когда я открыл переменную Status, то там было следующее:
UTC =
'182524'
С кaвычками!!!!
А str2num не воспринимает строковую переменную в данном виде!
Может кто подскажет в чем проблема и как выделить информацию из NMEA???


так и удалите эти кавычки (если не изменяет память в матлабе со строками можно обращаться также как с элементами массивов, т.е. просто перекопируйте символы, исключив первый и последний)


PS: тему переношу, как не имеющу. отношения к "Rf & Microwave Design"


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
by-pass
сообщение Apr 13 2007, 23:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 13-09-05
Пользователь №: 8 518



Если не принципиальное сделать все на матлабе, то "все украдено до нас".
http://www.visualgps.net/Papers/NMEAParser/

Сообщение отредактировал by-pass - Apr 13 2007, 23:10
Go to the top of the page
 
+Quote Post
wookX
сообщение Apr 16 2007, 15:45
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 30-03-07
Пользователь №: 26 626



Цитата(Doka @ Apr 13 2007, 15:53) *
так и удалите эти кавычки (если не изменяет память в матлабе со строками можно обращаться также как с элементами массивов, т.е. просто перекопируйте символы, исключив первый и последний)


Я не понимаю, почему, когда вводишь:
A='ABC'
Ответ:
A=
ABC
Без кавызек???

А когда я считал он сам поставил эти ковычки?
И если считать без кавычек, то строки будут выглядеть так????

Time(i)=str2num(UTC(2:3));
Time(i)=Time(i)+str2num(UTC(4:5))/60;
Time(i)=Time(i)+str2num(UTC(6:end-1))/3600; % Не уверен можно ли так записать --> end-1
Go to the top of the page
 
+Quote Post
wookX
сообщение Apr 17 2007, 08:39
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 30-03-07
Пользователь №: 26 626



Всем большое спасибо. Получилось.
Правда наверно не оптимально, но всетаки smile.gif

Код
clear
s = serial('COM2');
set(s,'BaudRate',4800);
fopen(s);
for i=1:10%00
    data1=fgetl(s);
    ID = sscanf(data1,'%6c',1);
    if ID == '$GPRMC'
        X=strread(data1(8:end),'%s', 'delimiter', ',');
        UTC=char(X(1));
        Time(i)=str2num(UTC(1:2))*3600;
        Time(i)=Time(i)+str2num(UTC(3:4))*60;
        Time(i)=Time(i)+str2num(UTC(5:end));
        Latitude=char(X(3));
        Lat(i)=str2num(Latitude(1:2));
        Lat(i)=Lat(i)+str2num(Latitude(3:end))/60;
            NS=char(X(4));
            if (NS == 'S')|(NS == 's')
                Lat(i)=-Lat(i);
            end
        Longitude=char(X(5));
        Long(i)=str2num(Longitude(1:3));
        Long(i)=Long(i)+str2num(Longitude(4:end))/60;
            EW=char(X(6));
            if (EW == 'W')|(EW == 'w')
                Long(i)=360-Long(i);
            end
        Speed=char(X(7));
        Vt(i)=str2num(Speed);
        Course=char(X(8));
        Psi(i)=str2num(Course);
    end
end
fclose(s);
delete(s);
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01466 секунд с 7
ELECTRONIX ©2004-2016