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

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

?? gps.cpp

?? 應用程序向導已為您創建了這個 GPSDemo 應用程序。此應用程序不僅演示 Microsoft 基礎類的基本使用方法.
?? CPP
字號:
/*-----------------------------------------
* Copyright (c) 2008 Eric Wong
* 本版緊供讀者參考,不得用于任何商業行為
*
* 文件名稱: GPS.h
* 文件標識: 
* 摘要:用于封裝GPS通訊協議
*
* 當前版本: 1.0
* 作者: 汪兵 Eric Wong
* 完成日期: 2008年1月29日
*
* 取代版本:
* 原作者: 
* 完成日期: 
----------------------------------------*/
#include "StdAfx.h"
#include "GPS.h"

//構造函數
CGPS::CGPS()
{
	m_gpsDev_State = GPS_DEV_NOTOPENED; //GPS狀態
	m_hGpsThread = NULL;				//GPS檢測線程句柄
	ZeroMemory(&m_gpsCurData,sizeof(m_gpsCurData));  //GPS當前數據
 	ZeroMemory(&m_gpsLastData,sizeof(m_gpsLastData)); //GPS上一次數據
}

//析構函數
CGPS::~CGPS(void)
{
}

/*
*函數介紹:打開GPS設備
*入口參數:pWnd	:使用此GPS類的窗體句柄
		   portNo		:串口號
		   baud			:波特率
		   parity		:奇偶校驗
		   databits		:數據位
		   stopbits		:停止位
*出口參數:(無)
*返回值:TRUE:成功打開GPS設備;FALSE:打開GPS設備失敗
*/
BOOL CGPS::Open(CWnd *pWnd , /*擁有者窗口句柄*/
				UINT portNo,		/*串口號*/
				UINT baud,	/*波特率*/
				UINT parity, /*奇偶校驗*/
				UINT databits,		/*數據位*/
				UINT stopbits    /*停止位*/
				)
{
	m_pWnd = pWnd;  //儲存窗口句柄
	//創建GPS檢測線程退出事件
	m_hThreadQuitEvent = CreateEvent(NULL,false,false,L"EVENT_GPS_THREAD");
	//指定串口讀回調函數
	m_ceSeries.m_OnSeriesRead = GpsOnSeriesRead;
	//打開GPS設備串口
	BOOL bResult = m_ceSeries.OpenPort(this,portNo,baud,parity,databits,stopbits);

	if (bResult)
	{
		//設置當前GPS狀態
		m_gpsDev_State = GPS_DEV_OPENED;
		//發送GPS狀態變化消息
		::PostMessage(m_pWnd->m_hWnd,WM_GPS_STATE_CHANGE_MESSAGE,WPARAM(GPS_DEV_OPENED),1);

		//創建GPS狀態檢測線程
		m_hGpsThread = CreateThread(NULL,0,GpsCheckThreadFunc,this,0,&m_dwGpsThreadID);
	}
	else
	{
		//設置當前GPS狀態
		m_gpsDev_State = GPS_DEV_NOTOPENED;
		//發送GPS狀態變化消息
		::PostMessage(m_pWnd->m_hWnd,WM_GPS_STATE_CHANGE_MESSAGE,WPARAM(GPS_DEV_NOTOPENED),1);
	}
	return bResult;
}

/*
*函數介紹:關閉GPS設備
*入口參數:(無)
*出口參數:(無)
*返回值:TRUE:成功關閉GPS設備;FALSE:關閉GPS設備失敗
*/
void CGPS::Close()
{
	//先退出GPS檢測線程
	if (m_hGpsThread != NULL)
	{
		//發送線程退出信號
		SetEvent(m_hThreadQuitEvent);
		//等待線程退出
		if (WaitForSingleObject(m_hGpsThread,1000) == WAIT_TIMEOUT)
		{
			TerminateThread(m_hGpsThread,0);
		}
	}

	m_hGpsThread = NULL;
	CloseHandle(m_hThreadQuitEvent);
	//將接收數據回掉函數置空
	m_ceSeries.m_OnSeriesRead = NULL;
	//關閉GPS串口
	m_ceSeries.ClosePort();
	//設置GPS狀態
	m_gpsDev_State = GPS_DEV_NOTOPENED;
	//發送GPS狀態變化消息
	::PostMessage(m_pWnd->m_hWnd,WM_GPS_STATE_CHANGE_MESSAGE,WPARAM(GPS_DEV_NOTOPENED),1);
}

/*
*函數介紹:獲取GPS設備狀態
*入口參數:(無)
*出口參數:(無)
*返回值:返回GPS設備狀態
*/
GPSDEV_STATE CGPS::GetGpsState()
{
	return m_gpsDev_State;
}


/*
*函數介紹:得到當前GPS數據
*入口參數:(無)
*出口參數:(無)
*返回值:返回GPS設備當前GPS數據
*/
GPSData CGPS::GetCurGpsData()
{
	return m_gpsCurData;
}

/*--------------------------------------------------------------------
【函數介紹】: 在pArray緩沖區,查找subString字符串,如存在,返回當前位置,否則返回-1
【入口參數】: pArray:指定接收到的緩沖區隊列
【出口參數】: pArray:指定接收到的緩沖區隊列,解析后需要進行適當修改
【返回  值】: -1表示沒有找到指定的子串,>=0表示發現第1個子串的位置
---------------------------------------------------------------------*/
int CGPS::Pos(LPCSTR subString , CByteArray * pArray,int iPos)
{
	//得到子串長度
	int subLen = strlen(subString);
	//得到緩沖區的長度
	int bufLen = pArray->GetUpperBound()+1;

	bool aResult = TRUE;
	//
	for ( int i=iPos;i<bufLen-subLen+1;i++)
	{
		aResult = TRUE;
		for (int j=0;j<subLen;j++)
		{
			if (pArray->GetAt(i+j) != *(subString + j))
			{
				aResult = FALSE;
				break;
			}
			int k = 0;
		}
		if (aResult)
		{
			return i;
		}
	}
	return -1;
}


/*
*函數介紹:判斷是否存在有效GPS數據
*入口參數:aRecvStr :緩沖數據
*出口參數:aRecvStr : 緩沖數據,outStr:得到的一個完整的GPS數據
*返回值:TRUE : 成功初始化 , FALSE : 初始化失敗
*/
BOOL CGPS::HaveValidGPSData(CByteArray * pArray,CString &outStr)
{
	int tmpPos1,tmpPos2;

	tmpPos1 = Pos("$GPRMC",pArray,0);

	tmpPos2 = Pos("$GPRMC",pArray,tmpPos1+6);

	if (tmpPos2 >= 0)  //代表已包含兩個$GPRMC
	{   
		if (tmpPos1 >= 0 )
		{
			BYTE *pBuf = pArray->GetData();
			char *sBuf = new char[tmpPos2-tmpPos1+1];
			ZeroMemory(sBuf,tmpPos2-tmpPos1+1);
			CopyMemory(sBuf,pBuf+tmpPos1,tmpPos2-tmpPos1+1);
			outStr = CString(sBuf);

			//釋放內存
			delete[] sBuf;
			sBuf = NULL;
			pArray->RemoveAt(0,tmpPos2);
			return TRUE;
		}
	}
	return FALSE;
}

/*
*函數介紹:解析GPS數據
*入口參數:aRecvStr :指待解析的GPS緩沖數據
*出口參數:(無)
*返回值:指CGPSData結構體的指針,如果無效即為:NULL;
*/
PGPSData CGPS::AnalyseGpsData(CString &aRecvStr)
{
	CString tmpTime;
	CString tmpState;
	CString tmpDate;
	CString tmpLONG;
	CString tmpLONGType;
	CString tmpLAT;
	CString tmpLATType;
	CString tmpSpeed;

	LPSTR pStrDate = NULL;
	LPSTR pStrTime = NULL;
	LPSTR pStrLong = NULL;
	LPSTR pStrLongType = NULL;
	LPSTR pStrLat = NULL;
	LPSTR pStrLatType = NULL;
	LPSTR pStrSpeed = NULL;

	PGPSData pGpsData = NULL;
	int tmpPos,tmpPos1;
	int len;

	tmpPos = aRecvStr.Find(',',0); //第1個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);

	//得到時間
	tmpTime = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);
	tmpTime = tmpTime.Mid(0,2)+L":"+tmpTime.Mid(2,2)+L":"+tmpTime.Mid(4,2);

	len = tmpTime.GetLength();
	pStrTime = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpTime.GetBuffer(len),len
		,pStrTime,len ,NULL,NULL);

	//數據狀態,是否有效
	tmpPos = aRecvStr.Find(',',tmpPos+1);  //第2個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	tmpState = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);

	if (tmpState != 'A')//代表數據無效,返回
	{
		if (m_gpsDev_State != GPS_INVALID_DATA)
		{
			//設置GPS狀態
			m_gpsDev_State = GPS_INVALID_DATA;
			//發送GPS狀態變化消息
			::PostMessage(m_pWnd->m_hWnd,WM_GPS_STATE_CHANGE_MESSAGE,WPARAM(GPS_INVALID_DATA),1);
		}
		LocalFree(pStrTime);
		return NULL;
	}
	else  //代表數據有效
	{
		if (m_gpsDev_State != GPS_VALID_DATA)
		{
			//設置GPS狀態
			m_gpsDev_State = GPS_VALID_DATA;
			//發送GPS狀態變化消息
			::PostMessage(m_pWnd->m_hWnd,WM_GPS_STATE_CHANGE_MESSAGE,WPARAM(GPS_VALID_DATA),1);
		}
	}

	//得到緯度值
	tmpPos = aRecvStr.Find(',',tmpPos+1);//第3個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	tmpLAT	= aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);

	len = tmpLAT.GetLength();
	pStrLat = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpLAT.GetBuffer(len),len
		,pStrLat,len ,NULL,NULL);

	tmpPos = aRecvStr.Find(',',tmpPos+1);//第4個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	tmpLATType = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);

	len = tmpLATType.GetLength();
	pStrLatType = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpLATType.GetBuffer(len),len
		,pStrLatType,len ,NULL,NULL);

	//得到經度值
	tmpPos = aRecvStr.Find(',',tmpPos+1);//第5個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	tmpLONG = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);

	len = tmpLONG.GetLength();
	pStrLong = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpLONG.GetBuffer(len),len
		,pStrLong,len ,NULL,NULL);

	tmpPos = aRecvStr.Find(',',tmpPos+1);//第6個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	tmpLONGType = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);

	len = tmpLONGType.GetLength();
	pStrLongType = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpLONGType.GetBuffer(len),len
		,pStrLongType,len ,NULL,NULL);

	//得到車速
	tmpPos = aRecvStr.Find(',',tmpPos+1);////第7個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	tmpSpeed = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);

	len = tmpSpeed.GetLength();
	pStrSpeed = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpSpeed.GetBuffer(len),len
		,pStrSpeed,len ,NULL,NULL);

	tmpPos = aRecvStr.Find(',',tmpPos+1);////第8個值

	//得到日期
	tmpPos = aRecvStr.Find(',',tmpPos+1);////第9個值
	tmpPos1 = aRecvStr.Find(',',tmpPos+1);
	//格式化一下
	tmpDate = aRecvStr.Mid(tmpPos+1,tmpPos1-tmpPos-1);
	tmpDate = L"20"+tmpDate.Mid(4,2)+L"-"+tmpDate.Mid(2,2)+L"-"+tmpDate.Mid(0,2);

	len = tmpDate.GetLength();
	pStrDate = LPSTR(LocalAlloc(LMEM_ZEROINIT,len));
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmpDate.GetBuffer(len),len
		,pStrDate,len ,NULL,NULL); 

	pGpsData = new GPSData();
	ZeroMemory(pGpsData,sizeof(GPSData));
	//得到GPS數據指針
	CopyMemory(pGpsData->date,pStrDate,10);
	CopyMemory(pGpsData->time,pStrTime,8);
	CopyMemory(pGpsData->latitude_type,pStrLatType,1);
	CopyMemory(pGpsData->latitude,pStrLat,9);
	CopyMemory(pGpsData->longitude_type,pStrLongType,1);
	CopyMemory(pGpsData->longitude,pStrLong,10);
	//先置默認速度0
	FillMemory(pGpsData->speed,5,'0');
	CopyMemory(pGpsData->speed,pStrSpeed,5);

	//釋放內存
	LocalFree(pStrTime);
	LocalFree(pStrDate);
	LocalFree(pStrLatType);
	LocalFree(pStrLat);
	LocalFree(pStrLongType);
	LocalFree(pStrLong);
	LocalFree(pStrSpeed);

	return pGpsData;
}

//GPS接收數據事件
void CALLBACK CGPS::GpsOnSeriesRead(void * powner,BYTE* buf,DWORD  dwBufLen)
{
	CGPS * pGps = (CGPS*)powner;
	//得到本類指針
	CByteArray * pArray = &(pGps->m_aRecvBuf);

	//得到緩沖區大小
	int iMaxSize = pArray->GetSize();
	//得到緩沖區所使用的大小
	int iUpperBound = pArray->GetUpperBound();
	for (int i=0;i<dwBufLen;i++)
	{
		pArray->Add(*(buf+i));
	}

	//將收到的數據發給主程序顯示出來
	char* pRecvBuf = new char[dwBufLen+1];
	ZeroMemory(pRecvBuf,dwBufLen+1);
	CopyMemory(pRecvBuf,buf,dwBufLen);

	//發送接收串口原始數據WINDOWS消息通知
	//消息處理完畢后,應釋放內存
	::PostMessage(pGps->m_pWnd->m_hWnd,WM_GPS_RECV_BUF,WPARAM(pRecvBuf),dwBufLen+1);

	CString strGps;
	//檢查是否已經存在有效的GPS數據
	if (pGps->HaveValidGPSData(pArray,strGps))
	{
		PGPSData pGpsData = NULL;
		pGpsData = pGps->AnalyseGpsData(strGps);
		if (pGpsData != NULL) 
		{
			//將接收到的GPS數據填充到最新當前數據
			pGps->m_gpsCurData = (*pGpsData);
			//發送接收有效GPS位置信息WINDOWS消息通知
			//由消息處理函數釋放內存
			::PostMessage(pGps->m_pWnd->m_hWnd,WM_GPS_RECV_VALID_LONGLAT,WPARAM(pGpsData),0);
		}
	}
}

//檢測GPS當前數據
DWORD WINAPI CGPS::GpsCheckThreadFunc(LPVOID lparam)
{
	//得到當前GPS指針
	CGPS *pGps = (CGPS*)lparam;

	int iRecCount = 0;
	//然后開始做循環檢測,間隔為1秒
	while (TRUE)
	{
		//判斷兩次收到的時間是否相同
		if (strcmp(pGps->m_gpsCurData.time,pGps->m_gpsLastData.time) == 0)
		{
			//計數加1
			iRecCount++;
		}
		else
		{
			//將當前的GPS數據賦給歷史值
			pGps->m_gpsLastData = pGps->m_gpsCurData;
			iRecCount = 0 ;
		}

		//代表連續三次沒有收到數據
		if (iRecCount == 3)
		{
			if (pGps->m_gpsDev_State != GPS_NODATA)
			{
				//將GPS狀態置為“無數據”
				pGps->m_gpsDev_State = GPS_NODATA;
				//發送GPS狀態改變消息
				::PostMessage(pGps->m_pWnd->m_hWnd,WM_GPS_STATE_CHANGE_MESSAGE,WPARAM(GPS_NODATA),1);
			}
		}

		//延時1秒
		for (int i =0; i<10;i++)
		{
			//線程退出
			if (WaitForSingleObject(pGps->m_hThreadQuitEvent,100) == WAIT_OBJECT_0)
			{
				goto finish;
			}
		}
	}
finish:
	TRACE(L"GPS 檢測線程退出\n");
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产日韩在线一区模特| 精品国产露脸精彩对白 | 亚洲午夜免费福利视频| 夜夜亚洲天天久久| 免费成人av在线| 日韩精品每日更新| 九九九精品视频| 国产精品自拍在线| 在线精品视频一区二区| 日韩欧美专区在线| 中文字幕在线一区| 蜜桃免费网站一区二区三区| 国产**成人网毛片九色| 欧美写真视频网站| 久久久国际精品| 亚洲国产精品人人做人人爽| 国产乱人伦精品一区二区在线观看| 成人国产在线观看| 日韩视频免费直播| 亚洲色图欧洲色图| 亚洲超碰97人人做人人爱| 久久av资源网| 欧美麻豆精品久久久久久| 国产精品二区一区二区aⅴ污介绍| 亚洲精品你懂的| 成人在线综合网| 日韩亚洲电影在线| 亚洲午夜羞羞片| 欧美日韩国产小视频在线观看| 欧美一级精品大片| 中文字幕制服丝袜成人av | 欧美精品 国产精品| 国产精品成人午夜| 国产精品888| 欧美乱妇15p| 亚洲永久免费av| 成人99免费视频| 国产午夜精品在线观看| 另类小说图片综合网| 欧美日韩视频在线第一区| 中文字幕视频一区二区三区久| 激情另类小说区图片区视频区| 欧美日韩中文字幕一区| 中文字幕一区二区在线播放| 国产一区二区三区最好精华液| 在线观看91精品国产麻豆| 伊人婷婷欧美激情| 91浏览器在线视频| 自拍偷在线精品自拍偷无码专区| 高清av一区二区| 国产三级一区二区| 国产99精品国产| 久久精品人人做人人爽97| 狠狠色综合日日| 91精品免费观看| 免费成人av资源网| 日韩精品一区二区三区老鸭窝| 日韩电影免费在线观看网站| 欧美日韩精品电影| 日韩精品欧美精品| 日韩一区二区电影网| 老色鬼精品视频在线观看播放| 欧美一区二区福利视频| 久久精品国产99久久6| 亚洲精品在线免费观看视频| 国产一区二区在线免费观看| 精品久久久久久久一区二区蜜臀| 夜夜精品浪潮av一区二区三区| 97精品国产97久久久久久久久久久久| 日本一区二区三区免费乱视频| 高清不卡一二三区| 一区二区三区四区在线播放 | 国产精品亚洲成人| 久久精品视频免费| 国产91高潮流白浆在线麻豆| 日本一区二区成人| 在线中文字幕一区二区| 三级欧美韩日大片在线看| 欧美一卡2卡3卡4卡| 韩日精品视频一区| 国产精品久久久久影院老司| 色噜噜狠狠色综合中国| 日韩高清不卡一区二区三区| 精品国产乱码久久久久久久久| 精品亚洲porn| 亚洲视频网在线直播| 欧美日韩一区高清| 国产原创一区二区三区| 亚洲视频中文字幕| 日韩亚洲欧美成人一区| 成人久久18免费网站麻豆| 亚欧色一区w666天堂| 久久新电视剧免费观看| 国产麻豆视频一区| 欧美激情一区二区三区蜜桃视频| 91视频.com| 久久99国产精品久久| 亚洲视频免费在线| 日韩欧美综合在线| 91亚洲大成网污www| 免费美女久久99| 亚洲精品久久久久久国产精华液| 精品日韩欧美在线| 在线精品观看国产| 欧美日韩国产综合视频在线观看| 午夜精品在线视频一区| 亚洲国产激情av| 日韩精品影音先锋| 欧美在线综合视频| jlzzjlzz欧美大全| 精品一区二区三区免费视频| 亚洲午夜久久久久久久久电影网| 久久久久久综合| 日韩亚洲欧美成人一区| 欧美优质美女网站| 成人黄色免费短视频| 精久久久久久久久久久| 尤物在线观看一区| 亚洲国产精品传媒在线观看| 欧美电影免费观看高清完整版在线| 在线观看日产精品| 91亚洲资源网| 99视频有精品| 国产91清纯白嫩初高中在线观看| 麻豆一区二区99久久久久| 亚洲高清视频中文字幕| 亚洲精品视频在线观看免费| 国产精品视频在线看| 精品国产免费一区二区三区香蕉| 91亚洲永久精品| 99国内精品久久| 成人动漫视频在线| 成人一区二区三区视频在线观看| 国产一区二区在线观看免费| 久久福利视频一区二区| 免费看日韩a级影片| 久久精品国产77777蜜臀| 偷拍亚洲欧洲综合| 丝袜美腿一区二区三区| 日韩中文欧美在线| 玖玖九九国产精品| 久久国产乱子精品免费女| 卡一卡二国产精品| 国产精品中文字幕欧美| 国产一区二区91| 国产成人精品免费看| 国产精品一二三四五| 国产精选一区二区三区| 懂色av一区二区夜夜嗨| 成人高清视频在线| 色哟哟一区二区| 欧美综合色免费| 欧美一区三区二区| 久久亚洲精品小早川怜子| 国产欧美一区二区在线| 中文字幕av在线一区二区三区| 久久婷婷国产综合精品青草| 国产免费久久精品| 亚洲免费视频中文字幕| 亚洲一区二区三区中文字幕在线| 午夜日韩在线观看| 成人成人成人在线视频| 制服丝袜一区二区三区| 国产精品福利一区| 麻豆国产精品视频| 色爱区综合激月婷婷| 亚洲一区自拍偷拍| 国产一区二区三区不卡在线观看| 色综合天天狠狠| 久久久国产午夜精品| 亚洲成人黄色影院| 91亚洲精华国产精华精华液| 久久亚洲私人国产精品va媚药| 亚洲午夜在线电影| 99re在线精品| 中文字幕久久午夜不卡| 狠狠色狠狠色综合| 欧美二区乱c少妇| 依依成人精品视频| 不卡的av中国片| 国产午夜精品福利| 激情文学综合插| 91麻豆精品国产91久久久久| 综合分类小说区另类春色亚洲小说欧美 | 久草热8精品视频在线观看| 欧美日韩视频第一区| 一区二区在线观看免费| 国产精品一区二区你懂的| 欧美一级片在线看| 亚洲1区2区3区视频| 欧美综合一区二区三区| 椎名由奈av一区二区三区| 国产电影一区在线| 欧美xxx久久| 美国毛片一区二区| 日韩视频免费直播| 蜜臀av一级做a爰片久久| 欧美精品丝袜久久久中文字幕| 亚洲综合另类小说| 欧美日韩国产中文|