⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.cpp

📁 GPS导航的源代码
💻 CPP
字号:
#include "stdafx.h"

#include <stdio.h>
#include "GPS.h"

DWORD WINAPI GPS::WorkProc(LPVOID lpParam)
{
	GPS *pThis=(GPS *)lpParam;

	memset(pThis->buf,0,256);
	if(pThis->pSerial != NULL)
	{
		MSG msg;

		pThis->pSerial->ClearBuffers();
		while(1)
		{
			if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
			{
				if(msg.message == WM_QUIT)
					break;
			}

			pThis->pSerial->ReadLine(pThis->buf,256);
#ifdef _DEBUG
			printf("%s\n",pThis->buf);
#endif
			if(pThis->parse())
			{
			}
		}
	}

	return 0L;
}

char *GPS::match(char *str,char *patten)
{
	while(*str != 0 && *patten != 0 && *str == *patten)
	{
		str++;
		patten++;
	}

	if(*patten == 0)
		return str+1;
	else
		return NULL;
}

char *GPS::next_fld(char *str)
{
	char *ts=str;

	while(*ts != ',' && *ts != 0)
		ts++;
	*ts='\0';

	return str;
}

BOOL GPS::parse()	//GPRMC电文
{
	char *fld;

	fld=match(buf,"$GPRMC");
	if(fld != NULL)
	{
		//GPS电文
		//printf("%s\n",buf);
		
		//时间戳
		fld=next_fld(fld);
		if(*fld != 0)
		{
			sscanf(fld,"%2d%2d%2d.%4d",&hh,&mm,&ss,&ms);
		}
		fld+=(strlen(fld)+1);
		
		//定位状态
		fld=next_fld(fld);
		if(*fld == 'A')
			code=1;
		else
			code=0;
		fld+=(strlen(fld)+1);

		//纬度
		fld=next_fld(fld);
		if(*fld != 0)
		{
			int d,m,mm;
			sscanf(fld,"%2d%2d.%4d",&d,&m,&mm);
			latitude=(float)d+(float)m/60.0+(float)mm/600000.0;
		}
		fld+=(strlen(fld)+1);
		
		//南北半球标志
		fld=next_fld(fld);
		if(*fld == 'S')
			latitude=-latitude;
		fld+=(strlen(fld)+1);
		
		//经度
		fld=next_fld(fld);
		if(*fld != 0)
		{
			int d,m,mm;
			sscanf(fld,"%3d%2d.%4d",&d,&m,&mm);
			longitude=(float)d+(float)m/60.0+(float)mm/600000.0;
		}
		fld+=(strlen(fld)+1);
		
		//东西半球标志
		fld=next_fld(fld);
		if(*fld == 'W')
			longitude=-longitude;
		fld+=(strlen(fld)+1);
		
		//对地运动速度
		fld=next_fld(fld);
		if(*fld != 0)
			velocity=atof(fld);
		else
			velocity=0.0;
		fld+=(strlen(fld)+1);
		
		//对地运动方向
		fld=next_fld(fld);
		if(*fld != 0)
			direction=atof(fld);
		else
			direction=0.0;
		fld+=(strlen(fld)+1);

		//GPRMC不能给出高度信息
		height=0.0;

		if(pEventProc != NULL)
			pEventProc(code,hh,mm,ss,ms,longitude,latitude,height,velocity,direction,lpUserPtr);

		return TRUE;
	}

	return FALSE;
}

/*
BOOL GPS::parse()		//GPGGA电文
{
	char *fld;

	fld=match(buf,"$GPGGA");
	if(fld != NULL)
	{
		//时间戳
		fld=next_fld(fld);
		if(*fld != 0)
		{
			sscanf(fld,"%2d%2d%2d.%4d",&hh,&mm,&ss,&ms);
		}
		fld+=(strlen(fld)+1);
		
		//纬度
		fld=next_fld(fld);
		if(*fld != 0)
		{
			int d,m,mm;
			sscanf(fld,"%2d%2d.%4d",&d,&m,&mm);
			latitude=(float)d+(float)m/60.0+(float)mm/600000.0;
		}
		fld+=(strlen(fld)+1);
		
		//南北半球标志
		fld=next_fld(fld);
		if(*fld == 'S')
			latitude=-latitude;
		fld+=(strlen(fld)+1);
		
		//经度
		fld=next_fld(fld);
		if(*fld != 0)
		{
			int d,m,mm;
			sscanf(fld,"%3d%2d.%4d",&d,&m,&mm);
			longitude=(float)d+(float)m/60.0+(float)mm/600000.0;
		}
		fld+=(strlen(fld)+1);
		
		//东西半球标志
		fld=next_fld(fld);
		if(*fld == 'W')
			longitude=-longitude;
		fld+=(strlen(fld)+1);
		
		//定位有效性及格式
		fld=next_fld(fld);
		if(*fld != 0)
			code=atoi(fld);
		fld+=(strlen(fld)+1);
		
		//捕捉卫星数量
		fld=next_fld(fld);
		if(*fld != 0)
			satnum=atoi(fld);
		fld+=(strlen(fld)+1);
		
		//估计误差
		fld=next_fld(fld);
		if(*fld != 0)
			dis=atof(fld);
		fld+=(strlen(fld)+1);
		
		//海拔高度
		fld=next_fld(fld);
		if(*fld != 0)
			height=atof(fld);
		fld+=(strlen(fld)+1);
		
		//高度单位
		fld=next_fld(fld);
		fld+=(strlen(fld)+1);
		
		//GPGGA电文不能给出速度信息
		velocity=0.0;
		direction=0.0;

		if(pEventProc != NULL)
			pEventProc(code,hh,mm,ss,ms,longitude,latitude,height,velocity,direction,lpUserPtr);

		return TRUE;
	}

	return FALSE;
}
*/

GPS::GPS()
{
	pSerial=NULL;
	code=0;
	hWorkthread=NULL;
	pEventProc=NULL;
}

GPS::~GPS()
{
	if(pSerial != NULL)
		delete pSerial;
}

BOOL GPS::OpenDevice(TCHAR *strPort,int nBaudRate)
{
	pSerial=Serial::OpenSerial(strPort,nBaudRate);

	char ch;
	int retry=100;
	BOOL found=FALSE;
	if(pSerial != NULL)
	{
		while(!found && retry)
		{
			if(!pSerial->ReadByte(&ch))
				break;
			else if(ch == '$')
				found=TRUE;

			retry--;
		}

		if(!found)
		{
			delete pSerial;
			pSerial=NULL;
		}
	}

	return (pSerial != NULL);
}

void GPS::CloseDevice()
{
	if(pSerial != NULL)
	{
		Stop();
		delete pSerial;
		pSerial=NULL;
	}
}

BOOL GPS::Run()
{
	if(pSerial == NULL)
		return FALSE;

	hWorkthread=CreateThread(NULL,0,WorkProc,this,0,&dwWorkthread);

	return (hWorkthread != NULL);
}

void GPS::Stop()
{
	if(hWorkthread != NULL)
	{
		PostThreadMessage(dwWorkthread,WM_QUIT,0,0);
		WaitForSingleObject(hWorkthread,5000);
		hWorkthread=NULL;
	}
}

BOOL GPS::IsLocationValid()
{
	return (code != 0);
}

double GPS::GetTimestamp()
{
	return 0;
}

double GPS::GetLongitude()
{
	return longitude;
}

double GPS::GetLatitude()
{
	return latitude;
}

double GPS::GetHeight()
{
	return height;
}

void GPS::set_EventProc(LPGpsEventProc proc,LPVOID userptr)
{
	lpUserPtr=userptr;
	pEventProc=proc;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -