atk-s1216f8-bd模塊使用說明nano stm32f1_an1808_W_第1頁
atk-s1216f8-bd模塊使用說明nano stm32f1_an1808_W_第2頁
atk-s1216f8-bd模塊使用說明nano stm32f1_an1808_W_第3頁
atk-s1216f8-bd模塊使用說明nano stm32f1_an1808_W_第4頁
atk-s1216f8-bd模塊使用說明nano stm32f1_an1808_W_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、正點(diǎn)原子AN1808AN1808 ATK-S1216F8 GPS/北斗模塊使用說明本應(yīng)用文檔(AN1808,對(duì)應(yīng) NANO STM32 開發(fā)板擴(kuò)展實(shí)驗(yàn) 7)將教大家如何在 ALIENTEK STM32 開發(fā)板上使用ATK-S1216F8-BD GPS/北斗模塊,并實(shí)現(xiàn) GPS/北斗定位。本文檔分為如下幾部分: 1, ATK-S1216F8-BD GPS/北斗模塊簡介 2, 硬件連接 3, 軟件實(shí)現(xiàn) 4, 驗(yàn)證 1、ATK-S1216F8-BD GPS/北斗模塊簡介ATK-S1216F8-BD-V23 模塊,是 ALIENTEK 生產(chǎn)的一款高性能 GPS/北斗模塊

2、,模塊核心采用 SkyTraq 公司的 S1216F8-BD 模組,具有 167 個(gè)通道,追蹤靈敏度高達(dá)-165dBm,測量輸出頻率最高可達(dá) 20Hz。ATK-S1216F8-BD GSP/北斗模塊具有以下特點(diǎn): 1, 模塊采用 S1216F8-BD 模組,體積小巧,性能優(yōu)異。 2, 模塊可通過串口進(jìn)行各種參數(shù)設(shè)置,并可保存在內(nèi)部 FLASH,使用方便。 3, 模塊自帶 IPX 接口,可以連接各種有源天線,適應(yīng)能力強(qiáng)。 4, 模塊兼容 3.3V/5V 電平,方便連接各種單片機(jī)系統(tǒng)。 5, 模塊自帶可充電后備電池,可以掉電保持星歷數(shù)據(jù) 1。 注 1:在主電源斷開后,后備電池可以維持半小時(shí)左右的

3、GPS/北斗星歷數(shù)據(jù)的保存,以支持溫啟動(dòng)或熱啟動(dòng),從而實(shí)現(xiàn)快速定位。 ATK-S1216F8-BD GPS/北斗模塊非常小巧(25mm*27mm),模塊通過 5 個(gè) 2.54mm 間距的 排針與外部連接,模塊外觀如圖 1.1 所示: 圖 1.1 ATK-S1216F8-BD GPS/北斗模塊外觀圖 圖 1.1 中,從右到左,依次為模塊引出的 PIN1PIN5 腳,各引腳的詳細(xì)描述如表 1.1 所示: 開源電子網(wǎng)08/09/2018正點(diǎn)原子AN1808表 1.1 ATK-S1216F8-BDGPS/北斗模塊各引腳功能描述 其中,PPS

4、 引腳同時(shí)連接到了模塊自帶了的狀態(tài)指示燈:PPS,該引腳連接在 UBLOX NEO-6M 模組的 1PPS 端口,該端口的輸出特性可以通過程序設(shè)置。PPS 指示燈(即 PPS 引腳),在默認(rèn)條件下(經(jīng)過程序設(shè)置),有 2 個(gè)狀態(tài): 1, 常亮,表示模塊已開始工作,但還未實(shí)現(xiàn)定位。 2, 閃爍(100ms 滅,900ms 亮),表示模塊已經(jīng)定位成功。 這樣,通過 PPS 指示燈,我們就可以很方便的判斷模塊的當(dāng)前狀態(tài),方便大家使用。另外,圖 1.1 中,左上角的 IPX 接口,用來外接一個(gè)有源天線,通過外接有源天線,我 們就可以把模塊放到室內(nèi),天線放到室外,實(shí)現(xiàn)室內(nèi)定位。 ATK-S1216F8-

5、BD 模塊默認(rèn)采用 NMEA-0183 協(xié)議輸出 GPS/北斗定位數(shù)據(jù),并可以通過SkyTraq 協(xié)議對(duì)模塊進(jìn)行配置,NMEA-0183 協(xié)議詳細(xì)介紹請(qǐng)參考ATK-S1216F8-BD GPS/北斗用戶手冊.pdf, SkyTraq 配置協(xié)議,請(qǐng)參考Binary Messages of SkyTraq Venus 8 GNSS Receiver.pdf。 通過 ATK-S1216F8-BD GPS/北斗模塊,任何單片機(jī)(3.3V/5V 電源)都可以很方便的實(shí)現(xiàn)GPS/北斗定位,當(dāng)然他也可以連接電腦,利用電腦軟件實(shí)現(xiàn)定位。ATK-S1216F8-BD GPS/北斗模塊的原理圖如圖 1.2 所示:

6、 圖 1.2 ATK-S1216F8-BD GPS/北斗模塊原理圖 開源電子網(wǎng)08/09/2018序號(hào) 名稱 說明 1VCC電源(3.3V5.0V) 2GND地 3TXD模塊串口發(fā)送腳(TTL 電平,不能直接接 RS232 電平!),可接單片機(jī)的 RXD4RXD模塊串口接收腳(TTL 電平,不能直接接 RS232 電平!),可接單片機(jī)的 TXD5PPS時(shí)鐘脈沖輸出腳 正點(diǎn)原子AN18082、硬件連接本實(shí)驗(yàn)功能簡介:通過串口 2 連接 ATK-S1216F8-BD GPS/北斗模塊,然后可通過 KEYUP按鍵控制串口 1 顯示 GPS

7、/北斗信息,包括精度、緯度、高度、速度、用于定位的數(shù)、可見數(shù)、UTC 時(shí)間等信息。同時(shí),通過 KEYUP 按鍵開啟 USMART 工具,設(shè)置 GPS/北斗模塊的刷新速率(最大支持 20Hz 刷新率)和時(shí)鐘脈沖的配置。另外,通過KEY0 按鍵,可以開啟或關(guān)閉NMEA 數(shù)據(jù)的上傳(即輸出到串口 1,方便開發(fā)調(diào)試)。 所要用到的硬件資源如下: 1, 指示燈 DS02, KEY0 按鍵 3, 串口 1、串口 24, TFTLCD 模塊 5, ATK-S1216F8-BD GPS/北斗模塊 接下來,我們看看 ATK-S1216F8-BD GPS/北斗模塊同 ALIENTEK STM32 開發(fā)板的連接,前

8、面我們介紹了ATK-S1216F8-BD 模塊的接口,我們通過杜邦線連接模塊和開發(fā)板的相應(yīng)端口, 連接關(guān)系如表 2.1 所示: 表 2.1 ATK-S1216F8-BD GPS/北斗模塊同 ALIENTEK STM32 開發(fā)板連接關(guān)系表 表中 ATK-S1216F8-BD GPS/北斗模塊的 VCC,因?yàn)槲覀兊哪K是可以 3.3V 或 5V 供電的, 所以可以接開發(fā)板的 3.3V 電源,也可以接開發(fā)板的 5V 電源,這個(gè)隨便大家自己選擇。另外,這里我們沒有用到模塊的 PPS 引腳,所以沒有和單片機(jī)進(jìn)行連接。 3、軟件實(shí)現(xiàn)本實(shí)驗(yàn)在擴(kuò)展例程:ATK-HC05 藍(lán)牙串口模塊實(shí)驗(yàn)的基礎(chǔ)上修改,本例程用

9、不到藍(lán)牙模塊,所以先刪掉hc05.c。 然后,在 HARDWARE 文件夾里面新建一個(gè) GPS 文件夾,并新建 gps.c,gps.h 兩個(gè)文件。然后在工程HARDWARE 組里面添加 gps.c,并在工程添加 gps.h 的頭文件包含路徑。 在 gps.c 里面,我們輸入如下代碼: 開源電子網(wǎng)08/09/2018#include gps.h #include led.h #include delay.h #include usart3.h #include stdio.h #include stdarg.h #include string.h #include

10、math.h/const u32 BAUD_id9=4800,9600,19200,38400,57600,115200,230400,460800,921600;/從 buf 里面得到第 cx 個(gè)逗號(hào)所在的位置 /返回值:00XFE,代表逗號(hào)所在位置的偏移./0XFF,代表不存在第 cx 個(gè)逗號(hào) u8 NMEA_Comma_Pos(u8 *buf,u8 cx)ATK-S1216F8-BD GPS/北斗模塊與開發(fā)板連接關(guān)系A(chǔ)TK-S1216F8-BD GPS/北斗模塊VCCGNDTXDRXDALIENTEK STM32 開發(fā)板3.3V/5VGNDPA3PA2正點(diǎn)

11、原子AN1808開源電子網(wǎng)08/09/2018u8 *p=buf; while(cx)if(*buf=*|*bufz)return 0XFF;/遇到*或者非法字符,則不存在第 cx 個(gè)逗號(hào) if(*buf=,)cx-; buf+;return buf-p;/mn 函數(shù) /返回值:mn 次方.u32 NMEA_Pow(u8 m,u8 n)u32 result=1; while(n-)result*=m; return result;/str 轉(zhuǎn)換為數(shù)字,以,或者*結(jié)束 /buf:數(shù)字存儲(chǔ)區(qū) /dx:小數(shù)點(diǎn)位數(shù),返回給調(diào)用函數(shù) /返回值:轉(zhuǎn)換后的數(shù)值 int NMEA

12、_Str2num(u8 *buf,u8*dx)u8 *p=buf;u32 ires=0,fres=0; u8 ilen=0,flen=0,i; u8 mask=0;int res;while(1) /得到整數(shù)和小數(shù)的長度 if(*p=-)mask|=0X02;p+;/是負(fù)數(shù)if(*p=,|(*p=*)break;/遇到結(jié)束了if(*p=.)mask|=0X01;p+;/遇到小數(shù)點(diǎn)了else if(*p9|(*p0)/有非法字符 ilen=0; flen=0; break;if(mask&0X01)flen+; else ilen+;p+;正點(diǎn)原子AN1808ww

13、開源電子網(wǎng)08/09/2018if(mask&0X02)buf+; /去掉負(fù)號(hào)for(i=0;i5)flen=5;/最多取 5 位小數(shù) *dx=flen;/小數(shù)點(diǎn)位數(shù)for(i=0;isvnum=NMEA_Str2num(p1+posx,&dx); for(i=0;ilen;i+)p1=(u8*)strstr(const char *)p,$GPGSV); for(j=0;jslmsgslx.num=NMEA_Str2num(p1+posx,&dx);/得到編號(hào)else break; posx=NMEA_Comma_Pos(p1,5+j*4);if(posx!=0XF

14、F)gpsx-slmsgslx.eledeg=NMEA_Str2num(p1+posx,&dx);/得到仰角else break; posx=NMEA_Comma_Pos(p1,6+j*4);if(posx!=0XFF)gpsx-slmsgslx.azideg=NMEA_Str2num(p1+posx,&dx);正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018/得到方位角else break; posx=NMEA_Comma_Pos(p1,7+j*4);if(posx!=0XFF)gpsx-slmsgslx.sn=NMEA_Str

15、2num(p1+posx,&dx);/得到信噪比else break; slx+;p=p1+1;/切換到下一個(gè)GPGSV 信息 /分析 BDGSV 信息 /gpsx:nmea 信息結(jié)構(gòu)體 /buf:接收到的北斗數(shù)據(jù)緩沖區(qū)首地址 void NMEA_BDGSV_Analysis(nmea_msg *gpsx,u8 *buf)u8 *p,*p1,dx; u8 len,i,j,slx=0; u8 posx; p=buf;p1=(u8*)strstr(const char *)p,$BDGSV);len=p17-0;/得到 BDGSV 的條數(shù) posx=NMEA_Comma_Pos(p1,3);/得到

16、可見北斗總數(shù)if(posx!=0XFF)gpsx-beidou_svnum=NMEA_Str2num(p1+posx,&dx); for(i=0;ilen;i+)p1=(u8*)strstr(const char *)p,$BDGSV); for(j=0;jbeidou_slmsgslx.beidou_num=NMEA_Str2num(p1+posx,&dx);/得到編號(hào) else break; posx=NMEA_Comma_Pos(p1,5+j*4);if(posx!=0XFF)gpsx-beidou_slmsgslx.beidou_eledeg=NMEA_Str2num(p1+posx,

17、&dx);/得到仰角 else break; posx=NMEA_Comma_Pos(p1,6+j*4);if(posx!=0XFF)gpsx-beidou_slmsgslx.beidou_azideg=NMEA_Str2num(p1+posx,&dx);/得到方位角 else break;正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018posx=NMEA_Comma_Pos(p1,7+j*4);if(posx!=0XFF)gpsx-beidou_slmsgslx.beidou_sn=NMEA_Str2num(p1+posx,&d

18、x);/得到信噪比 else break; slx+;p=p1+1;/切換到下一個(gè)BDGSV 信息 /分析 GNGGA 信息 /gpsx:nmea 信息結(jié)構(gòu)體 /buf:接收到的 GPS/北斗數(shù)據(jù)緩沖區(qū)首地址 void NMEA_GNGGA_Analysis(nmea_msg *gpsx,u8 *buf)u8 *p1,dx; u8 posx;p1=(u8*)strstr(const char *)buf,$GNGGA);posx=NMEA_Comma_Pos(p1,6);/得到 GPS 狀態(tài)if(posx!=0XFF)gpsx-gpssta=NMEA_Str2num(p1+posx,&dx);

19、 posx=NMEA_Comma_Pos(p1,7);/得到用于定位的數(shù) if(posx!=0XFF)gpsx-posslnum=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,9);/得到海拔高度if(posx!=0XFF)gpsx-altitude=NMEA_Str2num(p1+posx,&dx);/分析 GNGSA 信息 /gpsx:nmea 信息結(jié)構(gòu)體 /buf:接收到的 GPS/北斗數(shù)據(jù)緩沖區(qū)首地址 void NMEA_GNGSA_Analysis(nmea_msg *gpsx,u8 *buf)u8 *p1,dx; u8 posx

20、; u8 i;p1=(u8*)strstr(const char *)buf,$GNGSA);posx=NMEA_Comma_Pos(p1,2);/得到定位類型if(posx!=0XFF)gpsx-fixmode=NMEA_Str2num(p1+posx,&dx);for(i=0;ipossli=NMEA_Str2num(p1+posx,&dx); else break;posx=NMEA_Comma_Pos(p1,15);正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018/得到 PDOP 位置精度因子 if(posx!=0XFF)

21、gpsx-pdop=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,16);/得到 HDOP 位置精度因子 if(posx!=0XFF)gpsx-hdop=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,17);/得到 VDOP 位置精度因子 if(posx!=0XFF)gpsx-vdop=NMEA_Str2num(p1+posx,&dx);/分析 GNRMC 信息 /gpsx:nmea 信息結(jié)構(gòu)體 /buf:接收到的 GPS/北斗數(shù)據(jù)緩沖區(qū)首地址 void NMEA_GNRMC_Analy

22、sis(nmea_msg *gpsx,u8 *buf)u8 *p1,dx; u8 posx; u32 temp; float rs;p1=(u8*)strstr(const char *)buf,$GNRMC);/$GNRMC,經(jīng)常有&和GNRMC 分開的情況,故只判斷 GPRMC. posx=NMEA_Comma_Pos(p1,1);/得到 UTC 時(shí)間 if(posx!=0XFF)temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);/得到 UTC 時(shí)間,去掉 ms gpsx-utc.hour=temp/10000;gpsx-utc.min=(tem

23、p/100)%100; gpsx-utc.sec=temp%100;posx=NMEA_Comma_Pos(p1,3);/得到緯度if(posx!=0XFF)temp=NMEA_Str2num(p1+posx,&dx);gpsx-latitude=temp/NMEA_Pow(10,dx+2);/得到 rs=temp%NMEA_Pow(10,dx+2);/得到gpsx-latitude=gpsx-latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx)/60;/轉(zhuǎn)換為 posx=NMEA_Comma_Pos(p1,4);/南緯還是北緯if(posx!=0XFF)

24、gpsx-nshemi=*(p1+posx);posx=NMEA_Comma_Pos(p1,5);/得到經(jīng)度if(posx!=0XFF)正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018temp=NMEA_Str2num(p1+posx,&dx);gpsx-longitude=temp/NMEA_Pow(10,dx+2);/得到 rs=temp%NMEA_Pow(10,dx+2);/得到gpsx-longitude=gpsx-longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx)/60;/轉(zhuǎn)換為

25、 posx=NMEA_Comma_Pos(p1,6);/東經(jīng)還是西經(jīng)if(posx!=0XFF)gpsx-ewhemi=*(p1+posx); posx=NMEA_Comma_Pos(p1,9);/得到 UTC 日期if(posx!=0XFF)temp=NMEA_Str2num(p1+posx,&dx);/得到 UTC 日期 gpsx-utc.date=temp/10000;gpsx-utc.month=(temp/100)%100; gpsx-utc.year=2000+temp%100;/分析 GNVTG 信息 /gpsx:nmea 信息結(jié)構(gòu)體 /buf:接收到的 GPS/北斗數(shù)據(jù)緩沖區(qū)首

26、地址 void NMEA_GNVTG_Analysis(nmea_msg *gpsx,u8 *buf)u8 *p1,dx; u8 posx;p1=(u8*)strstr(const char *)buf,$GNVTG); posx=NMEA_Comma_Pos(p1,7);/得到地面速率if(posx!=0XFF)gpsx-speed=NMEA_Str2num(p1+posx,&dx); if(dxspeed*=NMEA_Pow(10,3-dx);/確保擴(kuò)大 1000 倍 /提取 NMEA-0183 信息 /gpsx:nmea 信息結(jié)構(gòu)體 /buf:接收到的 GPS/北斗數(shù)據(jù)緩沖區(qū)首地址voi

27、d GPS_Analysis(nmea_msg *gpsx,u8 *buf)NMEA_GPGSV_Analysis(gpsx,buf); /GPGSV 解 析NMEA_BDGSV_Analysis(gpsx,buf); /BDGSV 解 析NMEA_GNGGA_Analysis(gpsx,buf); /GNGGA 解析NMEA_GNGSA_Analysis(gpsx,buf); /GNGSA 解析 正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018NMEA_GNRMC_Analysis(gpsx,buf); /GNRMC 解析 NM

28、EA_GNVTG_Analysis(gpsx,buf); /GNVTG 解析 /SkyTraq 配置代碼/檢查 CFG 配置執(zhí)行情況 /返回值:0,ACK 成功 /1,接收超時(shí)錯(cuò)誤 /2,沒有找到同步字符 /3,接收到NACK 應(yīng)答 u8 SkyTra_Cfg_Ack_Check(void)u16 len=0,i; u8 rval=0;while(USART3_RX_STA&0X8000)=0 & len100)/等待接收到應(yīng)答 len+; delay_ms(5);if(len100)/超時(shí)錯(cuò)誤.len=USART3_RX_STA&0X7FFF;/此次接收到的數(shù)據(jù)長度for(i=0;isos=

29、0XA1A0;/引導(dǎo)序列(小端模式)cfg_prt-PL=0X0400;/有效數(shù)據(jù)長度(小端模式)cfg_prt-id=0X05;/配置波特率的 ID正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018cfg_prt-com_port=0X00;/ 操 作 串 口 1 cfg_prt-Baud_id=baud_id;/波特率對(duì)應(yīng)編號(hào)cfg_prt-Attributes=1;/保存到 SRAM&FLASHcfg_prt-CS=cfg_prt-idcfg_prt-com_portcfg_prt-Baud_idcfg_prt-Attribu

30、tes; cfg_prt-end=0X0A0D;/ 發(fā) 送 結(jié) 束 符 ( 小 端 模 式 ) SkyTra_Send_Date(u8*)cfg_prt,sizeof(SkyTra_baudrate);/發(fā)送數(shù)據(jù)給SkyTraF8 delay_ms(200);/等待發(fā)送完成usart3_init(36,BAUD_idbaud_id);/重新初始化串口 3return SkyTra_Cfg_Ack_Check();/這里不會(huì)返回 0,因?yàn)?SkyTra 發(fā)回來的應(yīng)答在串口重新初始化的時(shí)候已經(jīng)被丟棄了./配置 SkyTra_GPS/北斗模塊的時(shí)鐘脈沖寬度 /width:脈沖寬度 1100000(u

31、s)/返回值:0,發(fā)送成功;其他,發(fā)送失敗. u8 SkyTra_Cfg_Tp(u32 width)u32 temp=width;SkyTra_pps_width *cfg_tp=(SkyTra_pps_width *)USART3_TX_BUF; temp=(width24)|(width8)&0X0000FF00)|(width8)&0X00FF0000)|(widthsos=0XA1A0;/cfg header(小端模式)cfg_tp-PL=0X0700;/有效數(shù)據(jù)長度(小端模式)cfg_tp-id=0X65;/cfg tp idcfg_tp-Sub_ID=0X01;/數(shù)據(jù)區(qū)長度為 20

32、 個(gè)字節(jié). cfg_tp-width=temp;/脈沖寬度,uscfg_tp-Attributes=0X01;/保存到 SRAM&FLASHcfg_tp-CS=cfg_tp-idcfg_tp-Sub_ID(cfg_tp-width24)(cfg_tp-width16) &0XFF(cfg_tp-width8)&0XFFcfg_tp-width&0XFFcfg_tp-Attributes; cfg_tp-end=0X0A0D;/ 發(fā) 送 結(jié) 束 符 ( 小 端 模 式 ) SkyTra_Send_Date(u8*)cfg_tp,sizeof(SkyTra_pps_width);/發(fā)送數(shù)據(jù)給 Sk

33、yTra return SkyTra_Cfg_Ack_Check();/配置 SkyTraF8-BD 的更新速率 /Frep:(取值范圍:1,2,4,5,8,10,20)測量時(shí)間間隔,單位為Hz,最大不能大于 20Hz/返回值:0,發(fā)送成功;其他,發(fā)送失敗. u8 SkyTra_Cfg_Rate(u8 Frep)SkyTra_PosRate *cfg_rate=(SkyTra_PosRate *)USART3_TX_BUF; cfg_rate-sos=0XA1A0;/cfg header(小端模式)cfg_rate-PL=0X0300;/有效數(shù)據(jù)長度(小端模式) cfg_rate-id=0X0

34、E;/cfg rate idcfg_rate-rate=Frep;/更新速率 cfg_rate-Attributes=0X01;/保存到 SRAM&FLASH.cfg_rate-CS=cfg_rate-idcfg_rate-ratecfg_rate-Attributes;/脈沖間隔,正點(diǎn)原子AN1808這部分代碼可以分為 2 個(gè)部分,第一部分是NMEA-0183 數(shù)據(jù)解析部分,另外一部分則是 SkyTraq 協(xié)議控制部分。 NMEA-0183 協(xié)議解析部分,這里利用了一個(gè)簡單的數(shù)逗號(hào)方法來解析。我們知道NMEA-0183 協(xié)議都是以類似$GPGSV 的開頭,

35、然后固定輸出格式,不論是否有數(shù)據(jù)輸出, 逗號(hào)是肯定會(huì)有的,而且都會(huì)以*作為有效數(shù)據(jù)的結(jié)尾,所以,我們了解了 NMEA-0183 協(xié)議的數(shù)據(jù)格式(在 ATK-S1216F8-BD GPS/北斗模塊的用戶手冊有詳細(xì)介紹)之后,就可以通過數(shù)逗號(hào)的方法,來解析數(shù)據(jù)了。本代碼實(shí)現(xiàn)了對(duì) NMEA-0183 協(xié)議的$GNGGA、 $GPGSA、$GNGSV、$BDGSV、$GNRMC 和$GNVTG 等 6 類幀的解析,結(jié)果存放在通過 gps.h 定義的 nmea_msg 結(jié)構(gòu)體內(nèi)。 SkyTraq 協(xié)議控制部分,此部分我們只實(shí)現(xiàn)了 SkyTraF8-BD 模組常用的 3 個(gè)配置:串口波特率設(shè)置、PPS 輸

36、出脈沖寬度設(shè)置、輸出頻率設(shè)置。 串口波特率設(shè)置,通過函數(shù) SkyTra_Cfg_Prt 實(shí)現(xiàn),該函數(shù)可以設(shè)置模塊的波特率。 PPS 輸出脈沖寬度設(shè)置, 通過函數(shù) SkyTra_Cfg_Tp 實(shí)現(xiàn),可以設(shè)置脈沖寬度 (1us100ms)。 輸出頻率設(shè)置,通過函數(shù) SkyTraq_Cfg_Rate 實(shí)現(xiàn),該函數(shù)可以設(shè)置模塊的測量輸出頻率,最快可以達(dá)到 20Hz 的測量輸出頻率。 最后 SkyTraq_Send_Date 函數(shù),用于發(fā)送一批設(shè)置好的數(shù)據(jù)給串口 3,完成對(duì) GPS 模塊的配置。 我們將這 3 個(gè)函數(shù)都加入 USMART 控制,方便大家測試。另外要在 usart3.h 里面,將 USAR

37、T3_MAX_RECV_LEN 的值設(shè)置為 800,。然后在 gps.h 里面,我們輸入如下代碼: 開源電子網(wǎng)08/09/2018#ifndef GPS_H #define GPS_H #include sys.h/GPS NMEA-0183 協(xié)議重要參數(shù)結(jié)構(gòu)體定義 / 信 息 packed typedef structcfg_rate-end=0X0A0D;/ 發(fā) 送 結(jié) 束 符 ( 小 端 模 式 ) SkyTra_Send_Date(u8*)cfg_rate,sizeof(SkyTra_PosRate);/發(fā)送數(shù)據(jù)給 SkyTra return SkyTra

38、_Cfg_Ack_Check();/發(fā)送一批數(shù)據(jù)給 SkyTraF8-BD,這里通過串口 3 發(fā)送 /dbuf:數(shù)據(jù)緩存首地址 /len:要發(fā)送的字節(jié)數(shù) void SkyTra_Send_Date(u8* dbuf,u16 len)u16 j;for(j=0;jSR&0X40)=0);/循環(huán)發(fā)送,直到發(fā)送完畢USART3-DR=dbufj;正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018u8 num;/編 號(hào) u8 eledeg;/仰角u16 azideg;/方位角u8 sn;/信噪比 nmea_slmsg;/北斗 NMEA-01

39、83 協(xié)議重要參數(shù)結(jié)構(gòu)體定義 /信息 packed typedef structu8 beidou_num;/編號(hào)u8 beidou_eledeg; /仰角u16 beidou_azideg; /方位角u8 beidou_sn;/信噪比 beidou_nmea_slmsg;/UTC 時(shí)間信息 packed typedef structu16 year; /年份u8 month;/月份u8 date; /日期 u8 hour; /小時(shí)u8 min; / 分鐘u8 sec; / 秒 鐘 nmea_utc_time;/NMEA 0183 協(xié)議解析后數(shù)據(jù)存放結(jié)構(gòu)體 packed typedef str

40、uctu8 svnum;/可見 GPS數(shù) u8 beidou_svnum;/可見北斗數(shù)nmea_slmsg slmsg12;/最多 12 顆 GPS beidou_nmea_slmsg beidou_slmsg12;/暫且算最多 12 顆北斗 nmea_utc_time utc;/UTC 時(shí)間 u32 latitude;/緯度 分?jǐn)U大 100000 倍,實(shí)際要除以 100000u8 nshemi;/北緯/南緯,N:北緯;S:南緯 u32 longitude;/經(jīng)度 分?jǐn)U大 100000 倍,實(shí)際要除以 100000 u8 ewhemi;/東經(jīng)/西經(jīng),E:東經(jīng);W:西經(jīng) u8 gpssta;/G

41、PS 狀態(tài):0,未定位;1,非差分定位;2,差分定位;6,正在估算. u8 posslnum;/用于定位的 GPS數(shù),012.u8 possl12;/用于定位的編號(hào) u8 fixmode;/定位類型:1,沒有定位;2,2D 定位;3,3D 定位 u16 pdop;/位置精度因子 0500,對(duì)應(yīng)實(shí)際值 050.0u16 hdop;/水平精度因子 0500,對(duì)應(yīng)實(shí)際值 050.0正點(diǎn)原子AN1808開源電子網(wǎng)08/09/2018u16 vdop;/垂度因子 0500,對(duì)應(yīng)實(shí)際值 050.0int altitude;/海拔高度,放大了 1

42、0 倍,實(shí)際除以 10.單位:0.1m u16 speed;/地面速率,放大了 1000 倍,實(shí)際除以 10.單位:0.001 公里/小時(shí) nmea_msg;/SkyTra S1216F8 配置波特率結(jié)構(gòu)體 packed typedef structu16 sos;/啟動(dòng)序列,固定為 0XA0A1u16 PL;/有效數(shù)據(jù)長度 0X0004; u8 id;/ID,固定為 0X05u8 com_port;/COM 口,固定為 0X00,即 COM1 u8 Baud_id;/波特率(08,4800,9600,19200,38400,57600,115200,230400,460800,921600)

43、 u8 Attributes;/配置數(shù)據(jù)保存位置 ,0 保存到 SRAM,1 保存到 SRAM&FLASH,2 臨時(shí)保存 u8 CS;/校驗(yàn)值 u16 end;/結(jié)束符:0X0D0ASkyTra_baudrate;/SkyTra S1216F8-BD 配置輸出信息結(jié)構(gòu)體 packed typedef structu16 sos;/啟動(dòng)序列,固定為 0XA0A1u16 PL;/有效數(shù)據(jù)長度 0X0009; u8 id;/ID,固定為 0X08u8 GGA;/1255(s),0:disableu8 GSA;/1255(s),0:disableu8 GSV;/1255(s),0:disableu8

44、GLL;/1255(s),0:disableu8 RMC;/1255(s),0:disableu8 VTG;/1255(s),0:disableu8 ZDA;/1255(s),0:disable u8 Attributes;/配置數(shù)據(jù)保存位置 ,0 保存到 SRAM,1 保存到 SRAM&FLASH,2 臨時(shí)保存 u8 CS;/校驗(yàn)值 u16 end;/結(jié)束符:0X0D0ASkyTra_outmsg;/SkyTra S1216F8-BD 配置位置更新率結(jié)構(gòu)體 packed typedef 正點(diǎn)原子AN1808開源電子網(wǎng)0

45、8/09/2018u16 sos;/啟動(dòng)序列,固定為 0XA0A1u16 PL;/有效數(shù)據(jù)長度 0X0003; u8 id;/ID,固定為 0X0Eu8 rate;/取值范圍:1, 2, 4, 5, 8, 10, 20, 25, 40, 50u8 Attributes;/配置數(shù)據(jù)保存位置 ,0 保存到 SRAM,1 保存到 SRAM&FLASH,2 臨時(shí)保存 u8 CS;/校驗(yàn)值 u16 end;/結(jié)束符:0X0D0ASkyTra_PosRate;/SkyTra S1216F8-BD 配置輸出脈沖(PPS)寬度結(jié)構(gòu)體 packed typedef structu16 sos;/啟動(dòng)序列,固定為

46、 0XA0A1u16 PL;/有效數(shù)據(jù)長度 0X0007; u8 id;/ID,固定為 0X65u8 Sub_ID;/0X01u32 width;/1100000(us) u8 Attributes;/配置數(shù)據(jù)保存位置 ,0 保存到 SRAM,1 保存到 SRAM&FLASH,2 臨時(shí)保存 u8 CS;/校驗(yàn)值 u16 end;/結(jié)束符:0X0D0ASkyTra_pps_width;/SkyTra S1216F8-BDACK 結(jié)構(gòu)體 packed typedef structu16 sos;/啟動(dòng)序列,固定為 0XA0A1u16 PL;/有效數(shù)據(jù)長度 0X0002; u8 id;/ID,固定為

47、 0X83 u8 ACK_ID;u8 CS;/校驗(yàn)值 u16 end;/結(jié)束符 SkyTra_ACK;/SkyTra S1216F8 -BD NACK 結(jié)構(gòu)體 packed typedef structu16 sos;/啟動(dòng)序列,固定為 0XA0A1u16 PL;/有效數(shù)據(jù)長度 0X0002; u8 id;/ID,固定為 0X84 u8 NACK_ID;u8 CS;/校驗(yàn)值 u16 end;/結(jié)束符 正點(diǎn)原子AN1808gps.h 里面的內(nèi)容,都有非常詳細(xì)的備注,這里就不多說了。最后,在 main.c 里面,修改代碼如下: 開源電子網(wǎng)08/09/2018u8 USART1_TX_BUFUSART2_MAX_RECV_LEN;/串口 1,發(fā)送緩存區(qū) nmea_msg gpsx;/GPS 信息 align(4) u8 dtbuf50;/打印緩存器 const u8*fixmode_tbl4=Fail,Fail, 2D , 3D

溫馨提示

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

評(píng)論

0/150

提交評(píng)論