|
|
  |
NMEA информация с GPS, Как правильно считать и разобрать NMEA информацию |
|
|
|
Apr 13 2007, 14:23
|
Участник

Группа: Новичок
Сообщений: 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);
Но вот не работает код  После строки [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???
|
|
|
|
|
Apr 13 2007, 23:10
|
Участник

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

|
Если не принципиальное сделать все на матлабе, то "все украдено до нас". http://www.visualgps.net/Papers/NMEAParser/
Сообщение отредактировал by-pass - Apr 13 2007, 23:10
|
|
|
|
|
Apr 16 2007, 15:45
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 17 2007, 08:39
|
Участник

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

|
Всем большое спасибо. Получилось. Правда наверно не оптимально, но всетаки 
Код 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);
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|