在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux應(yīng)用開(kāi)發(fā)-GPS電子圍欄設(shè)計(jì)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:16 ? 次閱讀

1. 前言

GPS電子圍欄這個(gè)功能是地圖的一個(gè)擴(kuò)展技術(shù)功能,通過(guò)地圖經(jīng)緯度在地圖上圈一個(gè)范圍,在這個(gè)范圍內(nèi)進(jìn)出可以在服務(wù)器上進(jìn)行實(shí)時(shí)記錄,提示警報(bào)。現(xiàn)在的共享單車(chē)、共享汽車(chē)都有這個(gè)功能,限制車(chē)輛只能在某一個(gè)范圍內(nèi)使用,超出后就自動(dòng)斷電或者作出提示。要實(shí)現(xiàn)這個(gè)地理圍欄,就需要實(shí)時(shí)獲取當(dāng)前的經(jīng)緯度,然后調(diào)用地圖SDK接口進(jìn)行處理,完成圍欄邏輯設(shè)計(jì)。

這種地理圍欄應(yīng)用的場(chǎng)景非常多,比如:

(1)上面說(shuō)的共享單車(chē),超出區(qū)域斷電;

(2)小孩子的兒童手表、可以設(shè)置地理圍欄,家長(zhǎng)可以給孩子設(shè)置一個(gè)地圖范圍,如果孩子離開(kāi)了這個(gè)范圍,父母的就可以收到通知,方便知道孩子當(dāng)前位置在哪里,防止走丟;

(3)4S店的車(chē)子也會(huì)設(shè)置電子圍欄,當(dāng)試駕、試乘離開(kāi)規(guī)定的范圍會(huì)通知4S店。

在完成GPS圍欄功能之后,通過(guò)得到的GPS數(shù)據(jù)還可以做很多相關(guān)的事情,比如:導(dǎo)航路線規(guī)劃,行走的路線記錄、實(shí)時(shí)定位等。

這篇文章就采用Linux開(kāi)發(fā)板來(lái)實(shí)現(xiàn)這個(gè)GPS圍欄功能,這個(gè)項(xiàng)目分為了兩個(gè)部分:1. 服務(wù)器部分 2. 設(shè)備部分

設(shè)備端就是實(shí)時(shí)采集GPS模塊得到的經(jīng)緯度,通過(guò)網(wǎng)絡(luò)上傳給服務(wù)器,服務(wù)器調(diào)用百度地圖、高德地圖的API接口,根據(jù)規(guī)劃的地理圍欄范圍進(jìn)行判斷,在地圖上繪制當(dāng)前設(shè)備所在的位置,還可以畫(huà)出軌跡線。

image-20220123234737281image-20220123234826634image-20220123235613952

2. 項(xiàng)目實(shí)現(xiàn)代碼

當(dāng)前文章講的就是設(shè)備端的實(shí)現(xiàn),如何讀取GPS坐標(biāo)、轉(zhuǎn)換、上傳到服務(wù)器的流程。

GPS模塊是串口接口,Linux開(kāi)發(fā)板有串口接口,如果串口接口不夠用,也可以把模塊接到CH340這種USB轉(zhuǎn)TTL模塊上,再插在開(kāi)發(fā)板的USB口上,在/dev下會(huì)生成ttyUSBx節(jié)點(diǎn)。Linux下串口編程有一套標(biāo)準(zhǔn)的接口,編程非常方便。

讀取串口數(shù)據(jù)可以采用 poll、select、epoll機(jī)制等。也可以使用異步通知機(jī)制:fasync。串口配置的時(shí)候可以配置每次讀取的超時(shí)時(shí)間,方便知道什么時(shí)候一包數(shù)據(jù)接收完畢了。

GPS模塊也支持配置,正常情況下GPS模塊會(huì)將接收的衛(wèi)星所有數(shù)據(jù)返回來(lái),如果想要提高效率,可以設(shè)置GPS模塊,讓它只是返回想要的字段,這樣接收數(shù)據(jù)解析數(shù)據(jù)效率就高很多。

2.1 GPS坐標(biāo)數(shù)據(jù)讀取

下面這份代碼是接收GPS經(jīng)緯度的串口代碼。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include      
#include 


/*
標(biāo)準(zhǔn)串口屬性:
波特率	  : 115200
停止位    : 1個(gè)
奇偶校驗(yàn)位: 沒(méi)有校驗(yàn)位
數(shù)據(jù)位    : 8位
*/
int uart_fd;//存放串口的文件描述符

int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("參數(shù)格式: ./app /dev/ttySACx 或者 /dev/ttyUSBx\n");
		exit(-1);
	}
	
	/*1. 打開(kāi)串口*/
	uart_fd=open(argv[1],O_RDWR|O_NOCTTY); 
    if(uart_fd<0)
	{
		printf("%s 串口設(shè)備打開(kāi)失敗!\n",argv[1]);
		exit(-1);
	}
	/*2. 清空終端未完成的輸入/輸出請(qǐng)求及數(shù)據(jù)、刷新緩存*/
	tcflush(uart_fd,TCIFLUSH); 		   
	
	/*3. 填充保存串口屬性結(jié)構(gòu)體*/
	struct termios newtio; 
	memset(&newtio,0,sizeof(newtio));   //初始化結(jié)構(gòu)體空間為0
	cfsetispeed(&newtio, B115200);  	//配置串口的輸入波特率為115200
    cfsetospeed(&newtio, B115200);  	//配置串口的輸出波特率為115200
	newtio.c_cflag  |=  CREAD; 			//啟用串口的接收功能
    newtio.c_cflag  &= ~CSIZE;  		//清除串口的數(shù)據(jù)位
    newtio.c_cflag  |=  CS8;    		//配置串口的數(shù)據(jù)位為8位
    newtio.c_cflag  &= ~PARENB; 		//配置串口的校驗(yàn)位:無(wú)校驗(yàn)
    newtio.c_cflag  &=  ~CSTOPB;     	//配置的停止位:1個(gè)
	//newtio.c_lflag &= ~(ICANON);  	    //不使用規(guī)范模式(非標(biāo)準(zhǔn)模式)
	newtio.c_cc[VTIME]=100;
	newtio.c_cc[VMIN]=10;
	//newtio.c_iflag &= ~ IGNCR;  //不忽略回車(chē)字符
	//newtio.c_iflag &= ICRNL;//不轉(zhuǎn)換
	/*4. 配置串口的屬性*/
    tcsetattr(uart_fd,TCSANOW,&newtio);
	
	int i,cnt=0;
	char usart_rx_buff[1024];
    while(1) 
    {
		cnt=read(uart_fd,(void*)usart_rx_buff,1024); //從串口RX端口讀取數(shù)據(jù)
		if(cnt>0)
		{
			for(i=0;i;i++)>

2.2 GPS數(shù)據(jù)格式與字段含義

$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F
$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D
$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37
$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A
$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B
$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C
$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F
$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62
$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D
$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14
$GNZDA,114955.000,06,11,2017,00,00*47
$GPTXT,01,01,01,ANTENNA OK*35


序號(hào) 命令 說(shuō)明 最大幀長(zhǎng)
1 $GNGGA GPS/北斗定位信息 72
2 $GNGSA 當(dāng)前衛(wèi)星信息 65
3 $GPGSV 可見(jiàn) GPS 衛(wèi)星信息 210
4 $BDGSV 可見(jiàn)北斗衛(wèi)星信息 210
5 $GNRMC 推薦定位信息 70
6 $GNVTG 地面速度信息 34
7 $GNGLL 大地坐標(biāo)信息 --
8 $GNZDA 當(dāng)前時(shí)間(UTC1)信息 --


1, $GNGGA (GPS 定位信息, Global Positioning System Fix Data)
$GNGGA 語(yǔ)句的基本格式如下(其中 M 指單位 M, hh 指校驗(yàn)和, CR 和 LF 代表回車(chē)
換行,下同):
$GNGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
(1) UTC 時(shí)間,格式為 hhmmss.ss;
(2) 緯度,格式為 ddmm.mmmmm(度分格式);
(3) 緯度半球, N 或 S(北緯或南緯);
(4) 經(jīng)度,格式為 dddmm.mmmmm(度分格式);
(5) 經(jīng)度半球, E 或 W(東經(jīng)或西經(jīng));
(6) GPS 狀態(tài), 0=未定位, 1=非差分定位, 2=差分定位;
(7) 正在使用的用于定位的衛(wèi)星數(shù)量(00~12)
(8) HDOP 水平精確度因子(0.5~99.9)
(9) 海拔高度(-9999.9 到 9999.9 米)
(10) 大地水準(zhǔn)面高度(-9999.9 到 9999.9 米)
(11) 差分時(shí)間(從最近一次接收到差分信號(hào)開(kāi)始的秒數(shù),非差分定位,此項(xiàng)為空)
(12) 差分參考基站標(biāo)號(hào)(0000 到 1023, 首位 0 也將傳送,非差分定位,此項(xiàng)為空)
舉例如下:
$GNGGA,095528.000,2318.1133,N,11319.7210,E,1,06,3.7,55.1,M,-5.4,M,,0000*69


2, $GNGSA(當(dāng)前衛(wèi)星信息)
$GNGSA 語(yǔ)句的基本格式如下:
$GNGSA,(1),(2),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(4),(5),(6)*hh(CR)(LF)
(1) 模式, M = 手動(dòng), A = 自動(dòng)。
(2) 定位類(lèi)型, 1=未定位, 2=2D 定位, 3=3D 定位。
(3) 正在用于定位的衛(wèi)星號(hào)(01~32)
(4) PDOP 綜合位置精度因子(0.5-99.9)ALIENTEK
(5) HDOP 水平精度因子 1(0.5-99.9)
(6) VDOP 垂直精度因子(0.5-99.9)
舉例如下:
$GNGSA,A,3,14,22,24,12,,,,,,,,,4.2,3.7,2.1*2D
$GNGSA,A,3,209,214,,,,,,,,,,,4.2,3.7,2.1*21
注 1: 精度因子值越小,則準(zhǔn)確度越高。


3, $GPGSV(可見(jiàn)衛(wèi)星數(shù), GPS Satellites in View)
$GPGSV 語(yǔ)句的基本格式如下:
$GPGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV 語(yǔ)句總數(shù)。
(2) 本句 GSV 的編號(hào)。
(3) 可見(jiàn)衛(wèi)星的總數(shù)(00~12,前面的 0 也將被傳輸)。
(4) 衛(wèi)星編號(hào)(01~32,前面的 0 也將被傳輸)。
(5) 衛(wèi)星仰角(00~90 度,前面的 0 也將被傳輸)。
(6) 衛(wèi)星方位角(000~359 度,前面的 0 也將被傳輸)
(7) 信噪比(00~99dB,沒(méi)有跟蹤到衛(wèi)星時(shí)為空)。
注:每條 GSV 語(yǔ)句最多包括四顆衛(wèi)星的信息,其他衛(wèi)星的信息將在下一條$GPGSV 語(yǔ)句中輸出。
舉例如下:
$GPGSV,3,1,11,18,73,129,19,10,71,335,40,22,63,323,41,25,49,127,06*78
$GPGSV,3,2,11,14,41,325,46,12,36,072,34,31,32,238,22,21,23,194,08*76
$GPGSV,3,3,11,24,21,039,40,20,08,139,07,15,08,086,03*45


4, $BDGSV(可見(jiàn)衛(wèi)星數(shù), GPS Satellites in View)
$BDGSV 語(yǔ)句的基本格式如下:
$BDGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV 語(yǔ)句總數(shù)。
(2) 本句 GSV 的編號(hào)。
(3) 可見(jiàn)衛(wèi)星的總數(shù)(00~12,前面的 0 也將被傳輸)。
(4) 衛(wèi)星編號(hào)(01~32,前面的 0 也將被傳輸)。
(5) 衛(wèi)星仰角(00~90 度,前面的 0 也將被傳輸)。
(6) 衛(wèi)星方位角(000~359 度,前面的 0 也將被傳輸)
(7) 信噪比(00~99dB,沒(méi)有跟蹤到衛(wèi)星時(shí)為空)。
注:每條 GSV 語(yǔ)句最多包括四顆衛(wèi)星的信息,其他衛(wèi)星的信息將在下一條$BDGSV 語(yǔ)句中輸出。
舉例如下:
$BDGSV,1,1,02,209,64,354,40,214,05,318,40*69


5, $GNRMC(推薦定位信息, Recommended Minimum Specific GPS/Transit Data)
$GNRMC 語(yǔ)句的基本格式如下:
$GNRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC 時(shí)間, hhmmss(時(shí)分秒)
(2) 定位狀態(tài), A=有效定位, V=無(wú)效定位
(3) 緯度 ddmm.mmmmm(度分)
(4) 緯度半球 N(北半球)或 S(南半球)ALIENTEK
(5) 經(jīng)度 dddmm.mmmmm(度分)
(6) 經(jīng)度半球 E(東經(jīng))或 W(西經(jīng))
(7) 地面速率(000.0~999.9 節(jié))
(8) 地面航向(000.0~359.9 度,以真北方為參考基準(zhǔn))
(9) UTC 日期, ddmmyy(日月年)
(10) 磁偏角(000.0~180.0 度,前導(dǎo)位數(shù)不足則補(bǔ) 0)
(11) 磁偏角方向, E(東)或 W(西)
(12) 模式指示(A=自主定位, D=差分, E=估算, N=數(shù)據(jù)無(wú)效)
舉例如下:
$GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73


6, $GNVTG(地面速度信息, Track Made Good and Ground Speed)
$GNVTG 語(yǔ)句的基本格式如下:
$GNVTG,(1),T,(2),M,(3),N,(4),K,(5)*hh(CR)(LF)
(1) 以真北為參考基準(zhǔn)的地面航向(000~359 度,前面的 0 也將被傳輸)
(2) 以磁北為參考基準(zhǔn)的地面航向(000~359 度,前面的 0 也將被傳輸)
(3) 地面速率(000.0~999.9 節(jié),前面的 0 也將被傳輸)
(4) 地面速率(0000.0~1851.8 公里/小時(shí),前面的 0 也將被傳輸)
(5) 模式指示(A=自主定位, D=差分, E=估算, N=數(shù)據(jù)無(wú)效)
舉例如下:
$GNVTG,005.7,T,,M,000.0,N,000.0,K,A*11


7, $GNGLL(定位地理信息, Geographic Position)
$GNGLL 語(yǔ)句的基本格式如下:
$GNGLL,(1),(2),(3),(4),(5),(6),(7)*hh(CR)(LF)
(1) 緯度 ddmm.mmmmm(度分)
(2) 緯度半球 N(北半球)或 S(南半球)
(3) 經(jīng)度 dddmm.mmmmm(度分)
(4) 經(jīng)度半球 E(東經(jīng))或 W(西經(jīng))
(5) UTC 時(shí)間: hhmmss(時(shí)分秒)
(6) 定位狀態(tài), A=有效定位, V=無(wú)效定位
(7) 模式指示(A=自主定位, D=差分, E=估算, N=數(shù)據(jù)無(wú)效)
舉例如下:
$GNGLL,2318.1330,N,11319.7250,E,095556.000,A,A*4F


7, $GNZDA(當(dāng)前時(shí)間信息)
$GNZDA 語(yǔ)句的基本格式如下:
$GNZDA,(1),(2),(3),(4), (5), (6)*hh(CR)(LF)
(1) UTC 時(shí)間: hhmmss(時(shí)分秒)
(2) 日
(3) 月
(4) 年
(5) 本地區(qū)域小時(shí)(NEO-6M 未用到,為 00)
(6) 本地區(qū)域分鐘(NEO-6M 未用到,為 00)
舉例如下:
$GNZDA,095555.000,08,12,2015,00,00*4C
復(fù)制代碼

2.3 GPS數(shù)據(jù)解析

/*
函數(shù)功能:從buf里面得到第cnt個(gè)逗號(hào)所在的位置
返 回 值:0~254,代表逗號(hào)所在位置的偏移.
255,代表不存在第cnt個(gè)逗號(hào)
*/
u8 GPS_GetCommaOffset(u8 *buf,u8 cnt)
{
	u8 *p=buf;
	while(cnt)
	{
		if(*buf=='*'||*buf<' '||*buf>'z')return 255;//遇到'*'或者非法字符,則不存在第cx個(gè)逗號(hào)
		if(*buf==',')cnt--;
		buf++;
	}
	return buf-p; //計(jì)算偏移量
}


/*
函數(shù)功能:m^n函數(shù)
返 回 值:m^n次方.
*/
u32 GPS_GetPow(u8 m,u8 n)
{
	u32 tmp=1;
	while(n--)tmp*=m;
	return tmp;
}


/*
函數(shù)功能:str轉(zhuǎn)換為數(shù)字,以','或者'*'結(jié)束
函數(shù)參數(shù):buf:數(shù)字存儲(chǔ)區(qū)
		 dx:小數(shù)點(diǎn)位數(shù),返回給調(diào)用函數(shù)
返 回 值:轉(zhuǎn)換后的整數(shù)數(shù)值
*/
int GPS_StrtoNum(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ù)的長(zhǎng)度
	{
		if(*p=='-'){ mask|=0X02; p++; }//是負(fù)數(shù)
		if(*p==','||(*p=='*'))break;//遇到結(jié)束了
		if(*p=='.'){ mask|=0X01; p++; }//遇到小數(shù)點(diǎn)了
		else if(*p>'9'||(*p<'0'))	//有非法字符
		{
			ilen=0;
			flen=0;
			break;
		}
		if(mask&0X01)flen++;
		else ilen++;
		p++;
	}
	if(mask&0X02)buf++;	//去掉負(fù)號(hào)
	for(i=0; i5)flen=5;	//最多取5位小數(shù)
	*dx=flen;	 		//小數(shù)點(diǎn)位數(shù)
	for(i=0; isvnum=GPS_StrtoNum(p1+posx,&dx);
	for(i=0; islmsg[slx].num=GPS_StrtoNum(p1+posx,&dx);	//得到衛(wèi)星編號(hào)
			else break;
			posx=GPS_GetCommaOffset(p1,5+j*4);
			if(posx!=0XFF)GPS_DecodingInfo->slmsg[slx].eledeg=GPS_StrtoNum(p1+posx,&dx);//得到衛(wèi)星仰角 
			else break;
			posx=GPS_GetCommaOffset(p1,6+j*4);
			if(posx!=0XFF)GPS_DecodingInfo->slmsg[slx].azideg=GPS_StrtoNum(p1+posx,&dx);//得到衛(wèi)星方位角
			else break;
			posx=GPS_GetCommaOffset(p1,7+j*4);
			if(posx!=0XFF)GPS_DecodingInfo->slmsg[slx].sn=GPS_StrtoNum(p1+posx,&dx);	//得到衛(wèi)星信噪比
			else break;
			slx++;
		}
		p=p1+1;//切換到下一個(gè)GPGSV信息
	}
}


/*
函數(shù)功能:分析BDGSV信息
函數(shù)參數(shù):GPS_DecodingInfo:nmea信息結(jié)構(gòu)體
		  buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_BDGSV_InfoGet(GPS_Msg *GPS_DecodingInfo,u8 *buf)
{
	u8 *p,*p1,dx;
	u8 len,i,j,slx=0;
	u8 posx;
	p=buf;
	p1=(u8*)strstr((const char *)p,"$BDGSV");
	if(!p1)return; //沒(méi)有查找成功
	len=p1[7]-'0';								//得到BDGSV的條數(shù)
	posx=GPS_GetCommaOffset(p1,3); 					//得到可見(jiàn)北斗衛(wèi)星總數(shù)
	if(posx!=0XFF)GPS_DecodingInfo->beidou_svnum=GPS_StrtoNum(p1+posx,&dx);
	for(i=0; ibeidou_slmsg[slx].beidou_num=GPS_StrtoNum(p1+posx,&dx);	//得到衛(wèi)星編號(hào)
			else break;
			posx=GPS_GetCommaOffset(p1,5+j*4);
			if(posx!=0XFF)GPS_DecodingInfo->beidou_slmsg[slx].beidou_eledeg=GPS_StrtoNum(p1+posx,&dx);//得到衛(wèi)星仰角 
			else break;
			posx=GPS_GetCommaOffset(p1,6+j*4);
			if(posx!=0XFF)GPS_DecodingInfo->beidou_slmsg[slx].beidou_azideg=GPS_StrtoNum(p1+posx,&dx);//得到衛(wèi)星方位角
			else break;
			posx=GPS_GetCommaOffset(p1,7+j*4);
			if(posx!=0XFF)GPS_DecodingInfo->beidou_slmsg[slx].beidou_sn=GPS_StrtoNum(p1+posx,&dx);	//得到衛(wèi)星信噪比
			else break;
			slx++;
		}
		p=p1+1;//切換到下一個(gè)BDGSV信息
	}
}


/*
函數(shù)功能:分析GNGGA信息
函數(shù)參數(shù):
		GPS_DecodingInfo:nmea信息結(jié)構(gòu)體
		buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_GNGGA_InfoGet(GPS_Msg *GPS_DecodingInfo,u8 *buf)
{
	u8 *p1,dx;
	u8 posx;
	p1=(u8*)strstr((const char *)buf,"$GNGGA");
	if(!p1)return; //沒(méi)有查找成功
	posx=GPS_GetCommaOffset(p1,6);								//得到GPS狀態(tài)
	if(posx!=0XFF)GPS_DecodingInfo->gpssta=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,7);								//得到用于定位的衛(wèi)星數(shù)
	if(posx!=0XFF)GPS_DecodingInfo->posslnum=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,9);								//得到海拔高度
	if(posx!=0XFF)GPS_DecodingInfo->altitude=GPS_StrtoNum(p1+posx,&dx);
}


/*
函數(shù)功能:分析GPGSA信息
參    數(shù):GPS_DecodingInfo:nmea信息結(jié)構(gòu)體
		  buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_GPGSA_InfoGet(GPS_Msg *GPS_DecodingInfo,u8 *buf)
{
	u8 *p1,dx;
	u8 posx;
	u8 i;
	p1=(u8*)strstr((const char *)buf,"$GPGSA");
	if(!p1)return; //沒(méi)有查找成功
	posx=GPS_GetCommaOffset(p1,2);								//得到定位類(lèi)型
	if(posx!=0XFF)GPS_DecodingInfo->fixmode=GPS_StrtoNum(p1+posx,&dx);
	for(i=0; i<12; i++)										//得到定位衛(wèi)星編號(hào)
	{
		posx=GPS_GetCommaOffset(p1,3+i);
		if(posx!=0XFF)GPS_DecodingInfo->possl[i]=GPS_StrtoNum(p1+posx,&dx);
		else break;
	}
	posx=GPS_GetCommaOffset(p1,15);								//得到PDOP位置精度因子
	if(posx!=0XFF)GPS_DecodingInfo->pdop=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,16);								//得到HDOP位置精度因子
	if(posx!=0XFF)GPS_DecodingInfo->hdop=GPS_StrtoNum(p1+posx,&dx);
	posx=GPS_GetCommaOffset(p1,17);								//得到VDOP位置精度因子
	if(posx!=0XFF)GPS_DecodingInfo->vdop=GPS_StrtoNum(p1+posx,&dx);
}


/*
函數(shù)功能:分析GNRMC信息
函數(shù)參數(shù):GPS_DecodingInfo:nmea信息結(jié)構(gòu)體
		 buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_GNRMC_InfoGet(GPS_Msg *GPS_DecodingInfo,u8 *buf)
{
	u8 *p1,dx;
	u8 posx;
	u32 temp;
	float rs;
	p1=(u8*)strstr((const char *)buf,"$GNRMC");//"$GNRMC",經(jīng)常有&和GNRMC分開(kāi)的情況,判斷GPRMC.
	if(!p1)return; //沒(méi)有查找成功
	posx=GPS_GetCommaOffset(p1,1);								//得到UTC時(shí)間
	if(posx!=0XFF)
	{
		temp=GPS_StrtoNum(p1+posx,&dx)/GPS_GetPow(10,dx);	 	//得到UTC時(shí)間,去掉ms
		GPS_DecodingInfo->utc.hour=temp/10000;
		GPS_DecodingInfo->utc.min=(temp/100)%100;
		GPS_DecodingInfo->utc.sec=temp%100;
	}
	posx=GPS_GetCommaOffset(p1,3);								//得到緯度
	if(posx!=0XFF)
	{
		temp=GPS_StrtoNum(p1+posx,&dx);
		GPS_DecodingInfo->latitude=temp/GPS_GetPow(10,dx+2);	//得到°
		rs=(float)(temp%GPS_GetPow(10,dx+2));				//得到'		 
		GPS_DecodingInfo->latitude=(u32)(GPS_DecodingInfo->latitude*GPS_GetPow(10,5)+(rs*GPS_GetPow(10,5-dx))/60);//轉(zhuǎn)換為° 
	}
	posx=GPS_GetCommaOffset(p1,4);								//南緯還是北緯 
	if(posx!=0XFF)GPS_DecodingInfo->nshemi=*(p1+posx);
	posx=GPS_GetCommaOffset(p1,5);								//得到經(jīng)度
	if(posx!=0XFF)
	{
		temp=GPS_StrtoNum(p1+posx,&dx);
		GPS_DecodingInfo->longitude=temp/GPS_GetPow(10,dx+2);	//得到°
		rs=(float)(temp%GPS_GetPow(10,dx+2));				//得到'		 
		GPS_DecodingInfo->longitude=(u32)(GPS_DecodingInfo->longitude*GPS_GetPow(10,5)+(rs*GPS_GetPow(10,5-dx))/60);//轉(zhuǎn)換為° 
	}
	posx=GPS_GetCommaOffset(p1,6);								//東經(jīng)還是西經(jīng)
	if(posx!=0XFF)GPS_DecodingInfo->ewhemi=*(p1+posx);
	posx=GPS_GetCommaOffset(p1,9);								//得到UTC日期
	if(posx!=0XFF)
	{
		temp=GPS_StrtoNum(p1+posx,&dx);		 				//得到UTC日期
		GPS_DecodingInfo->utc.date=temp/10000;
		GPS_DecodingInfo->utc.month=(temp/100)%100;
		GPS_DecodingInfo->utc.year=2000+temp%100;
	}
}


/*
函數(shù)功能:分析GNVTG信息
函數(shù)參數(shù):GPS_DecodingInfo:nmea信息結(jié)構(gòu)體
		  buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_GNVTG_InfoGet(GPS_Msg *GPS_DecodingInfo,u8 *buf)
{
	u8 *p1,dx;
	u8 posx;
	p1=(u8*)strstr((const char *)buf,"$GNVTG");
	if(!p1)return; //沒(méi)有查找成功
	posx=GPS_GetCommaOffset(p1,7);								//得到地面速率
	if(posx!=0XFF)
	{
		GPS_DecodingInfo->speed=GPS_StrtoNum(p1+posx,&dx);
		if(dx<3)GPS_DecodingInfo->speed*=GPS_GetPow(10,3-dx);	 	 		//確保擴(kuò)大1000倍
	}
}

/*
函數(shù)功能:提取GPS信息
函數(shù)參數(shù):GPS_DecodingInfo:nmea信息結(jié)構(gòu)體
		  buf:接收到的GPS數(shù)據(jù)緩沖區(qū)首地址
*/
void GPS_InfoGet(GPS_Msg *GPS_DecodingInfo,u8 *buf)
{
	GPS_GPGSV_InfoGet(GPS_DecodingInfo,buf);	//GPGSV解析-OK
	GPS_BDGSV_InfoGet(GPS_DecodingInfo,buf);	//BDGSV解析-OK
	GPS_GNGGA_InfoGet(GPS_DecodingInfo,buf);	//GNGGA解析-OK 	
	GPS_GPGSA_InfoGet(GPS_DecodingInfo,buf);	//GPNSA解析-OK
	GPS_GNRMC_InfoGet(GPS_DecodingInfo,buf);	//GPNMC解析-OK
	GPS_GNVTG_InfoGet(GPS_DecodingInfo,buf);	//GPNTG解析-OK
}
復(fù)制代碼;>;>;>;>

2.4 GPS數(shù)據(jù)打印

/*
函數(shù)功能:顯示GPS定位信息
*/
void GPS_MsgShow(void)
{
    float tp;
    tp=GPS_DecodingInfo.longitude;
    sprintf((char *)dtbuf,"經(jīng)度:%.5f %1c",tp/=100000,GPS_DecodingInfo.ewhemi);    //得到經(jīng)度字符串
    printf("%s\r\n",dtbuf);
    tp=GPS_DecodingInfo.latitude;
    sprintf((char *)dtbuf,"緯度:%.5f %1c",tp/=100000,GPS_DecodingInfo.nshemi);    //得到緯度字符串
    printf("%s\r\n",dtbuf);
    tp=GPS_DecodingInfo.altitude;
    sprintf((char *)dtbuf,"高度:%.1fm",tp/=10);                              //得到高度字符串
    printf("%s\r\n",dtbuf);
    tp=GPS_DecodingInfo.speed;
    sprintf((char *)dtbuf,"速度:%.3fkm/h",tp/=1000);                 //得到速度字符串    
    printf("%s\r\n",dtbuf);
    if(GPS_DecodingInfo.fixmode<=3)                                                         //定位狀態(tài)
?    {
?        sprintf((char *)dtbuf,"定位模式:%s",fixmode_tbl[GPS_DecodingInfo.fixmode]);
?        printf("%s\r\n",dtbuf);
?    }
?    sprintf((char *)dtbuf,"GPS+BD 定位的GPS衛(wèi)星數(shù):%02d",GPS_DecodingInfo.posslnum);           //用于定位的GPS衛(wèi)星數(shù)
?    printf("%s\r\n",dtbuf);
?    sprintf((char *)dtbuf,"GPS 可見(jiàn)GPS衛(wèi)星數(shù):%02d",GPS_DecodingInfo.svnum%100);          //可見(jiàn)GPS衛(wèi)星數(shù)
?    printf("%s\r\n",dtbuf);
??
?    sprintf((char *)dtbuf,"BD 可見(jiàn)北斗衛(wèi)星數(shù):%02d",GPS_DecodingInfo.beidou_svnum%100);         //可見(jiàn)北斗衛(wèi)星數(shù)
?    printf("%s\r\n",dtbuf);
??
?    sprintf((char *)dtbuf,"UTC日期:%04d/%02d/%02d ? ",GPS_DecodingInfo.utc.year,GPS_DecodingInfo.utc.month,GPS_DecodingInfo.utc.date);    //顯示UTC日期
?    printf("%s\r\n",dtbuf);
?    sprintf((char *)dtbuf,"顯示UTC時(shí)間:%02d:%02d:%02d ? ",GPS_DecodingInfo.utc.hour,GPS_DecodingInfo.utc.min,GPS_DecodingInfo.utc.sec); //顯示UTC時(shí)間
?    printf("%s\r\n",dtbuf);
?}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gps
    gps
    +關(guān)注

    關(guān)注

    22

    文章

    2897

    瀏覽量

    166332
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11315

    瀏覽量

    209812
  • 電子圍欄
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10746
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    上海索脈電子圍欄設(shè)計(jì)方案

    本帖最后由 eehome 于 2013-1-5 09:51 編輯 上海索脈電子圍欄設(shè)計(jì)方案
    發(fā)表于 08-20 13:50

    電子圍欄起源于歐洲嗎

    了“電子圍欄”的開(kāi)發(fā)和推廣。牛羊等遇到“電子圍欄”的電擊阻擋而退回,很好地起到“牧羊人”的作用,同時(shí)也防止圈外的大型動(dòng)物或猛獸跑進(jìn)來(lái),對(duì)當(dāng)時(shí)
    發(fā)表于 04-25 15:40

    北斗+GPS雙模定位模塊助力ofo小黃車(chē)跑通電子圍欄技術(shù)

    。這是國(guó)內(nèi)首個(gè)進(jìn)入實(shí)用階段的電子圍欄試點(diǎn)。而率先完成報(bào)備和數(shù)據(jù)接口調(diào)試工作的ofo小黃車(chē),成為了首家跑通電子圍欄技術(shù)的共享單車(chē)企業(yè),而智能鎖中的北斗+
    發(fā)表于 06-16 16:02

    SKYLAB助力共享單車(chē)搭建電子圍欄系統(tǒng)

    `為了對(duì)共享單車(chē)進(jìn)行智能化管理,引導(dǎo)企業(yè)規(guī)范管理,用戶有序停車(chē)。近日,北京在通州和朝陽(yáng)兩區(qū)開(kāi)始試點(diǎn)共享自行車(chē)電子圍欄,目前已試點(diǎn)400多個(gè),并將繼續(xù)增加。而拒絕接入的企業(yè)將被要求退出。 據(jù)悉,國(guó)內(nèi)
    發(fā)表于 07-27 11:55

    電子圍欄有什么功能?

    電子圍欄按其在現(xiàn)場(chǎng)的安裝位置,分為獨(dú)立式,附屬式和墻頂式三種基本安裝形式。獨(dú)立式電子圍欄,直接架設(shè)在地面上。其高度約2米左右,一般安裝10-12根線纜。考慮到設(shè)備和人身安全,要求在獨(dú)立
    發(fā)表于 10-11 09:01

    作品分享-基于RT-Thread系統(tǒng)和N32G457開(kāi)發(fā)開(kāi)發(fā)電子圍欄設(shè)計(jì)

    基于RT-Thread系統(tǒng)和N32G457開(kāi)發(fā)開(kāi)發(fā)電子圍欄設(shè)計(jì),主要采用的是N32G457開(kāi)發(fā)板,并搭載AIR724 4G模塊作為數(shù)據(jù)傳
    發(fā)表于 03-14 14:25

    如何區(qū)別電子圍欄和電網(wǎng),科普一下電子圍欄的危害

    電子圍欄不等于傳統(tǒng)電網(wǎng),脈沖電子圍欄并不是電網(wǎng) 電子圍欄:目前最先進(jìn)的周界防盜報(bào)警系統(tǒng)就是脈沖
    發(fā)表于 07-10 11:02 ?4824次閱讀

    脈沖電子圍欄對(duì)人體有沒(méi)有傷害,如何區(qū)別電子圍欄和電網(wǎng)

    電子圍欄不等于傳統(tǒng)電網(wǎng),脈沖電子圍欄并不是電網(wǎng)。 電子圍欄:目前最先進(jìn)的周界防盜報(bào)警系統(tǒng)就是脈沖
    發(fā)表于 08-12 15:38 ?5521次閱讀

    張力式電子圍欄與脈沖式電子圍欄的功能作用及適用場(chǎng)合

    張力式電子圍欄與脈沖式電子圍欄相比,在功能上雖然沒(méi)有脈沖式完善,防盜作用也可能會(huì)略遜一籌,但是在報(bào)警的細(xì)致程度上則要比脈沖式電子
    發(fā)表于 09-29 10:46 ?3045次閱讀

    脈沖電子圍欄的工作原理及功能特點(diǎn)

    脈沖電子圍欄基本原理就是發(fā)出高壓脈沖,由脈沖發(fā)生器(主機(jī))和前端圍欄組成的智能型周界系統(tǒng)。具有防盜、報(bào)警等高安全等級(jí)的周界防范功能。現(xiàn)代公共安全用 電子
    發(fā)表于 04-01 11:10 ?8914次閱讀

    淺談脈沖電子圍欄系統(tǒng)的組成及功能

    AILIFU艾禮富脈沖電子圍欄系統(tǒng)組成主要由電子圍欄主機(jī)、前端配件(終端桿、中間承力桿、終端桿絕緣子、承力桿絕子、高壓避雷器、高壓線、合金線、圍欄
    發(fā)表于 04-01 11:41 ?1482次閱讀

    脈沖電子圍欄的設(shè)計(jì)與安裝

    脈沖電子圍欄基本原理就是發(fā)出高壓脈沖,由脈沖發(fā)生器(主機(jī))和前端圍欄組成的智能型周界系統(tǒng)。具有防盜、報(bào)警等高安全等級(jí)的周界防范功能。現(xiàn)代公共安全用 電子
    發(fā)表于 06-30 13:52 ?1037次閱讀

    智能脈沖電子圍欄的功能特點(diǎn)

    智能脈沖電子圍欄是傳統(tǒng)周界圍欄里用的最多的一種,脈沖電子圍欄系統(tǒng)可識(shí)別有意入侵和無(wú)意入侵,并能智能識(shí)別出入侵位置給予有效阻攔,不會(huì)造成人身傷
    發(fā)表于 07-01 09:42 ?1377次閱讀

    GPS模塊的電子圍欄功能有什么用

    GPS模塊其實(shí)屬于遙感、物聯(lián)網(wǎng)技術(shù)應(yīng)用的硬件設(shè)備,獲取通信衛(wèi)星的定位信息,除了定位導(dǎo)航功能,還能登錄到相應(yīng)設(shè)備的物聯(lián)網(wǎng)管理后臺(tái)上,實(shí)時(shí)查看位置信息,并開(kāi)啟電子圍欄功能,也就是防盜報(bào)警系統(tǒng)。
    的頭像 發(fā)表于 02-22 17:33 ?1320次閱讀
    <b class='flag-5'>GPS</b>模塊的<b class='flag-5'>電子</b><b class='flag-5'>圍欄</b>功能有什么用

    車(chē)輛電子圍欄系統(tǒng):守護(hù)愛(ài)車(chē)安全的智能新防線

    大家具體介紹的關(guān)于車(chē)輛電子圍欄系統(tǒng)相關(guān)內(nèi)容。 車(chē)輛電子圍欄系統(tǒng)其實(shí)就是通過(guò)GPS定位、無(wú)線通信及大數(shù)據(jù)分析等高科技技術(shù),為車(chē)輛設(shè)定一個(gè)虛擬的
    的頭像 發(fā)表于 08-20 11:06 ?484次閱讀
    車(chē)輛<b class='flag-5'>電子</b><b class='flag-5'>圍欄</b>系統(tǒng):守護(hù)愛(ài)車(chē)安全的智能新防線
    主站蜘蛛池模板: 91网站网站网站在线| 日本人69xxxxxxx69| 78摸在线| 亚洲我射| 久久久久久免费观看| 天天摸天天看| 欧美福利专区| 干成人| 在线亚洲一区二区| 久久久这里有精品999| 国产看片视频| 中文字幕xxx| 在线免费成人网| 亚洲91精品| 欧美色网络| 色网站免费在线观看| 日本三级a| 久久艹免费视频| 91在线电影| 99色在线播放| 神马午夜在线观看| 777影院| 久久99热久久精品动漫| 午夜剧场黄| 免费四影虎ww4hu10| 欧美日韩a| 国产女人伦码一区二区三区不卡| 午夜亚洲精品| 91福利国产在线观看网站| 清冷双性被cao的合不拢腿| 香蕉视频在线观看黄| 美女黄页网站免费进入| 夜间免费小视频| caopon在线| 亚洲一区二区三区麻豆| 欧美一区二区三区黄色| 欧美18性精品| 免费黄色地址| 午夜毛片福利| 黄h网站| 天天色色网|