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

📄 planemodelsysdlg.cpp

📁 该系统可用于航模定位,输入三维空间中某一点到固定三点的距离即可计算出该点的三维坐标.并调用了MATLAB画出三维图形
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PlaneModelSysDlg.cpp : implementation file
//

#include "stdafx.h"
#include "mscomm.h"
#include "PlaneModelSys.h"
#include "PlaneModelSysDlg.h"
#include <math.h>

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

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

/////////////////////////////////////////////////////////////////////////////
// CPlaneModelSysDlg dialog

CPlaneModelSysDlg::CPlaneModelSysDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPlaneModelSysDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPlaneModelSysDlg)
	m_CoordinateX = -1.0f;
	m_CoordinateY = -1.0f;
	m_CoordinateZ = 0.0f;
	m_Speed = 0.0f;
	m_position = _T("");
	m_strRXData1 = 0;
	m_temp = 0;
	m_lastCoordinateX = -1.0f;
	m_lastCoordinateY = -1.0f;
	m_lastCoordinateZ = 0.0f;
	m_FirstCoordinateX = 0.0f;
	m_FirstCoordinateY = 0.0f;
    m_SecondCoordinateX = 0.0f;
	m_SecondCoordinateY = 0.0f;
	m_distant = -1.0f;
	m_oldDistant = 0.0f;
	m_strRXData2 = 0;
	m_strRXData3 = 0;
	m_stop = true;
	m_bCircle = false;
	m_arrayPosition = 0;
	m_bLine = false;

	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPlaneModelSysDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPlaneModelSysDlg)
	DDX_Text(pDX, IDC_EDIT4, m_CoordinateX);
	DDX_Text(pDX, IDC_EDIT5, m_CoordinateY);
	DDX_Text(pDX, IDC_EDIT6, m_CoordinateZ);
	DDX_Text(pDX, IDC_EDIT7, m_Speed);
	DDX_Text(pDX, IDC_EDIT8, m_position);
	DDX_Text(pDX, IDC_EDIT1, m_strRXData1);
	DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm1);
	DDX_Control(pDX, IDC_MSCOMM2, m_ctrlComm2);
	DDX_Control(pDX, IDC_MSCOMM3, m_ctrlComm3);
	DDX_Text(pDX, IDC_EDIT2, m_strRXData2);
	DDX_Text(pDX, IDC_EDIT3, m_strRXData3);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPlaneModelSysDlg, CDialog)
	//{{AFX_MSG_MAP(CPlaneModelSysDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_GetDistant, OnGetDistant)
	ON_BN_CLICKED(IDC_Stop, OnStop)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPlaneModelSysDlg message handlers

BOOL CPlaneModelSysDlg::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_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(FALSE);

	m_ctrlComm.SetCommPort(1);   //选择com1
	if( !m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(TRUE);//打开串口
	else
		AfxMessageBox("cannot open serial port");

	m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
	m_ctrlComm.SetRThreshold(1); 
	//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_ctrlComm.SetInputLen(0);  //设置当前接收区数据长度为0
	m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
*/
	//////////////////////////////串口初始化//////////////////////////////
	m_ctrlComm1.SetCommPort(4);//选择COM4
	m_ctrlComm1.SetInputMode(1);//输入方式为二进制方式
	m_ctrlComm1.SetInBufferSize(1024);//设置输入缓冲区大小
	m_ctrlComm1.SetOutBufferSize(512);//设置输出缓冲区大小
	m_ctrlComm1.SetSettings("19200,n,8,1");//波特率4800,无校验,8个数据位,1个停止位
	//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	if (!m_ctrlComm1.GetPortOpen())
		m_ctrlComm1.SetPortOpen(TRUE);//打开串口
	m_ctrlComm1.SetRThreshold(2);
	m_ctrlComm1.SetInputLen(7);//设置当前接收区数据长度为0
	m_ctrlComm1.GetInput();//预先读缓冲区以清除残留数据			



	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CPlaneModelSysDlg::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 CPlaneModelSysDlg::OnPaint() 
{
	// 初始化坐标以及目标区域

 	CClientDC dc(this);
	CPen m_pen(PS_SOLID, 1, RGB(144, 144, 144));
	CPen *m_OldPen = dc.SelectObject(&m_pen);
	
	int i = 0;
    int x = 30;
	int y = 30;
	for(i = 0; i <= 30; ++i)
	{
		dc.MoveTo(x,30);
		dc.LineTo(x,330);

		dc.MoveTo(30,y);
		dc.LineTo(330,y);
		
		if (i == 10)
		{
			TextOut(dc,  x, 330, _T("1"), 1);
			TextOut(dc,  25, 220, _T("1"), 1);
		}

		if (i == 20)
		{
			TextOut(dc,  x, 330, _T("2"), 1);
			TextOut(dc,  25, 120, _T("2"), 1);
		}

		if (i == 30)
		{
			TextOut(dc,  x, 330, _T("3"), 1);
			TextOut(dc,  25, 20, _T("3"), 1);
		}

		x += 10;
		y += 10;
	}
	TextOut(dc,  25, 330, _T("0"), 1);

	dc.SelectObject(m_OldPen);
 
	// 大的正方形
 	CBrush m_brushGray(RGB(215,215,215));
	dc.FillRect(CRect(130,130,230,230), &m_brushGray);
	TextOut(dc,  125, 130, _T("A"), 1);
	TextOut(dc,  130, 230, _T("B"), 1);
	TextOut(dc,  230, 230, _T("C"), 1);
 
	// 小的正方形
	CBrush m_brushGreen(RGB(0,255,0));
	dc.FillRect(CRect(170,170,190,190), &m_brushGreen);
	TextOut(dc,  160, 170, _T("D"), 1);
	TextOut(dc,  170, 190, _T("E"), 1);
	TextOut(dc,  190, 190, _T("F"), 1);

	// 中心点
	dc.Ellipse(176,176,184,184);
	
 	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 CPlaneModelSysDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CPlaneModelSysDlg::OnGetDistant() 
{
	// TODO: Add your control notification handler code here
	if (m_stop)
	{ 
		SetTimer(1, 1000, NULL);
		m_stop = false;
	}
}

BEGIN_EVENTSINK_MAP(CPlaneModelSysDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CPlaneModelSysDlg)
	ON_EVENT(CPlaneModelSysDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
	ON_EVENT(CPlaneModelSysDlg, IDC_MSCOMM2, 1 /* OnComm */, OnOnCommMscomm2, VTS_NONE)
	ON_EVENT(CPlaneModelSysDlg, IDC_MSCOMM3, 1 /* OnComm */, OnOnCommMscomm3, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CPlaneModelSysDlg::OnOnCommMscomm1() 
{
	// TODO: Add your control notification handler code here
	MessageBeep(0);
	//Sleep(10);
	VARIANT variant_inp;
    COleSafeArray safearray_inp;
	char ch[3];
	int temp;//临时变量
    LONG len,k;
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp;
	char a[2048];
    if(m_ctrlComm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             ////////以下你可以根据自己的通信协议加入处理代码
        variant_inp=m_ctrlComm1.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
	//	len=safearray_inp.GetOneDimSize();//每次收7个字符
		len=7;
		for (k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE数组
      
	    ch[0]=*((char*)rxdata+3);//读百位
		ch[1]=*((char*)rxdata+4);//读十位
		ch[2]=*((char*)rxdata+5);//读个位
	//	temp=int(ch[1])-48;  
		temp=int((int(ch[0])-48)*100+(int(ch[1])-48)*10+(int(ch[2])-48));//把接收到的2个字符转化为temp(0x03FF-0x0000)
		m_strRXData1=temp;

	/*	for(k=0;k<len;k++) //将数组转换为Cstring型变量
        {
            BYTE bt=*(rxdata+k); //字符型
		    
            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
            m_strRXData+=strtemp; //加入接收编辑框对应字符串 
		
			//a[k]=strtemp;
		//	m_strRXData=a[k];

        }
		*/ 
/*		           
       

⌨️ 快捷键说明

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