📄 gpsdlg.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 + -