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

📄 gpsdlg.cpp

📁 一个gps通讯接口程序可及时更新计算机时间
💻 CPP
字号:
// gpsDlg.cpp : implementation file
//

#include "stdafx.h"
#include "gps.h"
#include "gpsDlg.h"
#include "quitdlg.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HANDLE hevent=0; 
SYSTEMTIME	CurTime3;
BYTE bcdtohex(BYTE tt1);
OVERLAPPED		Overlapped;
BYTE t1,t2,t3,t4,t5,t6,t7;
int sendcount=0;
int gpscom=0;
void initgps();
void loadini();
HANDLE hpower;
UINT powerpro(LPVOID lParam);   
BYTE gpsbuf[256];
DWORD num;
void powerproc();
int StopFlag;
SYSTEMTIME st;
int timeflag=1;
int timecount=0;
SYSTEMTIME cpime;
CString  strtemp;


int m1=0,m2=0,m3=0,m4=0,m5=0,m6=0;

/////////////////////////////////////////////////////////////////////////////
// CGpsDlg dialog

CGpsDlg::CGpsDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGpsDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGpsDlg)
	m_ctime = _T("");
	m_gtime = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGpsDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGpsDlg)
	DDX_Text(pDX, IDC_EEEE2, m_ctime);
	DDX_Text(pDX, IDC_EEEE3, m_gtime);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGpsDlg, CDialog)
	//{{AFX_MSG_MAP(CGpsDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CLOSE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGpsDlg message handlers

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

	// 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
	
	loadini();
	initgps();
	SetTimer(3399,900,NULL);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// 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 CGpsDlg::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 CGpsDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
void initgps()
{
	if(gpscom==0)
	{
		AfxMessageBox("GPS串口错误");
		return;
	}
		
	
	char buf[100];
	COMMTIMEOUTS MyTimeouts1;
	DCB dcb1;
	CString mmm="";
	mmm.Format("COM%d",gpscom);
	hpower=CreateFile(mmm,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);
	if (hpower==INVALID_HANDLE_VALUE ) 
	{
		 
		AfxMessageBox("GPS串口错误");
		return;
	}
	
	GetCommState(hpower,&dcb1);
	wsprintf(buf,"\\\\.\\COM%d: baud=4800 parity=N data=8 stop=1",gpscom);
	BuildCommDCB(buf, &dcb1); 
	SetCommState(hpower,&dcb1);


	SetCommMask(hpower,EV_RXCHAR);

	SetupComm( hpower, 1024,1024) ; 
	if(!GetCommTimeouts(hpower,&MyTimeouts1))
	{
		CloseHandle(hpower);
	}
		MyTimeouts1.ReadIntervalTimeout=1000;
		MyTimeouts1.ReadTotalTimeoutMultiplier=500;
		MyTimeouts1.ReadTotalTimeoutConstant=5000;
	if(!SetCommTimeouts(hpower,&MyTimeouts1))
	{
		CloseHandle(hpower);
		return ;
	}
	PurgeComm( hpower, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); 
	hevent=CreateEvent(NULL,FALSE,FALSE,"watchevent");
	AfxBeginThread(powerpro,NULL);
	
	
}
void loadini()
{

	TCHAR FilePath[MAX_PATH]; 
    GetModuleFileName(NULL,FilePath,MAX_PATH); 
    (_tcsrchr(FilePath,'\\'))[1] = 0; 
    lstrcat(FilePath,_T("set.ini")); 
	char tempbf[50];
	int tt;
	char *s;
	s=&(tempbf[0]);
	GetPrivateProfileString("串口设置","GPS通信口", "",&tempbf[0],12, FilePath);
	tt=atoi(s);
	gpscom=BYTE(tt);

}
UINT powerpro(LPVOID lParam)   
{
	

	Sleep(3000);

	DWORD dwEventMask=0,dwErrorFlags=0;
	COMSTAT ComStat; 
	DWORD dwLength;

	while(1)
	{
		if (StopFlag) 
		{
			CloseHandle( hpower );
			return 0;
		}
		if(hpower)
		{

				WaitCommEvent(hpower,&dwEventMask,NULL);
				if((dwEventMask&EV_RXCHAR)==EV_RXCHAR)
				{ 
					

						ClearCommError(hpower,&dwErrorFlags,&ComStat);
						dwLength=ComStat.cbInQue;
					if(dwLength>1)
					{
						powerproc();	
						
					
					}
				}
		}

	}
	return 0;




}
void powerproc()
{

	if (ReadFile(hpower,gpsbuf,20,&num,&Overlapped )) 
	{
		if(num=17)
		{
			if((gpsbuf[0]==0x42)&&(gpsbuf[16]==0xd))
			{








			

				
				sendcount++;
				if(sendcount>1000)
					sendcount=0;
				
	


					t1=bcdtohex(gpsbuf[6]);    //month
					t2=bcdtohex(gpsbuf[7]);    //day
					t3=bcdtohex(gpsbuf[1]);    //hour
					t4=bcdtohex(gpsbuf[2]);    //minute
					t5=bcdtohex(gpsbuf[3]);    //second
					t6=bcdtohex(gpsbuf[4]);    //
					t7=bcdtohex(gpsbuf[5]);    //
					
					if((t1>12)||(t2>31)||(t3>24)||(t4>60)||(t5>60))
						return;



					m1=t6*100+t7;
					m2=t1;
					m3=t2;
					m4=t3;
					m5=t4;
					m6=t5;
				if(timeflag==1)
				{
				
					
					st.wYear  =WORD(t6*100+t7);
					st.wMonth =BYTE(t1);
					st.wDay   =BYTE(t2);
					st.wHour  =BYTE(t3);
					st.wMinute=BYTE(t4);
					st.wSecond=BYTE(t5);
					st.wMilliseconds =0;
					if(t5==0)
					{
					SetLocalTime(&st);
					}
					timeflag=0;
					sendcount++;
					if(sendcount>1000)
						sendcount=0;
	
					
				}
				
				


			}
			
				
		}
	}
}

void CGpsDlg::OnClose() 
{
Cquitdlg  dlg11;
if(dlg11.DoModal()==IDOK)	
{
	StopFlag=1;





	Sleep(2000);



	CDialog::OnClose();
}
}

void CGpsDlg::OnTimer(UINT nIDEvent) 
{
	SetDlgItemInt(IDC_EEEE,sendcount);
	showtime();
	
	CDialog::OnTimer(nIDEvent);
}
BYTE bcdtohex(BYTE tt1)
{

	BYTE temp1,temp2,result;
	temp1=(tt1>>4)&0xf;
	temp2=tt1&0xf;
		
	result=temp1*10+temp2;
	return BYTE(result);


}

void CGpsDlg::showtime()
{
	GetLocalTime(&cpime);

	strtemp.Format("%04d/%02d/%02d %02d:%02d:%02d  ",cpime.wYear,cpime.wMonth,cpime.wDay,cpime.wHour,cpime.wMinute,cpime.wSecond);
	m_ctime=strtemp;


	strtemp.Format("%04d/%02d/%02d %02d:%02d:%02d  ",m1,m2,m3,m4,m5,m6);
	m_gtime=strtemp;

	
	UpdateData(FALSE);




}

⌨️ 快捷键说明

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