Перейти к содержанию
    

NMEA информация с GPS

День добрый.

У меня возникла проблема.

Подключил ГПС приемник к компу.

Открыл в Матлаб СОМ порт. Подключился к ГПС приемнику. Считал 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);

 

Но вот не работает код :(

После строки

[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???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда я открыл переменную Status, то там было следующее:

UTC =

'182524'

С кaвычками!!!!

А str2num не воспринимает строковую переменную в данном виде!

Может кто подскажет в чем проблема и как выделить информацию из NMEA???

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не принципиальное сделать все на матлабе, то "все украдено до нас".

http://www.visualgps.net/Papers/NMEAParser/

Изменено пользователем by-pass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Я не понимаю, почему, когда вводишь:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем большое спасибо. Получилось.

Правда наверно не оптимально, но всетаки :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...