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

📄 readgpsdlg.cpp

📁 一套GPS系统源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ReadGPSDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ReadGPS.h"
#include "ReadGPSDlg.h"

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

#include "math.h"

#define		TIMER_GPS		112
#define		MAX_LIVETIME	1000
#define		COM_PORT_NAME	"COM5"
#define		TIME_ADJ		(28*3600)

#define		BMP_SATELLITE_W		145
#define		BMP_SATELLITE_H		145
#define		BMP_SATELLITE_R		64
#define		PI					3.1415926

//	地球子午线(南极到北极的连线)长度39940.67公里,纬度一度合110.94公里,一分合1.849公里,一秒合30.8米,不同纬度的间距是一样的。 
//	地球赤道圈长度40075.36公里,北京和乌鲁木齐地区在北纬40度左右,纬度圈长为40075*sin(90-40),因此这里的经度一度合85.276公里,一分合1.42公里,一秒合23.69米。 

#define		RADIUS_EARTH		6370000				//	6.37*1000,000
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CReadGPSDlg dialog

CReadGPSDlg::CReadGPSDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CReadGPSDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CReadGPSDlg)
	m_CurLatitude = 0.0;
	m_CurLongitude = 0.0;
	m_CurDate = _T("");
	m_CurTime = _T("");
	m_Date2 = _T("");
	m_Date1 = _T("");
	m_Distant1 = 0.0;
	m_Distant2 = 0.0;
	m_Latitude2 = 0.0;
	m_Latitude1 = 0.0;
	m_Longitude1 = 0.0;
	m_Longitude2 = 0.0;
	m_Time1 = _T("");
	m_Time2 = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_BufPos=0;
	m_DCnt=0;
#ifdef	M_DEBUG
	m_TestCnt=0;
#endif
	for(int i=0;i<MAX_SATELLITE;i++)
	{
		m_Satellite[i].m_LiveTime=0;
		m_Satellite[i].xpos=0;
		m_Satellite[i].ypos=0;
	}
#ifdef	M_DEBUG
	m_Satellite[1].m_LiveTime=20;
	m_Satellite[4].m_LiveTime=20;
	m_Satellite[7].m_LiveTime=20;
	m_Satellite[12].m_LiveTime=20;
	int nAngle1,nAngle2;
	
	nAngle1=45;
	nAngle2=0;
	if(nAngle1<=90&&nAngle2<360)
	{
		m_Satellite[1].m_LiveTime=MAX_LIVETIME;
		m_Satellite[1].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360)+0.5);
		m_Satellite[1].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360)+0.5);
	}
	nAngle1=45;
	nAngle2=90;
	if(nAngle1<=90&&nAngle2<360)
	{
		m_Satellite[4].m_LiveTime=MAX_LIVETIME;
		m_Satellite[4].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360)+0.5);
		m_Satellite[4].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360)+0.5);
	}
	nAngle1=45;
	nAngle2=180;
	if(nAngle1<=90&&nAngle2<360)
	{
		m_Satellite[7].m_LiveTime=MAX_LIVETIME;
		m_Satellite[7].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360)+0.5);
		m_Satellite[7].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360)+0.5);
	}
	nAngle1=45;
	nAngle2=270;
	if(nAngle1<=90&&nAngle2<360)
	{
		m_Satellite[12].m_LiveTime=MAX_LIVETIME;
		m_Satellite[12].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90+0.5)*cos((nAngle2+90)*2*PI/360)+0.5);
		m_Satellite[12].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90+0.5)*sin((nAngle2+90)*2*PI/360)+0.5);
	}
#endif
	m_hIconSatellite=AfxGetApp()->LoadIcon(IDI_SATELLITE);
	m_hIconPosition=AfxGetApp()->LoadIcon(IDI_POSITION);
#ifdef	FILE_LOG_TEST
	if(m_LogFile.Open("PositionLogFile.txt",CFile::modeWrite,NULL)==NULL)
	{
		if(m_LogFile.Open("PositionLogFile.txt",CFile::modeCreate|CFile::modeWrite,NULL)==NULL)
		{
			MessageBox("文件打开失败!");
			m_LogFile.m_hFile=NULL;
		}
	}
	else
	{
		m_LogFile.SeekToEnd();
		char tt[200];
		sprintf(tt,"-------------%s-------------\r\n",__TIME__);
		m_LogFile.Write(tt,strlen(tt));
	}
#endif
#ifdef	DATA_LOG_TEST
	if(m_DataLogFile.Open("DataLogFile.txt",CFile::modeWrite,NULL)==NULL)
	{
		if(m_DataLogFile.Open("DataLogFile.txt",CFile::modeCreate|CFile::modeWrite,NULL)==NULL)
		{
			MessageBox("文件打开失败!");
			m_DataLogFile.m_hFile=NULL;
		}
	}
	else
	{
		m_DataLogFile.SeekToEnd();
		char tt[200];
		sprintf(tt,"-------------%s-------------\r\n",__TIME__);
		m_DataLogFile.Write(tt,strlen(tt));
	}
#endif

	m_dwTime1=0;
	m_dwTime2=0;
	m_dwTime=0;
	m_dwDate1=0;
	m_dwDate2=0;
	m_dwDate=0;
}

void CReadGPSDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CReadGPSDlg)
	DDX_Text(pDX, IDC_CUR_LATITUDE, m_CurLatitude);
	DDX_Text(pDX, IDC_CUR_LONGITUDE, m_CurLongitude);
	DDX_Text(pDX, IDC_CUR_DATE, m_CurDate);
	DDX_Text(pDX, IDC_CUR_TIME, m_CurTime);
	DDX_Text(pDX, IDC_DATE2, m_Date2);
	DDX_Text(pDX, IDC_DATE1, m_Date1);
	DDX_Text(pDX, IDC_DISTANT1, m_Distant1);
	DDX_Text(pDX, IDC_DISTANT2, m_Distant2);
	DDX_Text(pDX, IDC_LATITUDE2, m_Latitude2);
	DDX_Text(pDX, IDC_LATITUDE1, m_Latitude1);
	DDX_Text(pDX, IDC_LONGITUDE1, m_Longitude1);
	DDX_Text(pDX, IDC_LONGITUDE2, m_Longitude2);
	DDX_Text(pDX, IDC_TIME1, m_Time1);
	DDX_Text(pDX, IDC_TIME2, m_Time2);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CReadGPSDlg, CDialog)
	//{{AFX_MSG_MAP(CReadGPSDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_WM_DRAWITEM()
	ON_BN_CLICKED(IDC_SAVE_POSITON, OnSavePositon)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_SET_REF1, OnSetRef1)
	ON_BN_CLICKED(IDC_SET_REF2, OnSetRef2)
	ON_BN_CLICKED(IDC_COMPUTE_REF1, OnComputeRef1)
	ON_BN_CLICKED(IDC_COMPUTE_REF2, OnComputeRef2)
	ON_BN_CLICKED(IDC_TEST, OnTest)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CReadGPSDlg message handlers

BOOL CReadGPSDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	if(m_ComPort.Open(COM_PORT_NAME)!=ERROR_SUCCESS)
	{
		MessageBox("串口打开失败!");
		exit(0);
	}
	m_ComPort.Setup(CComPort::EBaud4800,CComPort::EData8,CComPort::EParNone,CComPort::EStop1);
	SetTimer(TIMER_GPS,100,NULL);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CReadGPSDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CReadGPSDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CReadGPSDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CReadGPSDlg::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent==TIMER_GPS)
	{
		int i;
		for(i=0;i<MAX_SATELLITE;i++)
		{
			if(m_Satellite[i].m_LiveTime>0)
				m_Satellite[i].m_LiveTime--;
		}
#ifdef	M_DEBUG
		m_TestCnt++;
		if(m_TestCnt>=40)
		{
			m_TestCnt=0;
			if(m_BufPos<BUFFER_LENGTH-100)
			{
				strcpy(&m_Buffer[m_BufPos],"09.432,W,001.9,336.9,170698,013.6,E*6E");
				m_BufPos+=strlen("09.432,W,001.9,336.9,170698,013.6,E*6E");
			}
		}
		else if(m_TestCnt==20)
		{
			//	m_TestCnt=0;
			if(m_BufPos<BUFFER_LENGTH-100)
			{
				strcpy(&m_Buffer[m_BufPos],"$GPRMC,204700,A,3403.868,N,117");
				m_BufPos+=strlen("$GPRMC,204700,A,3403.868,N,117");
			}
		}
#else
		DWORD nLen;
		//	m_ComPort.Read(&m_Buffer[m_BufPos],BUFFER_LENGTH-m_BufPos,&nLen,0,200);
		m_ComPort.Read(&m_Buffer[m_BufPos],BUFFER_LENGTH-m_BufPos,&nLen,0,0);
#ifdef	DATA_LOG_TEST
		if(nLen>0)
			m_DataLogFile.Write(&m_Buffer[m_BufPos],nLen);
#endif
		m_BufPos+=nLen;
		m_Buffer[m_BufPos]=0;
#endif
		PositionUpdate();
	}
	CDialog::OnTimer(nIDEvent);
}

void CReadGPSDlg::PositionUpdate()
{
	int i;
	int		xHour,xMin,xSec;
	int		xYear,xMonth,xDay;
	DWORD	xTime;
	double	xJindu,xWeidu;
	BOOL	bNorth,bEast;
	char	m_ShowStr[128];
//	$GPRMC,161135.000,V,2446.5222,N,12100.1590,E,,,161204,,*19
MAINLOOP:
	//	查找"$GPRMC,"
	while(m_BufPos>70)
	{
		i=0;
		if( m_Buffer[i]=='$'	&&
			m_Buffer[i+1]=='G'	&&
			m_Buffer[i+2]=='P')
		{
			TRACE("%s\n",m_Buffer);
			if(	m_Buffer[i+3]=='R'	&&
				m_Buffer[i+4]=='M'	&&
				m_Buffer[i+5]=='C'	&&
				m_Buffer[i+6]==',')
			{
				if(m_BufPos-i>61)
				{
					if(	m_Buffer[i+17]==','	&&
						m_Buffer[i+18]=='A'	&&
						m_Buffer[i+19]==',')
					{
						goto CONNECT;
					}
					//*
					else if(m_Buffer[i+17]==','	&&
							m_Buffer[i+18]=='V'	&&
							m_Buffer[i+19]==',')
					{
						//	goto NOT_CONNECT;
						goto CONNECT;
					}
					//*/
					else
					{
						goto DATA_ERR;
					}
				}
				//	继续等待数据
				return ;
			}
			else if(m_Buffer[i+3]=='G'	&&
					m_Buffer[i+4]=='G'	&&
					m_Buffer[i+5]=='A'	&&
					m_Buffer[i+6]==',')
			{
//				TRACE("%s\n",m_Buffer);
				//	GPGGA,213912.000,2446.5222,N,12100.1590,E,0,00,,,M,,M,,*45
				if(m_BufPos-i>61)
				{
					if(	m_Buffer[i+13]=='.'	&&
						m_Buffer[i+17]==','	&&
						m_Buffer[i+22]=='.' &&
						m_Buffer[i+27]==',' &&
						m_Buffer[i+29]==',' &&
						m_Buffer[i+35]=='.' &&
						m_Buffer[i+40]==',' &&
						m_Buffer[i+42]==',')
					{
						goto CONNECT_GGA;
					}
					else
					{
						goto DATA_ERR;
					}
				}
				//	继续等待数据
				return ;
			}
			else if(m_Buffer[i+3]=='G'	&&
					m_Buffer[i+4]=='S'	&&
					m_Buffer[i+5]=='V'	&&
					m_Buffer[i+6]==',')
			{
//				TRACE("%s\n",m_Buffer);
				//	$GPGSV, 3,1,09,03,77,217,00,  19,48,207,00,  23,47,284,00,  16,43,028,00  *72
				//	$GPGSV, 3,1,09,	03,77,217,00,
				//					19,48,207,00,
				//					23,47,284,00,
				//					16,43,028,00  *72
				if(m_BufPos-i>20)
				{
					if(	m_Buffer[i+7]>='0'	&&	m_Buffer[i+7]<='9'	&&
						m_Buffer[i+8]==','	&&
						m_Buffer[i+9]>='0'	&&	m_Buffer[i+9]<='9'	&&	
						m_Buffer[i+10]==','	&&
						m_Buffer[i+11]>='0'	&&	m_Buffer[i+11]<='9'	&&	
						m_Buffer[i+12]>='0'	&&	m_Buffer[i+12]<='9'	&&	
						m_Buffer[i+13]==',' )
					{
						goto CONNECT_GSV;
					}
					else
					{
						goto DATA_ERR;
					}
				}
				//	继续等待数据
				return ;
			}
		}
		for(i=0;i<m_BufPos;i++)
		{
			m_Buffer[i]=m_Buffer[i+1];
		}
		m_BufPos--;
	}
	return ;
CONNECT:
//	正常数据
//	$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E
//	TRACE("%s\n",m_Buffer);
	xHour=0;
	i=6;

⌨️ 快捷键说明

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