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

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

?? gpsrecvdlg.cpp

?? 該程序用MFC實現串口通信
?? CPP
字號:
// GpsRecvDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GpsRecv.h"
#include "GpsRecvDlg.h"
#include "PortSetting.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

UINT lpCommThreadProc(LPVOID lpParam);

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()

/////////////////////////////////////////////////////////////////////////////
// CGpsRecvDlg dialog

CGpsRecvDlg::CGpsRecvDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGpsRecvDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGpsRecvDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hPort = NULL;
	m_pCommThread = NULL;
	m_bExitThread = FALSE;

	m_nPort = 1;
	m_nBaud = 9600;
	m_nParity = 0;
	m_nStopBits = 0;
	m_nDataBits = 8;

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGpsRecvDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGpsRecvDlg)
	DDX_Control(pDX, IDC_GPS_DATA, m_Edit);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGpsRecvDlg, CDialog)
	//{{AFX_MSG_MAP(CGpsRecvDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_PORT_SETTING, OnPortSetting)
	ON_BN_CLICKED(IDC_OPEN_PORT, OnOpenPort)
	ON_BN_CLICKED(IDC_CLOSE_PORT, OnClosePort)
	ON_MESSAGE(WM_RECVGPSDATA, OnRecvGpsData)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGpsRecvDlg message handlers

BOOL CGpsRecvDlg::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
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CGpsRecvDlg::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 CGpsRecvDlg::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 CGpsRecvDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CGpsRecvDlg::OnPortSetting() 
{
	CPortSetting PortSetting;
	PortSetting.m_nPort = m_nPort;
	PortSetting.m_nBaud = m_nBaud;
	PortSetting.m_nDataBits = m_nDataBits;
	PortSetting.m_nStopBits = m_nStopBits;
	PortSetting.m_nParity = m_nParity;

	if(PortSetting.DoModal() == IDOK)
	{
		m_nPort = PortSetting.m_nPort;
		m_nBaud = PortSetting.m_nBaud;
		m_nDataBits = PortSetting.m_nDataBits;
		m_nStopBits = PortSetting.m_nStopBits;
		m_nParity = PortSetting.m_nParity;

		//如果串口處于打開狀態,則先關閉串口,再根據新參數打開串口
		if(m_hPort)
		{
			OnClosePort();
			OnOpenPort();
		}
	}
}

void CGpsRecvDlg::OnOpenPort() 
{
	if(m_hPort)
	{
		MessageBox(_T("串口已經打開!"));
		return;
	}

	//打開串口
	CString sPort;
	sPort.Format(_T("\\\\.\\COM%d"), m_nPort);
	m_hPort = CreateFile(sPort, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
						 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
	if(m_hPort == INVALID_HANDLE_VALUE)
	{
		MessageBox("打開串口失敗!");
		m_hPort = NULL;
		return;
	}

	//設置緩沖區
	SetupComm(m_hPort, 1024, 1024);

	//配置串口
	DCB ComDCB;
	ComDCB.DCBlength = sizeof(DCB);
	GetCommState(m_hPort, &ComDCB);

	//改變缺省配置
	ComDCB.BaudRate = m_nBaud;
	ComDCB.ByteSize = m_nDataBits;
	ComDCB.Parity = m_nParity;
	ComDCB.StopBits = m_nStopBits;

	SetCommState(m_hPort, &ComDCB);

	//設置超時值
	COMMTIMEOUTS ot;
	memset(&ot, 0, sizeof(ot));
	ot.ReadIntervalTimeout = MAXDWORD;
	SetCommTimeouts(m_hPort, &ot);		

	//啟動接收線程
	m_bExitThread = FALSE;
	m_pCommThread = AfxBeginThread(lpCommThreadProc, this, THREAD_PRIORITY_NORMAL);
	if(m_pCommThread)
		m_pCommThread->m_bAutoDelete = TRUE;
	else 
	{
		MessageBox("啟動接收線程失敗!");
		CloseHandle(m_hPort);
		m_hPort = NULL;
		return;
	}
}

void CGpsRecvDlg::OnClosePort() 
{
	if(m_hPort == NULL)
	{
		MessageBox(_T("串口已經關閉!"));
		return;
	}

	//設置結束接收線程標志
	m_bExitThread = TRUE;

	//使串口接收線程中的WaitCommEvent()函數返回
	SetCommMask(m_hPort, 0);

	//等待接收線程結束
	WaitForSingleObject(m_pCommThread->m_hThread, INFINITE);
	m_pCommThread = NULL;

	//關閉串口
	CloseHandle(m_hPort);
	m_hPort = NULL;
}

void CGpsRecvDlg::OnOK() 
{
	if(m_hPort)
	{
		//設置結束接收線程標志
		m_bExitThread = TRUE;

		//使串口接收線程中的WaitCommEvent()函數返回
		SetCommMask(m_hPort, 0);

		//等待接收線程結束
		WaitForSingleObject(m_pCommThread->m_hThread, INFINITE);
		m_pCommThread = NULL;

		//關閉串口
		CloseHandle(m_hPort);
	}
	
	CDialog::OnOK();
}

UINT lpCommThreadProc(LPVOID lpParam)
{
	CGpsRecvDlg *pWnd = (CGpsRecvDlg *)lpParam;
	if(!pWnd || !pWnd->m_hPort) return 0;
		
	BYTE RecvBuf[1024];
	DWORD  dwSpace, dwReadCount = 0, dwReturnCount;
	DWORD dwError, dwEvtMask = 0;
	COMSTAT cs;

	OVERLAPPED overlapped;
	memset(&overlapped, 0, sizeof(overlapped));
	//創建一個人工復位事件對象
	overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	//設置串口事件
	SetCommMask(pWnd->m_hPort, EV_RXCHAR);

	while(!pWnd->m_bExitThread)
	{
		//等待串口事件
		WaitCommEvent(pWnd->m_hPort, &dwEvtMask, NULL);
		if(dwEvtMask & EV_RXCHAR)
		{
			//獲取串口狀態
			ClearCommError(pWnd->m_hPort, &dwError, &cs);
			dwReadCount = cs.cbInQue;
			if(dwReadCount <= 0) continue;
			
			//獲取GPS數據緩沖區的剩余空間
			dwSpace = (DWORD)pWnd->m_GpsBuf.GetDataBufSpace();
			if(dwReadCount > dwSpace) dwReadCount = dwSpace;

			//異步讀取數據
			BOOL bReadStat = ReadFile(pWnd->m_hPort, RecvBuf, dwReadCount, 
									  &dwReturnCount, &overlapped); 
			if(!bReadStat)
			{
				if(GetLastError() == ERROR_IO_PENDING)
				{
					while(!GetOverlappedResult(pWnd->m_hPort, &overlapped, 
						   &dwReturnCount, FALSE))
					{
						dwError = GetLastError();
						if(dwError == ERROR_IO_INCOMPLETE) continue;
					}
				}
			}

			//把讀取的數據放入GPS數據緩沖區
			pWnd->m_GpsBuf.Write(RecvBuf, dwReturnCount);
			//向主窗口發送消息
			pWnd->PostMessage(WM_RECVGPSDATA, 0, 0);
		}
	}

	CloseHandle(overlapped.hEvent);
	PurgeComm(pWnd->m_hPort, PURGE_TXABORT|PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXCLEAR);

	return 0;
}

void CGpsRecvDlg::OnRecvGpsData(WPARAM wp, LPARAM lp)
{
	BYTE buf[1024];
	int len;
	CString strEditText, strTemp;
	//從GPS數據緩沖區中讀取一條完整的數據
	if(m_GpsBuf.Read(buf, len) == 1)
	{
		//將讀取地GPS原始數據顯示在編輯框中
		strEditText.Format(_T("%s"), (char *)buf);
		AddDataString(strEditText);

		//當數據有效時,將解釋后地數據顯示在編輯框中
		if(DealGpsData(buf, len) == 1)
		{
			strEditText.Format(_T("時間:%d-%d-%d %d:%d%d\r\n"), data.time.wYear, 
						data.time.wMonth, data.time.wDay, data.time.wHour, 
						data.time.wMinute, data.time.wSecond);
			strTemp.Format(_T("經度:%.5f 緯度:%.5f\r\n"), data.longitude, data.latitude);
			strEditText += strTemp;
			strTemp.Format(_T("速度:%.2f 方位:%.2f\r\n"), data.speed, data.course);
			strEditText += strTemp;
			AddDataString(strEditText);
		}
	}
}

//解釋GPS數據
int CGpsRecvDlg::DealGpsData(BYTE *buf, DWORD len)
{
	int index;
	CString sData;
	sData.Format(_T("%s"), buf);

	index = sData.Find(_T(','));
	if(index == -1) return 0;
	sData = sData.Right(sData.GetLength() - index - 1);

	//get UTC time
	CString sLeft = sData.Left(2);
	data.time.wHour = atoi(sLeft);

	sData = sData.Right(sData.GetLength() - 2);

	sLeft = sData.Left(2);
	data.time.wMinute = atoi(sLeft);

	sData = sData.Right(sData.GetLength() - 2);

	sLeft = sData.Left(2);
	data.time.wSecond = atoi(sLeft);

	sData = sData.Right(sData.GetLength() - 3);

	//get status
	sLeft = sData.Left(1);
	data.status = sLeft[0];

	sData = sData.Right(sData.GetLength() - 2);

	//get latitude
	index = sData.Find(_T(','));
	if(index == -1) return 0;
	sLeft = sData.Left(index);
	sData = sData.Right(sData.GetLength() - index - 1);
	double lat = atof(sLeft);
	data.latitude = long(lat/100) + (lat - long(lat/100)*100)/60;

	//get latitude hemisphere
	sLeft = sData.Left(1);
	data.lat_hemi = sLeft[0];;

	sData = sData.Right(sData.GetLength() - 2);

	//get longitude
	index = sData.Find(_T(','));
	if(index == -1) return 0;
	sLeft = sData.Left(index);
	sData = sData.Right(sData.GetLength() - index - 1);
	double lon = atof(sLeft);
	data.longitude = long(lon/100) + (lon - long(lon/100)*100)/60;

	//get longitude hemisphere
	sLeft = sData.Left(1);
	data.lon_hemi = sLeft[0];;

	sData = sData.Right(sData.GetLength() - 2);

	//get speed
	index = sData.Find(_T(','));
	if(index == -1) return 0;
	sLeft = sData.Left(index);
	sData = sData.Right(sData.GetLength() - index - 1);
	data.speed = atof(sLeft);

	//get course
	index = sData.Find(_T(','));
	if(index == -1) return 0;
	sLeft = sData.Left(index);
	sData = sData.Right(sData.GetLength() - index - 1);
	data.course = atof(sLeft);

	//get UTC data
	sLeft = sData.Left(2);
	data.time.wDay = atoi(sLeft);

	sData = sData.Right(sData.GetLength() - 2);

	sLeft = sData.Left(2);
	data.time.wMonth = atoi(sLeft);

	sData = sData.Right(sData.GetLength() - 2);

	sLeft = sData.Left(2);
	data.time.wYear = atoi(sLeft);

	sData = sData.Right(sData.GetLength() - 3);

	data.time.wDayOfWeek = 0;
	data.time.wMilliseconds = 0;

	//get magnetic degree
	index = sData.Find(_T(','));
	if(index == -1) return 0;
	sLeft = sData.Left(index);
	sData = sData.Right(sData.GetLength() - index - 1);
	data.mag_degree = atof(sLeft);

	//get direction
	sLeft = sData.Left(1);
	data.direction = sLeft[0];;

	if(data.status != 'A')
	{
		return 0;
	}

	return 1;
}

void CGpsRecvDlg::AddDataString(LPCTSTR string)
{
	int nTextLen = m_Edit.GetWindowTextLength();

	//當編輯框中地字符長度大于2000時,將編輯框清空
	if(nTextLen > 2000)
	{
		m_Edit.SetWindowText(_T(""));
		nTextLen = 0;
	}
	m_Edit.SetSel(nTextLen, nTextLen);
	m_Edit.ReplaceSel(string);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲人成网站| 色美美综合视频| 欧美最猛黑人xxxxx猛交| 日韩免费一区二区| 亚洲色大成网站www久久九九| 午夜精品久久久久久久久久| 国产一区不卡视频| 欧美疯狂做受xxxx富婆| 中文字幕一区二区三区色视频| 麻豆91小视频| 欧美日韩一级片网站| 中文字幕中文在线不卡住| 激情综合网天天干| 欧美日韩亚洲丝袜制服| 中文字幕日韩av资源站| 国产精品一区二区你懂的| 欧美一卡二卡三卡| 亚洲高清视频在线| 91免费精品国自产拍在线不卡| 久久久久国产精品免费免费搜索| 日本一区中文字幕| 欧日韩精品视频| 亚洲人成精品久久久久| 成人免费观看av| 精品av久久707| 日韩综合小视频| 欧美日韩一区在线| 一区二区三区精品久久久| 成人激情免费电影网址| 国产日本欧美一区二区| 国产尤物一区二区| 精品国产不卡一区二区三区| 石原莉奈一区二区三区在线观看 | 国产精品久久久久久久久图文区 | 国产高清不卡一区二区| 亚洲精品一区二区三区福利| 免费成人美女在线观看| 91精品在线麻豆| 日韩国产精品久久久| 欧美电影影音先锋| 亚洲成在人线在线播放| 欧美日韩在线播放三区| 亚洲国产视频直播| 欧美日韩一区二区三区在线看| 亚洲国产精品精华液网站| 99re热视频这里只精品| 国产日产欧美一区二区三区| 波多野结衣一区二区三区 | 欧美综合欧美视频| 亚洲国产视频一区二区| 欧美日韩你懂的| 丝袜美腿亚洲一区| 日韩欧美电影一区| 日本不卡一二三| 日韩一二三区视频| 久久精品理论片| 久久在线观看免费| 国产a久久麻豆| 亚洲视频综合在线| 在线观看亚洲一区| 日韩电影网1区2区| 精品99一区二区三区| 国产成人综合在线播放| 国产精品久久久久久久久免费樱桃| 不卡区在线中文字幕| 亚洲品质自拍视频网站| 欧美日韩亚洲综合在线| 久久国产精品免费| 久久精品一区二区三区不卡| 99re亚洲国产精品| 午夜久久久影院| 91精品国产高清一区二区三区 | 亚洲男同性视频| 欧美视频完全免费看| 日韩精品视频网站| 精品国产一区二区三区久久久蜜月| 国产精品一区二区在线观看不卡| 中文字幕一区二区三区在线观看| 在线观看三级视频欧美| 日韩成人免费在线| 国产女人18毛片水真多成人如厕 | 欧洲亚洲国产日韩| 蜜桃av噜噜一区| 国产日韩亚洲欧美综合| 在线视频你懂得一区| 蜜臀av一级做a爰片久久| 久久精品日产第一区二区三区高清版 | 中文在线一区二区| 欧美又粗又大又爽| 久久成人免费日本黄色| 中文字幕一区二区三区色视频| 欧美四级电影网| 韩国一区二区三区| 亚洲天堂av老司机| 91麻豆精品国产| 成人黄色小视频| 丝袜美腿一区二区三区| 国产精品视频你懂的| 欧美色综合天天久久综合精品| 久久成人免费日本黄色| 亚洲色图欧美在线| 久久综合久色欧美综合狠狠| 色综合婷婷久久| 精品一区二区三区免费观看| 亚洲美女淫视频| 精品国产免费久久| 欧美午夜精品理论片a级按摩| 国产麻豆视频精品| 日韩精品久久久久久| 中文字幕亚洲区| 精品卡一卡二卡三卡四在线| 91高清视频在线| 国产一区999| 三级影片在线观看欧美日韩一区二区 | 波多野结衣在线一区| 蜜乳av一区二区| 亚洲欧洲精品一区二区三区不卡| 欧美一区二区三区在| 色呦呦网站一区| 国产传媒日韩欧美成人| 毛片一区二区三区| 亚洲一区免费观看| 国产亚洲欧美日韩日本| 91精品国产高清一区二区三区蜜臀 | 蜜臀av性久久久久蜜臀aⅴ| 成人精品小蝌蚪| 91福利精品第一导航| 国产精品看片你懂得| 免费在线观看精品| 日本久久电影网| 中文字幕一区二| 国产91精品露脸国语对白| 日韩欧美在线网站| 亚洲一区在线播放| 97精品国产露脸对白| 欧美成人在线直播| 日韩主播视频在线| 欧美色综合网站| 日本中文字幕一区二区视频| 日韩你懂的在线播放| 中文字幕一区二区5566日韩| 国产欧美日韩中文久久| 精品裸体舞一区二区三区| 91精品一区二区三区在线观看| 日本高清不卡视频| 91在线云播放| 成人av网站免费观看| 国产凹凸在线观看一区二区| 激情综合色综合久久| 麻豆成人91精品二区三区| 日本视频中文字幕一区二区三区| 亚洲综合久久久久| 一区二区三区 在线观看视频| 日韩毛片高清在线播放| 国产精品久久久久影院老司 | 成人黄色电影在线 | 亚洲大片在线观看| 亚洲国产精品一区二区www在线| 亚洲乱码日产精品bd| 亚洲黄色av一区| 亚洲女人小视频在线观看| 亚洲精品视频免费看| 亚洲综合色区另类av| 亚洲一区二区三区三| 午夜视频在线观看一区二区三区| 亚洲动漫第一页| 日韩精品乱码免费| 久久国产生活片100| 国产在线日韩欧美| 国产成a人亚洲| 不卡视频一二三| 在线免费亚洲电影| 欧美色偷偷大香| 在线播放日韩导航| 欧美xxxx在线观看| 国产午夜精品美女毛片视频| 国产精品免费视频一区| 中文字幕一区二区三区四区| 洋洋av久久久久久久一区| 香蕉av福利精品导航| 另类综合日韩欧美亚洲| 国产一区二区精品久久99| 懂色中文一区二区在线播放| 91麻豆精东视频| 欧美三区在线视频| 日韩欧美国产午夜精品| 久久女同精品一区二区| 国产精品免费aⅴ片在线观看| 亚洲视频免费在线| 亚洲成人午夜影院| 久久黄色级2电影| 国产91综合网| 欧美在线999| 精品国产乱码久久久久久牛牛| 欧美激情自拍偷拍| 亚洲色大成网站www久久九九| 丝袜a∨在线一区二区三区不卡| 国产综合色精品一区二区三区| 不卡的看片网站| 欧美日韩国产欧美日美国产精品|