Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NMEA информация с GPS
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Wireless/Optic
wookX
День добрый.
У меня возникла проблема.
Подключил ГПС приемник к компу.
Открыл в Матлаб СОМ порт. Подключился к ГПС приемнику. Считал 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???
Doka
Цитата(wookX @ Apr 13 2007, 15:23) *
Когда я открыл переменную Status, то там было следующее:
UTC =
'182524'
С кaвычками!!!!
А str2num не воспринимает строковую переменную в данном виде!
Может кто подскажет в чем проблема и как выделить информацию из NMEA???


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


PS: тему переношу, как не имеющу. отношения к "Rf & Microwave Design"
by-pass
Если не принципиальное сделать все на матлабе, то "все украдено до нас".
http://www.visualgps.net/Papers/NMEAParser/
wookX
Цитата(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
wookX
Всем большое спасибо. Получилось.
Правда наверно не оптимально, но всетаки 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);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.