MATLAB解析GPS數(shù)據(jù)程序_第1頁(yè)
MATLAB解析GPS數(shù)據(jù)程序_第2頁(yè)
MATLAB解析GPS數(shù)據(jù)程序_第3頁(yè)
MATLAB解析GPS數(shù)據(jù)程序_第4頁(yè)
MATLAB解析GPS數(shù)據(jù)程序_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余11頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、% 注:本程序可直接在MATLAB 2017a 中運(yùn)行%該腳本文件用于學(xué)習(xí)GPS數(shù)據(jù)的讀取,需要做其他用途請(qǐng)自行修改代碼%本腳本文件的前面幾行代碼是要設(shè)置的一些參數(shù)%默認(rèn)使用COM3(需視情況修改)%波特率設(shè)為GPS模塊默認(rèn)的38400%下面為程序源碼 clearnum_execute = 100; % 執(zhí)行次數(shù)num_SingleRead = 150; %單次從串口讀取的字節(jié)數(shù)(最好設(shè)置足夠大(最低大概設(shè)為80),保證單次讀取的數(shù)據(jù)包含一條完整的GPS數(shù)據(jù))Timedelay = 0.2; % 用于延時(shí)讀取串口數(shù)據(jù)BaudRate = 38400; % 讀取數(shù)據(jù)的波特率Terminator

2、= CR;num_MaxTry = 5; %打開(kāi)串口的最多嘗試次數(shù)BytesAvailableFcnCount = 1000;% 設(shè)置參數(shù)% delete(instrfindall); % 串口打開(kāi)失敗時(shí)使用此句% delete(s);clear s % 串口打開(kāi)失敗時(shí)使用此句serial3 = serial(COM3);% 串口設(shè)置 serial3.BytesAvailableFcnMode = byte;% serial3.InputBufferSize = 38400; % 輸出波特率serial3.BaudRate = BaudRate; % 讀入波特率% serial3.Output

3、BufferSize = 1024;serial3.BytesAvailableFcnCount = BytesAvailableFcnCount;serial3.ReadAsyncMode = continuous;serial3.Terminator = Terminator;% 打開(kāi)串口count_opentimes = 1;while contains(serial3.status,closed) 0 & count_opentimes num_MaxTry fopen(serial3); %打開(kāi)串口 count_opentimes = count_opentimes+1;endif

4、contains(serial3.status,open) 0) GPS_DataStrs = fread(serial3,num_SingleRead,char); %一次讀出10個(gè)字符 GPS_DataStrs = reshape(GPS_DataStrs,1,); GPS_DataStrs = split_str2strs(GPS_DataStrs); GPS_Data_tmp = get_GPS_specificData(GPS_DataStrs); GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp); show_GPS_Data(GPS

5、_Data); pause(Timedelay); % 延時(shí) num_execute = num_execute-1;end% fprintf(s,abcd); %給串口的發(fā)送數(shù)據(jù)% fscanf(s); %從串口的接收緩存讀數(shù)據(jù)% 關(guān)閉串口并刪除相關(guān)數(shù)據(jù)fclose(serial3); %關(guān)閉串口delete(serial3);clear serial3% %將字符串根據(jù)rn劃分成多個(gè)子字符串,同時(shí)去掉首尾無(wú)用的殘余字符串function out_strs = split_str2strs(StrData) if contains(class(StrData),char) uint8(Str

6、Data); end record = get_pos_enterflag(StrData); if StrData(1) = uint8($) %開(kāi)頭為$的情況 flag_start = 1; else if size(record,2) 0 flag_start = record(1)+2; else out_strs = cell(0,0); return end end if StrData(end) = 13 flag_end = length(StrData)-1; else if size(record,2) 0 flag_end = record(end)-1; end end

7、 if flag_start = flag_end out_strs = cell(0,0); return end StrData = StrData(flag_start:flag_end); % 截取有效數(shù)據(jù),方便下面劃分子字符串 record = get_pos_enterflag(StrData); num_strs = size(record,2)+1; out_strs = cell(num_strs,1); if num_strs 1 out_strs1,1 = char(StrData(1:record(1)-1); if num_strs = 2 out_strsnum_s

8、trs,1 = char(StrData(record(1)+2:end); else for i = 2 : num_strs-1 out_strsi,1 = char(StrData(record(i-1)+2:record(i)-1); end out_strsnum_strs,1 = char(StrData(record(i)+2:end); end else out_strs1,1 = char(StrData); end % 得到字符串中rn在字符串中的位置(實(shí)際為r的位置) function record = get_pos_enterflag(data) record = ;

9、 % 記錄回車(chē)符號(hào)位置 for ii = 1 : length(data)-1 if data(ii) = 13 if data(ii+1) = 10 record = record,ii; ii = ii+1; end end end endend% 得到具體GPS結(jié)構(gòu)體數(shù)據(jù)function GPS_Data_tmp = get_GPS_specificData(StrsData) GPS_Data_tmp = ; num_str = size(StrsData,1); for i = 1 : num_str str_tab = StrsDatai,1; if contains(str_ta

10、b,GGA) 0 GPS_Data_tmp = GNGGA(str_tab); elseif contains(str_tab,GSA) 0 GPS_Data_tmp = GNGSA(str_tab); elseif contains(str_tab,GSV) 0 GPS_Data_tmp = GNGSV(str_tab); elseif contains(str_tab,RMC) 0 GPS_Data_tmp = GNRMC(str_tab); elseif contains(str_tab,VTG) 0 GPS_Data_tmp = GNVTG(str_tab); elseif conta

11、ins(str_tab,GLL) 0 GPS_Data_tmp = GNGLL(str_tab); end endend% GPS字符串解析function GPS_Data_tmp = GNGGA(str_tab) index = strfind(str_tab,); count = 1; Time = str_tab(index(count)+1:index(count+1)-1);count=count+1; Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LatitudeDi

12、r = str_tab(index(count)+1:index(count+1)-1);count=count+1; Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.GPSState = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data

13、_tmp.SatelliteNum = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.altitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end); % 進(jìn)一步處理 GPS_Data_tmp.Time.hour

14、 = Time(1:2); GPS_Data_tmp.Time.min = Time(3:4); GPS_Data_tmp.Time.sec = Time(5:6); GPS_Data_tmp.Tlisec = Time(8:10); GPS_Data_tmp.Latitude.degree = Latitude(1:2); % 緯度 GPS_Data_tmp.Latitude.min = Latitude(3:4); tmp = str2double(Latitude(6:9); tmp = tmp*6/1000; % tmp = tmp/10000*60; GPS_Data_

15、tmp.Latitude.sec = num2str(floor(tmp); GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000); GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 經(jīng)度 GPS_Data_tmp.Longitude.min = Longitude(4:5); tmp = str2double(Longitude(7:10); tmp = tmp*6/1000; % tmp = tmp/10000*60; GPS_Data_tmp.Longitude.se

16、c = num2str(floor(tmp); GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000); % UTC時(shí)間轉(zhuǎn)換為北京時(shí)間 hour = GPS_Data_tmp.Time.hour; if str2num(hour)+8 = 24 GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24); else GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8); endendfunction GPS_Data_tmp = G

17、NGSA(str_tab) index = strfind(str_tab,); count = 1; GPS_Data_tmp.LocationMode = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.CurState = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.PRN = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_

18、tmp.PDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.VDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);endfunction GPS_Data_tmp = GNGSV(str_tab)% 此

19、語(yǔ)句為與衛(wèi)星有關(guān)的信息(包括衛(wèi)星方位,衛(wèi)星編號(hào))% 暫時(shí)用不著,不處理 GPS_Data_tmp = ;endfunction GPS_Data_tmp = GNRMC(str_tab) index = strfind(str_tab,); count = 1; Time = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LocationState = str_tab(index(count)+1:index(count+1)-1);count=count+1; Latitude = str_tab(i

20、ndex(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LatitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.speed

21、 = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.TrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; Date = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.MagneticAngle = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.M

22、agneticDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end); % 進(jìn)一步處理 GPS_Data_tmp.Time.hour = Time(1:2); GPS_Data_tmp.Time.min = Time(3:4); GPS_Data_tmp.Time.sec = Time(5:6); GPS_Data_tmp.Tlisec = Time(8:10); GPS_Data_tmp.Latitude.degree = Latitud

23、e(1:2); % 緯度 GPS_Data_tmp.Latitude.min = Latitude(3:4); tmp = str2double(Latitude(6:9); tmp = tmp*6/1000; % tmp = tmp/10000*60; GPS_Data_tmp.Latitude.sec = num2str(floor(tmp); GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000); GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 經(jīng)度 GPS_Dat

24、a_tmp.Longitude.min = Longitude(4:5); tmp = str2double(Longitude(7:10); tmp = tmp*6/1000; % tmp = tmp/10000*60; GPS_Data_tmp.Longitude.sec = num2str(floor(tmp); GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000); GPS_Data_tmp.DATE.day = Date(1:2); GPS_Data_tmp.DATE.month = Date(3:4); GP

25、S_Data_tmp.DATE.year = Date(5:6); % UTC時(shí)間轉(zhuǎn)換為北京時(shí)間 hour = GPS_Data_tmp.Time.hour; if str2num(hour)+8 = 24 GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24); else GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8); endendfunction GPS_Data_tmp = GNVTG(str_tab) index = strfind(str_tab,); count = 1; GPS

26、_Data_tmp.TrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.ReferenceTrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.RelativeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.ReferenceRelativeDir = str_tab(index(cou

27、nt)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.step = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.stepflag = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.velocity = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(co

28、unt)+1:end);endfunction GPS_Data_tmp = GNGLL(str_tab) index = strfind(str_tab,); count = 1; Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LatitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; Longitude = str_tab(index(count)+1:index(count+1)-1);count

29、=count+1; GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1; Date = str_tab(index(count)+1:index(count+1)-1);count=count+1; GPS_Data_tmp.LocationState = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end); % 進(jìn)一步處理 GPS_Data_tmp

30、.Latitude.degree = Latitude(1:2); % 緯度 GPS_Data_tmp.Latitude.min = Latitude(3:4); tmp = str2double(Latitude(6:9); tmp = tmp*6/1000; % tmp = tmp/10000*60; GPS_Data_tmp.Latitude.sec = num2str(floor(tmp); GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000); GPS_Data_tmp.Longitude.degree = Lo

31、ngitude(1:3); % 經(jīng)度 GPS_Data_tmp.Longitude.min = Longitude(4:5); tmp = str2double(Longitude(7:10); tmp = tmp*6/1000; % tmp = tmp/10000*60; GPS_Data_tmp.Longitude.sec = num2str(floor(tmp); GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000); GPS_Data_tmp.DATE.day = Date(1:2); GPS_Data_tmp.

32、DATE.month = Date(3:4); GPS_Data_tmp.DATE.year = Date(5:6);end% 更新獲取到的相關(guān)數(shù)據(jù)function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)% 用不到的數(shù)據(jù)可以注釋掉 if isfield(GPS_Data_tmp,Time) = 1 GPS_Data.Time.hour = GPS_Data_tmp.Time.hour; GPS_Data.Time.min = GPS_Data_tmp.Time.min; GPS_Data.Time.sec = GPS_Data_tmp

33、.Time.sec; GPS_Data.Tlisec = GPS_Data_tmp.Tlisec; end if isfield(GPS_Data_tmp,DATE) = 1 GPS_Data.DATE.day = GPS_Data_tmp.DATE.day; GPS_Data.DATE.month = GPS_Data_tmp.DATE.month; GPS_Data.DATE.year = GPS_Data_tmp.DATE.year; end if isfield(GPS_Data_tmp,Latitude) = 1 GPS_Data.Latitude.deg

34、ree = GPS_Data_tmp.Latitude.degree; GPS_Data.Latitude.min = GPS_Data_tmp.Latitude.min; GPS_Data.Latitude.sec = GPS_Data_tmp.Latitude.sec; GPS_Data.Llisec = GPS_Data_tmp.Llisec; end if isfield(GPS_Data_tmp,LatitudeDir) = 1 GPS_Data.LatitudeDir = GPS_Data_tmp.LatitudeDir; end if

35、isfield(GPS_Data_tmp,Longitude) = 1 GPS_Data.Longitude.degree = GPS_Data_tmp.Longitude.degree; GPS_Data.Longitude.min = GPS_Data_tmp.Longitude.min; GPS_Data.Longitude.sec = GPS_Data_tmp.Longitude.sec; GPS_Data.Llisec = GPS_Data_tmp.Llisec; end if isfield(GPS_Data_tmp,Longitud

36、eDir) = 1 GPS_Data.LongitudeDir = GPS_Data_tmp.LongitudeDir; end if isfield(GPS_Data_tmp,GPSState) = 1 GPS_Data.GPSState = GPS_Data_tmp.GPSState; end if isfield(GPS_Data_tmp,SatelliteNum) = 1 GPS_Data.SatelliteNum = GPS_Data_tmp.SatelliteNum; end if isfield(GPS_Data_tmp,speed) = 1 GPS_Data.speed = G

37、PS_Data_tmp.speed; end if isfield(GPS_Data_tmp,velocity) = 1 GPS_Data.velocity = GPS_Data_tmp.velocity; end if isfield(GPS_Data_tmp,LocationState) = 1 GPS_Data.LocationState = GPS_Data_tmp.LocationState; end if isfield(GPS_Data_tmp,altitude) = 1 GPS_Data.altitude = GPS_Data_tmp.altitude; end if isfi

38、eld(GPS_Data_tmp,CurState) = 1 GPS_Data.CurState = GPS_Data_tmp.CurState; end if isfield(GPS_Data_tmp,LocationMode) = 1 GPS_Data.LocationMode = GPS_Data_tmp.LocationMode; end if isfield(GPS_Data_tmp,HDOP) = 1 GPS_Data.HDOP = GPS_Data_tmp.HDOP; end if isfield(GPS_Data_tmp,VDOP) = 1 GPS_Data.VDOP = GP

39、S_Data_tmp.VDOP; end if isfield(GPS_Data_tmp,PDOP) = 1 GPS_Data.PDOP = GPS_Data_tmp.PDOP; end if isfield(GPS_Data_tmp,TrueDir) = 1 GPS_Data.TrueDir = GPS_Data_tmp.TrueDir; end if isfield(GPS_Data_tmp,MagneticAngle) = 1 GPS_Data.MagneticAngle = GPS_Data_tmp.MagneticAngle; end if isfield(GPS_Data_tmp,

40、MagneticDir) = 1 GPS_Data.MagneticDir = GPS_Data_tmp.MagneticDir; end if isfield(GPS_Data_tmp,ReferenceTrueDir) = 1 GPS_Data.ReferenceTrueDir = GPS_Data_tmp.ReferenceTrueDir; end if isfield(GPS_Data_tmp,RelativeDir) = 1 GPS_Data.RelativeDir = GPS_Data_tmp.RelativeDir; end if isfield(GPS_Data_tmp,Ref

41、erenceRelativeDir) = 1 GPS_Data.ReferenceRelativeDir = GPS_Data_tmp.ReferenceRelativeDir; end if isfield(GPS_Data_tmp,step) = 1 GPS_Data.step = GPS_Data_tmp.step; end if isfield(GPS_Data_tmp,stepflag) = 1 GPS_Data.stepflag = GPS_Data_tmp.stepflag; end if isfield(GPS_Data_tmp,PRN) = 1 GPS_Data.PRN =

42、GPS_Data_tmp.PRN; endend% 顯示相關(guān)GPS數(shù)據(jù)function show_GPS_Data(GPS_Data) DataAndTime = sprintf(20%02s-%02s-%02s %02s:%02s:%02s:%03s,. GPS_Data.DATE.year,GPS_Data.DATE.month,GPS_Data.DATE.day,. GPS_Data.Time.hour,GPS_Data.Time.min,GPS_Data.Time.sec,GPS_Data.Tlisec); Location = sprintf( %s:%02s%02s%

43、03s%04s,%s:%02s%02s%03s%04s,. GPS_Data.LatitudeDir,GPS_Data.Latitude.degree,GPS_Data.Latitude.min,GPS_Data.Latitude.sec,GPS_Data.Llisec,. GPS_Data.LongitudeDir,GPS_Data.Longitude.degree,GPS_Data.Longitude.min,GPS_Data.Longitude.sec,GPS_Data.Llisec);% Others = sprintf( GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s,.% GPS_Data.GPSState,GPS_Data.SatelliteNum,GPS_Data.speed,GPS_Data.velocity,GPS_Data.LocationState);% show_Message_str(strcat(DataAndTime,Location,Others); show_Message_str(strcat(D

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論