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

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

?? gpscomm.cpp

?? 非常好用的GPS串口通信
?? CPP
字號:
///////////////////////////////////////////////////////////////////////////////
// GpsComm.cpp : implementation of the CGpsComm class
//
// Copyright (c) 2004,上海合眾思壯科技有限責任公司GIS部
//
// All rights reserved
//
// 文件名稱:GpsComm.cpp
//
// 摘要    :通訊基類
//
// 作者    :Hansom
//
// 當前版本:1.1
//
// 完成日期:2004年04月12日
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GpsComm.h"
#include "Nmea0183.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

const long MSG_SIZE		= 256;							// 定義消息數常量
const long MSG_NUMBER	= 8;							// 定義消息的記錄數目


///////////////////////////////////////////////////////////////////////////////
// 初始化靜態成員
CGpsComm *CGpsComm::c_GpsCommObj = NULL;

///////////////////////////////////////////////////////////////////////////////
// 返回當前使用的通訊對象指針 
IGpsComm *GetCurrentGpsComm()
{
	return CGpsComm::GetGpsCommObjPtr();
}

///////////////////////////////////////////////////////////////////////////////
// 創建接口指針,并返回需要的指針類型
IGpsComm *CreateGpsComm(GPS_SERIAL_TYPE type)
{
	IGpsComm *pGpsCommPtr = CGpsComm::GetGpsCommObjPtr();

	switch (type)
	{
	case Gps_Type_Nmea0183:
		pGpsCommPtr = new CNmea0183;	// 創建0183類指針
		break;
	case Gps_Type_GarMin:
		//pGpsCommPtr = new CGarMin;	// 創建指向GarMin類的指針
		break;
	default:
		pGpsCommPtr = NULL;				// 創建失敗,沒有指向任何類的對象
		break;
	}

	return pGpsCommPtr;
}

///////////////////////////////////////////////////////////////////////////////
// 關閉并刪除GPSCOMM對象
BOOL CloseGpsComm()
{
	CGpsComm *pGpsCommPtr = CGpsComm::GetGpsCommObjPtr();
	if(pGpsCommPtr != NULL)
	{
		delete pGpsCommPtr;
		pGpsCommPtr = NULL;
	}
	
	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// 通訊基類構造函數
CGpsComm::CGpsComm()
{
	m_hComm				= NULL;
	m_Thread			= NULL;
	m_bThreadAlive		= FALSE;
	memset(&m_SerialPara, 0, sizeof(ST_COMM_PARA));
	
	m_pchRevBuffer		= NULL;
	m_nRevRPtr			= 0;
	m_nRevWPtr			= 0;
	m_nMsgCur			= 0;

	// 初始化讀寫緩沖區和消息隊列
	m_pchRevBuffer		= new char[BUFFER_SIZE];

	m_struMsg			= new ST_MSG[MSG_NUMBER];
	for(int i = 0; i < MSG_NUMBER; i++)
	{
		m_struMsg[i].pMsg = new char[MSG_SIZE];
	}

	c_GpsCommObj = this;

	InitializeCriticalSection(&m_csCommunicationSync);
}

///////////////////////////////////////////////////////////////////////////////
// 通訊基類析構函數
CGpsComm::~CGpsComm()
{
	if(m_hComm != NULL)		//關閉端口句柄
	{
		EnterCriticalSection(&m_csCommunicationSync);
		CloseHandle(m_hComm);
		LPDWORD lpExitCode = 0;   
		GetExitCodeThread(m_hComm, lpExitCode);
		TerminateThread(m_hComm, DWORD(lpExitCode));
		m_hComm = NULL;
		LeaveCriticalSection(&m_csCommunicationSync);
	}

	if(m_Thread != NULL)	//關閉讀線程句柄
	{
		LPDWORD lpExitCode = 0;   
		GetExitCodeThread(m_Thread, lpExitCode);
		TerminateThread(m_Thread, DWORD(lpExitCode));
		m_Thread = NULL;
	}

	if(m_pchRevBuffer != NULL)
	{
		delete [] m_pchRevBuffer;
		m_pchRevBuffer = NULL;
	}

	for(int i = 0; i < MSG_NUMBER; i++)
	{
		if(m_struMsg[i].pMsg != NULL)
		{
			delete [] m_struMsg[i].pMsg;
			m_struMsg[i].pMsg = NULL;
		}
	}

	if(m_struMsg != NULL)
	{
		delete [] m_struMsg;
		m_struMsg = NULL;
	}

	m_listWnd.RemoveAll();
}

///////////////////////////////////////////////////////////////////////////////
// 啟動端口任務
BOOL CGpsComm::OpenComm(CWnd *pwnd, GPS_DATA_TYPE dwMsgType)
{
	if(pwnd == NULL)
	{
		return FALSE;
	}

	ST_LOG_WND LogWnd;
	LogWnd.pWnd = pwnd;
	LogWnd.dwMsgType = dwMsgType;

	// 將窗口句柄加入活動列表
	m_listWnd.AddHead(LogWnd);

	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// 開始端口任務
BOOL CGpsComm::Start()
{
	//如果線程處于激活狀態,那么先要關閉該線程
	if(m_bThreadAlive)
	{
		do
		{
			LPDWORD lpExitCode = 0;   
			GetExitCodeThread(m_Thread, lpExitCode);
			m_bThreadAlive = FALSE;
			TerminateThread(m_Thread, DWORD(lpExitCode));
		}
		while (m_bThreadAlive);
	}

	// 如果串口已經打開,需要關閉串口
	if(m_hComm != NULL)
	{
		EnterCriticalSection(&m_csCommunicationSync);
		CloseHandle(m_hComm);
		m_hComm = NULL;
		LeaveCriticalSection(&m_csCommunicationSync);
	}

	CString strPort;
	strPort.Format(L"COM%d:", m_SerialPara.cPort);

	// 創建串口HANDLE
	m_hComm = CreateFile(strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 0, NULL);
	if (m_hComm == INVALID_HANDLE_VALUE)
	{
		TCHAR	msgstr[MSG_NUMBER];		//發送錯誤信息
		m_hComm = NULL;
		wsprintf(msgstr, L"無法打開端口 %d. 錯誤號:%d", m_SerialPara.cPort, GetLastError());
		AfxMessageBox(msgstr, MB_ICONERROR, MB_OK);
		return FALSE;
	}

	// 設置串口參數
	DCB dcb;
	GetCommState(m_hComm, &dcb);
	dcb.BaudRate		=	DWORD(m_SerialPara.lBaud);
	dcb.fParity			=	BYTE(m_SerialPara.cParity);
	dcb.StopBits		=	BYTE(m_SerialPara.cStopBits);
	dcb.Parity			=	BYTE(m_SerialPara.cParity);
	dcb.ByteSize		=	BYTE(m_SerialPara.cDataBits);
	dcb.fNull			=	FALSE;
	dcb.fAbortOnError	=	FALSE;
	if(!SetCommState(m_hComm, &dcb))
	{
		CloseHandle(m_hComm);
		m_hComm = NULL;
		return FALSE;
	}

	// 設置超時時間
	COMMTIMEOUTS CommTimeouts;
	CommTimeouts.ReadIntervalTimeout			= MAXDWORD;
	CommTimeouts.ReadTotalTimeoutMultiplier		= MAXDWORD;
	CommTimeouts.ReadTotalTimeoutConstant		= 50;
	CommTimeouts.WriteTotalTimeoutMultiplier	= MAXDWORD;
	CommTimeouts.WriteTotalTimeoutConstant		= 0;
	if(!SetCommTimeouts(m_hComm, &CommTimeouts) || !SetCommMask(m_hComm, EV_BREAK | EV_ERR | EV_RXCHAR))
	{
		CloseHandle(m_hComm);
		m_hComm = NULL;
		return FALSE;
	}

	// 清除串口數據
	PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

	if(IsPortOpen())
	{
		// 創建線程,如果失敗則返回
		if (!(m_Thread = AfxBeginThread((AFX_THREADPROC)CommThread, this)))
		{
			return FALSE;
		}

		m_bThreadAlive	= TRUE;
		m_nRevRPtr		= 0;
		m_nRevWPtr		= 0;
		m_nMsgCur		= 0;
	}
	else
	{
		return FALSE;
	}

	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// 暫停端口任務
BOOL CGpsComm::Stop()
{
	if(m_hComm != NULL)		//關閉端口句柄
	{
		EnterCriticalSection(&m_csCommunicationSync);
		CloseHandle(m_hComm);
		LPDWORD lpExitCode = 0;   
		GetExitCodeThread(m_hComm, lpExitCode);
		TerminateThread(m_hComm, DWORD(lpExitCode));
		m_hComm = NULL;
		LeaveCriticalSection(&m_csCommunicationSync);
	}

	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// 暫停端口任務
BOOL CGpsComm::CloseComm(CWnd * pwnd)
{
	if(pwnd == NULL)
	{
		return TRUE;
	}

	ST_LOG_WND LogWnd;
	POSITION oldPos = NULL;

	// This method retrieves the position of the head element of this list
	POSITION pos = m_listWnd.GetHeadPosition();
	while(pos != NULL)
	{
		oldPos = pos;
		LogWnd = (ST_LOG_WND)m_listWnd.GetNext(pos);
		
		// 找到需要注銷的窗口句柄將其移出活動列表
		if(LogWnd.pWnd == pwnd)
		{
			m_listWnd.RemoveAt(oldPos);
			break;
		}
	}

	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// 得到需要的消息
BOOL CGpsComm::GetNeedMsg(DWORD dwMsgType, GPS_DATA_TYPE emMsg)
{
	return (((dwMsgType & ENUM_All_GPS) && (emMsg < ENUM_ALL_NAVI)) ||
			((dwMsgType & ENUM_ALL_NAVI)) && (emMsg > ENUM_ALL_NAVI));
};

///////////////////////////////////////////////////////////////////////////////
// 設置當前串口參數
BOOL CGpsComm::SetCommPara(const ST_COMM_PARA &pSerialPara)
{
	// 串口參數設置
	memcpy(&m_SerialPara, &pSerialPara, sizeof(ST_COMM_PARA));

	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// 得到端口參數
ST_COMM_PARA CGpsComm::GetCommPara() const
{
	return m_SerialPara;
}

///////////////////////////////////////////////////////////////////////////////
// 函數名:ReceiveData
// 功能  :讀取串口接收緩沖區的所有數據,寫到接收緩沖區中。
//		   并調用協議的成員函數將數據轉換為對應的消息結構
//		   發送消息到當前注冊的需要數據的窗口。
// 返回值:無
///////////////////////////////////////////////////////////////////////////////
void CGpsComm::ReceiveData()
{
	DWORD	dwError		= 0;
	DWORD	BytesRead	= 0;
	DWORD	dwReadNum	= 0;
	DWORD	dwNum		= 0;
 	BOOL	bResult;
	char	RXBuff;
	COMSTAT comstat;

	if(m_hComm == NULL)
	{
		return;
	}
	
	bResult	= ClearCommError(m_hComm, &dwError, &comstat);
	dwNum	= comstat.cbInQue;

	while(dwNum > 0)
	{
		// 從串口讀出一個字符
		bResult = ReadFile(m_hComm, &RXBuff, 1, &BytesRead, NULL);
		// 發生讀錯誤
		if(!bResult)
		{
			DWORD dwRead = ::GetLastError();
				
			if(dwRead == ERROR_OPERATION_ABORTED)
			{
				::ClearCommError(m_hComm, &dwError, &comstat);
			}
			break;
		}

		if (1 != BytesRead) 
		{
			break;
		}

		// 將字符寫入接收緩沖區
		WriteData(RXBuff);
		dwReadNum++;
		dwNum--;
	}

	if(dwReadNum > 0)
	{
		// 有新數據讀出
		int nRtn;
		do
		{
			nRtn = this->SearchOneFrame(m_pchRevBuffer, BUFFER_SIZE, m_nRevRPtr, 
											   m_nRevWPtr, m_struMsg + m_nMsgCur);
			if(nRtn == 0)
			{
				break;	// 結束
			}

			// 幀正確
			if(nRtn > 0)
			{
				// 可以在此處輸出幀數據

				POSITION pos = m_listWnd.GetHeadPosition();
				ST_LOG_WND LogWnd;
				for(int i = 0; i < m_listWnd.GetCount(); i++)
				{
					LogWnd = (ST_LOG_WND)m_listWnd.GetNext(pos);
					if((LogWnd.pWnd != NULL) && 
					   (GetNeedMsg(LogWnd.dwMsgType, (m_struMsg+m_nMsgCur)->MsgHead.enumMsgType)))
					{
						::PostMessage(LogWnd.pWnd->m_hWnd, 
							          WM_COMM_RXCHAR, (WPARAM)(m_struMsg + m_nMsgCur), 0);
					}
				}
				
				m_nMsgCur++;
				if(m_nMsgCur >= MSG_NUMBER)
				{
					m_nMsgCur = 0;
				}
			}
		}while(nRtn != 0);
	}
}
/*
BOOL	CGpsComm::SendData(strucMsg* pMsg)
{
	DWORD BytesSent = 0;
	BOOL bResult;

	//串口未打開
	if(m_hComm == NULL)
		return FALSE;

	//將數據結果轉換為協議幀格式
	int nFrmLen;
	int nFrmNo = 0;
	do
	{//nFrmNo代表幀序號,為零代表無后續幀,該幀為結束幀
		nFrmLen = m_pProtocol->TranslateData(pMsg,m_pchSendBuffer,nFrmNo);
		if(nFrmLen == 0)
			return FALSE;

		EnterCriticalSection(&m_csCommunicationSync);
		bResult = WriteFile(m_hComm,m_pchSendBuffer,nFrmLen,&BytesSent,NULL);
		LeaveCriticalSection(&m_csCommunicationSync);

		if((!bResult) || ((int)BytesSent != nFrmLen))
		//寫錯誤
			return FALSE;
		//連續發多幀,間隔100ms
		if(nFrmNo != 0)
			Sleep(100);
	}while(nFrmNo != 0);

	return TRUE;
}
*/
///////////////////////////////////////////////////////////////////////////////
// 串口監聽線程
UINT CGpsComm::CommThread(LPVOID pParam)
{
	CGpsComm *port = (CGpsComm*)pParam;
	if(port == NULL)
	{
		return 0;
	}

	DWORD	CommEvent	=	0;
	DWORD	dwError		=	0;
	DWORD	dwBytesRead	=	0;
	char	RxBuff		=	0;
	BOOL	bResult		=	TRUE;
	COMSTAT comstat;
	
	// 用ReadFile()監聽串口
	while(port->IsPortOpen())
	{
		if(NULL == port->m_hComm)
		{
			break;
		}

		EnterCriticalSection(&port->m_csCommunicationSync);
		bResult = ReadFile(port->m_hComm, &RxBuff, 1, &dwBytesRead, NULL);
		LeaveCriticalSection(&port->m_csCommunicationSync);

		if(NULL == port->m_hComm)
		{
			break;
		}
		
		if(!bResult)
		{
			// 讀出錯
			DWORD dwRead = ::GetLastError();
				
			if(dwRead == ERROR_OPERATION_ABORTED)
			{
				::ClearCommError(port->m_hComm, &dwError, &comstat);
			}
			continue;
		}

		if(1 != dwBytesRead) 
		{
			continue;
		}

		// 將字符寫入接收緩沖區
		port->WriteData(RxBuff);
		// 接收剩余其他字符
		EnterCriticalSection(&port->m_csCommunicationSync);
		port->ReceiveData();
		LeaveCriticalSection(&port->m_csCommunicationSync);
	}

	return 0;
}

///////////////////////////////////////////////////////////////////////////////
// 函數名:	WriteData
// 功能  :	將一個字符寫入接收緩沖區
// 參數  :	chData:	被寫入的字符
// 返回值:	無
///////////////////////////////////////////////////////////////////////////////
void CGpsComm::WriteData(char chData)
{
	// 將字符寫入接收緩沖區	
	m_pchRevBuffer[m_nRevWPtr] = chData;
	m_nRevWPtr++;

	if(m_nRevWPtr >= BUFFER_SIZE)
	{
		m_nRevWPtr = 0;		// 收滿緩沖區
	}

	if(m_nRevWPtr == m_nRevRPtr)
	{
		m_nRevRPtr++;
		if(m_nRevRPtr >= BUFFER_SIZE)
		{
			m_nRevRPtr = 0;
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人资源网| 欧美v亚洲v综合ⅴ国产v| 亚洲视频一二三区| av日韩在线网站| 日韩美女久久久| 91精品1区2区| 日本网站在线观看一区二区三区| 久久久国产综合精品女国产盗摄| 欧美激情在线一区二区| 成人不卡免费av| 一个色综合av| 欧美变态tickle挠乳网站| 奇米色777欧美一区二区| 久久综合网色—综合色88| 成人精品免费网站| 亚洲高清视频中文字幕| 欧美成人性战久久| 99久久久精品| 肉色丝袜一区二区| 久久精品一区蜜桃臀影院| 91一区一区三区| 爽爽淫人综合网网站| 久久尤物电影视频在线观看| 91浏览器在线视频| 免费成人在线视频观看| 国产精品夫妻自拍| 91.com在线观看| 成人精品鲁一区一区二区| 亚洲综合偷拍欧美一区色| 2023国产精品| 欧美男男青年gay1069videost| 国产精品乱码一区二三区小蝌蚪| 亚洲国产综合91精品麻豆| 欧美成人a在线| 在线观看日韩精品| 国产夫妻精品视频| 亚洲曰韩产成在线| 日本一区二区三区在线观看| 欧美日韩国产一区二区三区地区| 亚洲一线二线三线视频| 国产人成亚洲第一网站在线播放| 国内精品视频一区二区三区八戒| 日韩欧美国产麻豆| 色八戒一区二区三区| 精品一区二区国语对白| 亚洲成人在线免费| 中文字幕第一页久久| 欧美一区二区美女| 在线视频观看一区| 97国产精品videossex| 韩国欧美一区二区| 天堂一区二区在线| 亚洲影视资源网| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产suv精品一区二区883| 日韩高清不卡一区| 亚洲图片欧美色图| 中文字幕一区二区三区在线观看| 色妞www精品视频| 成人黄色在线看| 国产成人精品免费看| 麻豆精品国产传媒mv男同| 天天免费综合色| 一区二区三区四区不卡视频| 国产精品国产三级国产专播品爱网| av电影在线观看不卡| 国产精品一区在线观看乱码 | 国产精品 日产精品 欧美精品| 精品国产一区二区亚洲人成毛片| 国内精品伊人久久久久av一坑| 久久九九国产精品| 2024国产精品视频| 久久―日本道色综合久久| 精品国产一区二区三区av性色 | 精品sm在线观看| 日韩西西人体444www| 538在线一区二区精品国产| 欧美日韩在线不卡| 欧美另类videos死尸| 91精品国产综合久久蜜臀| 91精品在线观看入口| 日韩欧美自拍偷拍| www国产精品av| 国产女同性恋一区二区| 久久久综合视频| 国产欧美一区二区精品性| 国产日韩欧美高清| 中文字幕中文字幕在线一区| 1000精品久久久久久久久| 亚洲激情校园春色| 日韩电影免费一区| 久久国产婷婷国产香蕉| 国产一区二区影院| av一本久道久久综合久久鬼色| 免费在线观看不卡| 韩国一区二区视频| 国产大陆精品国产| 色综合久久99| 欧美男生操女生| 精品处破学生在线二十三| 国产女人aaa级久久久级| 亚洲免费伊人电影| 日韩精品视频网站| 国产精品一二三四| 色婷婷久久99综合精品jk白丝| 国产麻豆视频一区二区| 北条麻妃一区二区三区| 99国产精品99久久久久久| 欧美伊人久久大香线蕉综合69 | 性做久久久久久免费观看 | 日韩欧美一级片| 久久综合久久99| 亚洲免费在线电影| 另类人妖一区二区av| av在线播放不卡| 日韩午夜精品电影| 国产精品国模大尺度视频| 日日夜夜精品视频免费| 成人午夜av电影| 欧美日韩精品专区| 中文字幕第一区| 日本中文在线一区| 91影院在线免费观看| 精品欧美一区二区在线观看 | 久久av资源网| 99久精品国产| 日韩精品一区国产麻豆| 亚洲色图在线播放| 国内欧美视频一区二区| 欧美在线观看视频一区二区三区| 91性感美女视频| 精品乱人伦小说| 亚洲三级电影网站| 国产精品白丝jk白祙喷水网站| 激情都市一区二区| 欧美日韩国产天堂| 1024精品合集| 国产成人av影院| 日韩欧美电影在线| 天天综合网 天天综合色| 成人激情午夜影院| 久久久久国产精品麻豆ai换脸| 国产亚洲精品福利| 日韩一区精品视频| 色www精品视频在线观看| 欧美激情一区三区| 国产综合色视频| 8v天堂国产在线一区二区| 亚洲最大成人网4388xx| av电影在线观看一区| 国产欧美日本一区视频| 精品亚洲欧美一区| 69堂精品视频| 午夜国产不卡在线观看视频| 色婷婷久久综合| 亚洲女同一区二区| hitomi一区二区三区精品| 久久久国产综合精品女国产盗摄| 国产精品乱人伦中文| 国产ts人妖一区二区| 久久亚洲一区二区三区四区| 美女性感视频久久| 日韩一级黄色大片| 老司机午夜精品| 日韩欧美国产电影| 久草中文综合在线| 精品国产91乱码一区二区三区| 国产日韩欧美综合在线| 国产制服丝袜一区| 精品久久久久久久久久久久包黑料 | 综合久久久久久| 成人动漫在线一区| 国产精品成人一区二区艾草| 成人一区在线观看| 中文字幕电影一区| 91麻豆精品秘密| 亚洲一区二区在线观看视频| 欧美亚洲国产一卡| 日韩av电影天堂| 精品免费99久久| 国产99久久久国产精品潘金网站| 欧美日韩中文精品| 日韩vs国产vs欧美| 91精品啪在线观看国产60岁| 久久电影国产免费久久电影| wwww国产精品欧美| av在线播放成人| 亚洲网友自拍偷拍| 欧美电影免费观看高清完整版| 一区二区在线观看视频| 欧美性欧美巨大黑白大战| 日本中文在线一区| 久久久91精品国产一区二区精品| 午夜精品福利在线| 欧美一区二区三区精品| 国产一区二区三区免费在线观看| 欧美三级中文字幕| 九九**精品视频免费播放| 国产精品久久99| 欧美精品tushy高清|