亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gps.c

?? 本人用單片機psd3300編制的c語言gps Nmea數據格式解析
?? C
字號:
/*************************************************/
//項  目:水利數碼通
//文件名:UART.C
//功  能: 串口0、1數據收發處理,軟件串口處理
//作  者:楊世峰
//日  期:2004-03-13
/*************************************************/

#include "upsd3300.h"
#include "hardware.h"
#include "gps.h"
#include "uart.h"

#include "string.h"
#include "const.h"
//////////////////////////////////
//====================變量定義=====================
extern	uchar	idata	ucGpsCommandStatus;//GPS信息處理狀態機
extern	uchar	xdata	ucGPSCommand[8];//GPS命令標識頭
extern	uchar	xdata	ucGPSDataBuff[82];//GPS數據緩存
extern	uchar	xdata	ucCheckSum[2];//GPS命令校驗字節
extern	uchar idata	ucGPSBuffCnt;
//每月最大天數表
extern	uchar xdata GPS_Date[];
extern	uint	idata	unInBufCntComm1;	//緩沖區計數
extern	union 	ByteToFloatOrLong 	xdata 	ByteChang;

///////////////////////////////////
extern	INFO_GPS			xdata InfoGPS;
extern	INFO_GPS			xdata NowInfoGPS;//實時gps 信息
extern 	INFO_STAR		xdata ucSNR[12];
////////////////////////////////////
//=================================================
//GPS數據處理主循環
//=================================================
void  GPS_ProcessNMEA(void)
{
	uchar idata uch0;

	while(unInBufCntComm1)
	{
		switch (ucGpsCommandStatus)
		{
			case 0:
         {
				ReadCharComm1(&uch0);
				if (uch0=='$')
				{
					ucGpsCommandStatus++;
				}
				break;
			}

         case 1:
			{
				ReadCharComm1(&uch0);
				if (uch0=='G')
					ucGpsCommandStatus++;
				else
					ucGpsCommandStatus=0;
				break;
			}

			case 2:
			{
				ReadCharComm1(&uch0);
				if (uch0=='P')
					ucGpsCommandStatus++;
				else
					ucGpsCommandStatus=0;
				break;
			}

			case 3:
			{
				if(unInBufCntComm1 >= 3)
				{
					ReadCharComm1(&ucGPSCommand[0]);
					ReadCharComm1(&ucGPSCommand[1]);
					ReadCharComm1(&ucGPSCommand[2]);
					ucGPSCommand[3] = '\0';
					ucGPSDataBuff[0] = 'G';
					ucGPSDataBuff[1] = 'P';
					strcpy(ucGPSDataBuff+2,ucGPSCommand);
					ucGPSBuffCnt = 5;
					ucGpsCommandStatus++;
				}
				break;
			}

       	case 4: //process command
			{
				if(unInBufCntComm1 < 2) 
					break;
				else
				{
					if(ucGPSBuffCnt>80)
					{
						ucGpsCommandStatus = 0;
						break;
					}
					ReadCharComm1(ucGPSDataBuff+ucGPSBuffCnt);
					ReadCharComm1(ucGPSDataBuff+ucGPSBuffCnt+1);
					if((ucGPSDataBuff[ucGPSBuffCnt] =='\r')\
							&&(ucGPSDataBuff[ucGPSBuffCnt+1] =='\n'))
					{
						ucCheckSum[0] =ucGPSDataBuff[ucGPSBuffCnt-2] - 0x30;
						ucCheckSum[1] =ucGPSDataBuff[ucGPSBuffCnt-1] - 0x30;;
						if(GPS_CheckCommand())
						{
							ProcessGPSCommand();
						}
						ucGpsCommandStatus=0;
						break;
					}
					else
					{
						if(ucGPSDataBuff[ucGPSBuffCnt+1] =='\r')
							ucGpsCommandStatus++;
					}
					ucGPSBuffCnt+=2;
				}
				break;
        	}//end of case 4
			case 5:
			{
				if(ucGPSBuffCnt>81)
				{
					ucGpsCommandStatus = 0;
					break;
				}
				ReadCharComm1(ucGPSDataBuff+ucGPSBuffCnt);
				if(ucGPSDataBuff[ucGPSBuffCnt] =='\n');
				{
					ucCheckSum[0] =ucGPSDataBuff[ucGPSBuffCnt-3] - 0x30;
					ucCheckSum[1] =ucGPSDataBuff[ucGPSBuffCnt-2] - 0x30;;
					if(GPS_CheckCommand())
					{
						ProcessGPSCommand();
					}
				}
				ucGpsCommandStatus=0;
				break;
			}
			default :
				ucGpsCommandStatus=0;
		}//end of switch1
	}//end of if
}
////////////////////////
void	ProcessGPSCommand(void)
{
	if(strcmp(ucGPSCommand,"GGA") == 0)	
	{
		GPS_ProcessGGA();
	}
	else if(strcmp(ucGPSCommand,"GSV") == 0)
	{
		GPS_ProcessGSV();
	}
	else if(strcmp(ucGPSCommand,"RMC") == 0)
	{
		GPS_ProcessRMC();
	}
}
//--------------------------------------------------
//GPS命令異或校驗
//--------------------------------------------------
uchar GPS_CheckCommand( void )
{
	uchar idata uci;
	uint  idata Sum = 0;

	if(ucCheckSum[0]>0x0f)	ucCheckSum[0] -=0x07;
	if(ucCheckSum[1]>0x0f)	ucCheckSum[1] -=0x07;
	Sum = ucCheckSum[0] << 4;
	Sum +=ucCheckSum[1];
	for(uci=0; (ucGPSDataBuff[uci] != '*') && (uci < 80);uci++)
    	Sum ^=  ucGPSDataBuff[uci];

   if (Sum != 0)
		return FALSE;
	else
    	return TRUE;
}

//----------------------------------------
// GPS變量清空
//----------------------------------------
void GPS_ClearData(PINFO_GPS pInfoGPS)
{
	uchar xdata i;
	uchar *pb;

	pb = pInfoGPS->Reserved;
	for(i = 0;i < sizeof(INFO_GPS) - 16;i++)
		*pb++ = 0;
	for(i=0;i<12;i++)
	{
		ucSNR[i].ucNumber = 0;
		ucSNR[i].ucElevation = 0;
		ucSNR[i].unAzimuth = 0;
		ucSNR[i].ucSNR = 0;
	}
}
//////////////////////////////////
//得到第ucSum個都號的位置
///////////////////////////////////
uchar	GetNComma(uchar ucNum)
{
	uchar idata i,j;
	
	//*,c1,c2,\r,\n
	for(i = 5,j=0;i<77;i++)
	{
		if(ucGPSDataBuff[i] == ',')
		{
			j++;
			if(j == ucNum)
				return i;
		}		
	}
	return 0;
}
//------------------------------------------------
//	處理GGA命令	
//------------------------------------------------
void GPS_ProcessGGA(void)
{
	uchar  idata i,sign;
	//latitude
	i=GetNComma(2);
	if(i>0)
		i++;
	else
		return;
	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.Info_Lat.ucDegree = (ucGPSDataBuff[i] - 0x30)*10+\
								   (ucGPSDataBuff[i+1]-0x30);
		NowInfoGPS.Info_Lat.ucMinute = (ucGPSDataBuff[i+2] -0x30)*10+\
								   (ucGPSDataBuff[i+3]-0x30);
		NowInfoGPS.Info_Lat.unSecond = (uint)((ucGPSDataBuff[i+5]-0x30)*1000+\
								   (ucGPSDataBuff[i+6]-0x30)*100+\
								   (ucGPSDataBuff[i+7]-0x30)*10+\
								   (ucGPSDataBuff[i+8]-0x30))*6;
		i += 10;
	}
	else
	{
		NowInfoGPS.Info_Lat.ucDegree = 0x00;
		NowInfoGPS.Info_Lat.ucMinute = 0x00;
		NowInfoGPS.Info_Lat.unSecond = 0x00;
		i++;
	}

	if(ucGPSDataBuff[i]!=',')
	{
		if(ucGPSDataBuff[i] == 'S')
			NowInfoGPS.Info_Lat.ucSign = 1;//s
		else
			NowInfoGPS.Info_Lat.ucSign = 0;//n
		i += 2;
	}
	else
	{
		i++;
	}
	//longitude
	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.Info_Lon.ucDegree = (ucGPSDataBuff[i]-0x30)*100+\
									(ucGPSDataBuff[i+1]-0x30)*10+\
									(ucGPSDataBuff[i+2]-0x30);
		NowInfoGPS.Info_Lon.ucMinute = (ucGPSDataBuff[i+3]-0x30)*10+\
									(ucGPSDataBuff[i+4]-0x30);
		NowInfoGPS.Info_Lon.unSecond = (uint)((ucGPSDataBuff[i+6]-0x30)*1000+\
									(ucGPSDataBuff[i+7]-0x30)*100+\
									(ucGPSDataBuff[i+8]-0x30)*10+\
									(ucGPSDataBuff[i+9]-0x30))*6;
		i+=11;
	}
	else
	{
		NowInfoGPS.Info_Lon.ucDegree = 0x00;
		NowInfoGPS.Info_Lon.ucMinute = 0x00;
		NowInfoGPS.Info_Lon.unSecond = 0x00;
		i++;
	}

	if(ucGPSDataBuff[i]!=',')
	{
		if(ucGPSDataBuff[i]=='W')
			NowInfoGPS.Info_Lon.ucSign = 1;//w
		else
			NowInfoGPS.Info_Lon.ucSign = 0;//e
		i+=2;
	}
	else
	{
		i++;
	}

	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.ucDStatue = ucGPSDataBuff[i]-0x30;
		i+=2;
	}
	else
	{
		NowInfoGPS.ucDStatue = 0x00;
		i++;
	}

	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.ucSvSum = (ucGPSDataBuff[i]-0x30)*10+\
							 (ucGPSDataBuff[i+1]-0x30);
		i+=3;
	}
	else
	{
		NowInfoGPS.ucSvSum = 0x00;
		i++;
	}

	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.unDop =(uint)((ucGPSDataBuff[i]-0x30)*10+\
					  (ucGPSDataBuff[i+2]-0x30));
		i+=4;
	}
	else
	{
		NowInfoGPS.unDop = 0x00;
		i++;
	}
	NowInfoGPS.iHigh = 0;
	if(ucGPSDataBuff[i] == '-')
	{
		sign = 1;
		i++;
	}
	for(; (ucGPSDataBuff[i]!='.') && (ucGPSDataBuff[i]!=','); i++)//舍去高度的小數
	{
		NowInfoGPS.iHigh *= 10;
		NowInfoGPS.iHigh += (ucGPSDataBuff[i]-0x30);
	}
	if(sign ==1)
		NowInfoGPS.iHigh *= -1;
	if(NowInfoGPS.iHigh > 90000)
		NowInfoGPS.iHigh = 0;
}

//-------------------------------------------------
//處理GSV命令
//-------------------------------------------------
void GPS_ProcessGSV(void)
{
	uchar idata i,frame,j,k,Statellite,cnt;

	frame = 0;
	i=GetNComma(2);
	if(i>0)
		i++;
	else
		return;
	if(ucGPSDataBuff[i]!=',')
	{
		frame = ucGPSDataBuff[i]-0x30;
		i+=2;
	}
	else
	{
		return;
	}

	Statellite = 0;
	for(;ucGPSDataBuff[i]!=',';i++)
	{
		Statellite *= 10;
		Statellite += ucGPSDataBuff[i]-0x30;
	}
	i++;
	if(ucGPSDataBuff[i]!=',')
	{
		k = (frame -1)*4;

		for(j=0;j<4;j++)
		{
			ucSNR[j+k].ucNumber = 0;
			ucSNR[j+k].unAzimuth = 0;
			ucSNR[j+k].ucElevation = 0;
			ucSNR[j+k].ucSNR = 0;
		}
		if(Statellite>=frame*4)
			cnt = 4;
		else
			cnt = Statellite - k;

		for(j=0;j<cnt;j++)
		{
			for(;ucGPSDataBuff[i]!=',';i++)
			{
				ucSNR[j+k].ucNumber *= 10;
				ucSNR[j+k].ucNumber += ucGPSDataBuff[i]-0x30;
			}
			i++;
			for(;ucGPSDataBuff[i]!=',';i++)
			{
				ucSNR[j+k].ucElevation *= 10;
				ucSNR[j+k].ucElevation += ucGPSDataBuff[i]-0x30;
			}
			i++;
			for(;ucGPSDataBuff[i]!=',';i++)
			{
				ucSNR[j+k].unAzimuth *= 10;
				ucSNR[j+k].unAzimuth += ucGPSDataBuff[i]-0x30;
			}
			i++;
			for(;(ucGPSDataBuff[i]!=',')&&(ucGPSDataBuff[i]!='*');i++)
			{
				ucSNR[j+k].ucSNR *=10;
				ucSNR[j+k].ucSNR += ucGPSDataBuff[i]-0x30;
			}
			i++;
		}
	}
}

//-------------------------------------------------
//處理RMC命令
//-------------------------------------------------
void GPS_ProcessRMC(void)
{
	uchar idata i;	
	uint	idata temp;

	i=GetNComma(1);
	if(i>0)
		i++;
	else
		return;
/////////////////hhmmss
	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.Info_DateTime.ucHour = (ucGPSDataBuff[i]-0x30)*10+(ucGPSDataBuff[i+1]-0x30);	
		//調整為北京時間
		NowInfoGPS.Info_DateTime.ucHour += 8;
		NowInfoGPS.Info_DateTime.ucHour%=24;
		NowInfoGPS.Info_DateTime.ucMinute = (ucGPSDataBuff[i+2]-0x30)*10+(ucGPSDataBuff[i+3]-0x30);
		NowInfoGPS.Info_DateTime.ucSecond = (ucGPSDataBuff[i+4]-0x30)*10+(ucGPSDataBuff[i+5]-0x30);
		i += 11;
	}
	else
	{
		NowInfoGPS.Info_DateTime.ucHour = 0x00;
		NowInfoGPS.Info_DateTime.ucMinute = 0x00;
		NowInfoGPS.Info_DateTime.ucSecond = 0x00;
		i++;
	}
//////////////
	i=GetNComma(9);
	if(i>0)
		i++;
	else
		return;
	if(ucGPSDataBuff[i]!=',')
	{
		NowInfoGPS.Info_DateTime.ucDay = (ucGPSDataBuff[i]-0x30)*10+(ucGPSDataBuff[i+1]-0x30);				
		NowInfoGPS.Info_DateTime.ucMonth = (ucGPSDataBuff[i+2]-0x30)*10+(ucGPSDataBuff[i+3]-0x30);
		NowInfoGPS.Info_DateTime.ucYear = (ucGPSDataBuff[i+4]-0x30)*10+(ucGPSDataBuff[i+5]-0x30);
		//時區調整
		//每天的凌晨0點0分0秒至早上7點59分59秒這段時間需要調整
		if(NowInfoGPS.Info_DateTime.ucHour < 8)
		{
			NowInfoGPS.Info_DateTime.ucDay ++;
			//天數如果大于本月的最大天數,月加1,天數返回1
			if(NowInfoGPS.Info_DateTime.ucDay > GPS_Date[NowInfoGPS.Info_DateTime.ucMonth])
			{
				//閏年的2月的最大天數處理
				if(NowInfoGPS.Info_DateTime.ucMonth == 2)
				{
					temp = 2000+NowInfoGPS.Info_DateTime.ucYear;
					if(((temp%4 == 0) && (temp%100 != 0)) || (temp%400 == 0))//閏年
					{
						//閏年2月29日的處理
						if(NowInfoGPS.Info_DateTime.ucDay > 29)
						{
							NowInfoGPS.Info_DateTime.ucDay = 1;
							NowInfoGPS.Info_DateTime.ucMonth ++;
						}
					}
					else//非閏年
					{
						NowInfoGPS.Info_DateTime.ucDay = 1;
						NowInfoGPS.Info_DateTime.ucMonth ++;
					}
						
				}
				//其它月份的天數處理
				else
				{
					NowInfoGPS.Info_DateTime.ucDay = 1;
					NowInfoGPS.Info_DateTime.ucMonth ++;	
					//12月最大天數,年加1
					if(NowInfoGPS.Info_DateTime.ucMonth > 12)
					{
						NowInfoGPS.Info_DateTime.ucYear ++;
						NowInfoGPS.Info_DateTime.ucMonth = 1;
					}
				}
			}
		}
	}
	else
	{
		NowInfoGPS.Info_DateTime.ucDay = 0x00;
		NowInfoGPS.Info_DateTime.ucMonth = 0x00;
		NowInfoGPS.Info_DateTime.ucYear = 0x00;
	}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久91精品久久久久久秒播| 欧美高清你懂得| 欧美亚洲国产一区二区三区| 欧美www视频| 亚洲一卡二卡三卡四卡五卡| 国产不卡视频在线播放| 欧美日韩视频在线第一区| 国产午夜三级一区二区三| 亚洲韩国一区二区三区| 成人综合在线视频| 欧美大片在线观看一区| 亚洲国产视频一区| 91在线视频网址| 国产女主播一区| 国产在线精品不卡| 4438x亚洲最大成人网| 一区二区三区视频在线看| 成人开心网精品视频| 久久久久久久久久久99999| 亚洲成人免费在线| 色综合夜色一区| 国产精品高潮呻吟| 国产一区二区精品在线观看| 91麻豆精品91久久久久久清纯| 亚洲美女淫视频| av高清不卡在线| 亚洲欧洲色图综合| 国产91对白在线观看九色| 久久久久亚洲蜜桃| 精品一区二区三区免费毛片爱 | 欧美久久久久中文字幕| 亚洲欧美日韩在线不卡| 99久久er热在这里只有精品15| 欧美高清在线视频| 国产精品资源在线看| 久久久精品日韩欧美| 国产精品自拍网站| 国产日韩影视精品| 成人黄色网址在线观看| 综合久久综合久久| 日本韩国欧美在线| 亚洲成人精品一区二区| 欧美丰满嫩嫩电影| 麻豆国产91在线播放| 久久久亚洲综合| 成人不卡免费av| 一区二区三区不卡视频| 欧美日韩一本到| 蜜桃在线一区二区三区| 久久夜色精品国产噜噜av| 国产在线一区观看| 黄网站免费久久| 久久久综合视频| 91美女在线视频| 午夜精品免费在线| www国产成人免费观看视频 深夜成人网| 狠狠色狠狠色综合日日91app| 久久久久99精品国产片| 成人激情文学综合网| 亚洲最新视频在线播放| 91精品欧美一区二区三区综合在 | 精品日韩欧美在线| 成人免费视频网站在线观看| 一区二区三区四区不卡在线| 日韩欧美国产一区在线观看| 99在线精品免费| 日韩激情一二三区| 欧美国产在线观看| 欧美日韩一区不卡| 成人午夜av电影| 日韩不卡一二三区| 国产精品盗摄一区二区三区| 91精品国产福利| 菠萝蜜视频在线观看一区| 五月天久久比比资源色| 国产精品区一区二区三区| 欧美精品视频www在线观看| 国产成人精品免费看| 亚洲午夜免费电影| 国产欧美日韩中文久久| 欧美精品乱码久久久久久按摩 | 免费看日韩a级影片| 国产精品美女久久久久久久久久久| 欧美日精品一区视频| 成人综合在线视频| 秋霞成人午夜伦在线观看| 亚洲精品一卡二卡| www日韩大片| 日韩欧美在线综合网| 色8久久精品久久久久久蜜| 国产福利一区二区三区视频 | 欧美日韩免费不卡视频一区二区三区 | 老司机免费视频一区二区三区| 日韩一区欧美一区| 久久久av毛片精品| 日韩一级二级三级| 欧美日韩亚州综合| 在线国产电影不卡| 成人一区在线观看| 国产高清在线精品| 国精产品一区一区三区mba视频| 91高清视频免费看| 99国产麻豆精品| 高清日韩电视剧大全免费| 激情都市一区二区| 老司机午夜精品99久久| 免费在线观看一区二区三区| 亚洲一区在线视频| 亚洲一区二区三区中文字幕在线| 国产精品久久久久久久久免费相片| 久久久精品国产99久久精品芒果| 91精品国产综合久久婷婷香蕉 | 亚洲综合男人的天堂| 亚洲视频一区二区免费在线观看| 中文字幕久久午夜不卡| 久久久高清一区二区三区| 国产三级欧美三级日产三级99| 精品国产区一区| 久久人人爽爽爽人久久久| 久久久一区二区三区| 久久综合色一综合色88| 国产亚洲欧洲997久久综合| 日本成人在线一区| 亚洲va国产天堂va久久en| 亚洲大片一区二区三区| 亚洲成人午夜电影| 青青草国产精品97视觉盛宴| 麻豆国产精品一区二区三区 | 亚洲最色的网站| 日韩中文字幕一区二区三区| 蜜臀av一级做a爰片久久| 麻豆精品在线播放| 国产福利一区在线| 色综合久久综合| 欧美男人的天堂一二区| 欧美成人伊人久久综合网| 国产欧美综合在线| 亚洲男人天堂av网| 日日摸夜夜添夜夜添国产精品| 老司机精品视频在线| 粉嫩一区二区三区在线看| 一本到高清视频免费精品| 9191久久久久久久久久久| 久久婷婷综合激情| 亚洲人成7777| 免费不卡在线观看| av一二三不卡影片| 91麻豆精品国产91久久久使用方法| 国产亚洲一区二区三区四区| 1区2区3区国产精品| 奇米888四色在线精品| 久久蜜桃一区二区| 亚洲女厕所小便bbb| 免费成人结看片| 99久久久无码国产精品| 5858s免费视频成人| 欧美激情艳妇裸体舞| 日韩极品在线观看| 99久久免费国产| 久久综合色播五月| 亚洲成人精品影院| av中文字幕在线不卡| 欧美一三区三区四区免费在线看| 国产精品日韩成人| 久久激情五月激情| 欧洲一区在线电影| 国产精品免费av| 久热成人在线视频| 欧美亚洲自拍偷拍| 国产精品国产三级国产专播品爱网| 青青青爽久久午夜综合久久午夜| 94色蜜桃网一区二区三区| 精品国产sm最大网站免费看| 亚洲bt欧美bt精品777| 99久久精品国产毛片| 久久久久九九视频| 九九在线精品视频| 欧美剧情电影在线观看完整版免费励志电影 | 一本色道综合亚洲| 国产农村妇女精品| 国产精品一区一区三区| 91精品国产综合久久久久久久久久| 亚洲欧美一区二区久久| 精东粉嫩av免费一区二区三区| 在线亚洲欧美专区二区| 一区免费观看视频| 成人精品鲁一区一区二区| 久久久久久久av麻豆果冻| 黄色日韩网站视频| 精品欧美久久久| 美女性感视频久久| 欧美一区二区视频在线观看2022| 亚洲国产精品一区二区久久| 91福利区一区二区三区| 亚洲四区在线观看| 一本色道亚洲精品aⅴ| 亚洲精品福利视频网站| 色欧美日韩亚洲| 亚洲一卡二卡三卡四卡五卡| 欧美图片一区二区三区|