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

📄 atmeasureview.cpp

📁 串口应变采集系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// AtmeasureView.cpp : implementation of the CAtmeasureView class
//

#include "stdafx.h"
#include "Atmeasure.h"

#include "AtmeasureSet.h"
#include "AtmeasureDoc.h"
#include "AtmeasureView.h"
#include "mscomm.h"
#include "SysDialog.h"
#include "SysSet.h"
#include "Point.h"
#include "CyTime.h"

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

#define ID_TIMER 1
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureView

IMPLEMENT_DYNCREATE(CAtmeasureView, CRecordView)

BEGIN_MESSAGE_MAP(CAtmeasureView, CRecordView)
	//{{AFX_MSG_MAP(CAtmeasureView)
	ON_COMMAND(ID_START, OnStart)
	ON_COMMAND(ID_STOP, OnStop)
	ON_WM_TIMER()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_OK, OnOk)
	ON_BN_CLICKED(IDC_DRAW, OnDraw)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CAtmeasureView, CView)
    //{{AFX_EVENTSINK_MAP(CExa06View)
	ON_EVENT(CAtmeasureView, IDC_DATACOM_MSCOMM, 1 /* OnComm */, OnCommDatacom, VTS_NONE)
	ON_EVENT(CAtmeasureView, IDC_CTRLCOM_MSCOMM, 1 /* OnComm */, OnCommCtrlcom, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureView construction/destruction

CAtmeasureView::CAtmeasureView()
	: CRecordView(CAtmeasureView::IDD)
{
	//{{AFX_DATA_INIT(CAtmeasureView)
	m_pSet = NULL;
	m_PointRoad = _T("1");
	m_PointRoad0 = _T("1");
	m_PointRoad1 = _T("1");
	m_PointRoad2 = _T("1");
	m_PointRoad3 = _T("1");
	m_PointData = _T("01");
	m_PointData0 = _T("02");
	m_PointData1 = _T("03");
	m_PointData2 = _T("04");
	m_PointData3 = _T("05");
	m_tem1 = _T("0");
	m_tem2 = _T("50");
	m_tem3 = _T("0");
	m_tem4 = _T("24");
	m_TimeData = m_TimeData.GetCurrentTime();
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	m_bCtrlCOMCreated = 0;
	m_bDataCOMCreated = 0;
	m_AlreadyOpen     = false;

}

CAtmeasureView::~CAtmeasureView()
{
}

void CAtmeasureView::DoDataExchange(CDataExchange* pDX)
{
	CRecordView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAtmeasureView)
	DDX_Control(pDX, IDC_TIMECHOOSE, m_TimeChoose);
	DDX_Control(pDX, IDC_TEM4, m_Tem4Ctrl);
	DDX_Control(pDX, IDC_TEM3, m_Tem3Ctrl);
	DDX_Control(pDX, IDC_TEM2, m_Tem2Ctrl);
	DDX_Control(pDX, IDC_TEM1, m_Tem1Ctrl);
	DDX_Control(pDX, IDC_point3, m_PointNameCtrl3);
	DDX_Control(pDX, IDC_point2, m_PointNameCtrl2);
	DDX_Control(pDX, IDC_point1, m_PointNameCtrl1);
	DDX_Control(pDX, IDC_point0, m_PointNameCtrl0);
	DDX_Control(pDX, IDC_point, m_PointNameCtrl);
	DDX_Control(pDX, IDC_channel3, m_PointRoadCtrl3);
	DDX_Control(pDX, IDC_channel2, m_PointRoadCtrl2);
	DDX_Control(pDX, IDC_channel1, m_PointRoadCtrl1);
	DDX_Control(pDX, IDC_channel0, m_PointRoadCtrl0);
	DDX_Control(pDX, IDC_channel, m_PointRoadCtrl);
	DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
	DDX_CBString(pDX, IDC_channel, m_PointRoad);
	DDX_CBString(pDX, IDC_channel0, m_PointRoad0);
	DDX_CBString(pDX, IDC_channel1, m_PointRoad1);
	DDX_CBString(pDX, IDC_channel2, m_PointRoad2);
	DDX_CBString(pDX, IDC_channel3, m_PointRoad3);
	DDX_CBString(pDX, IDC_point, m_PointData);
	DDX_CBString(pDX, IDC_point0, m_PointData0);
	DDX_CBString(pDX, IDC_point1, m_PointData1);
	DDX_CBString(pDX, IDC_point2, m_PointData2);
	DDX_CBString(pDX, IDC_point3, m_PointData3);
	DDX_CBString(pDX, IDC_TEM1, m_tem1);
	DDX_CBString(pDX, IDC_TEM2, m_tem2);
	DDX_CBString(pDX, IDC_TEM3, m_tem3);
	DDX_CBString(pDX, IDC_TEM4, m_tem4);
	DDX_DateTimeCtrl(pDX, IDC_TIMECHOOSE, m_TimeData);
	//}}AFX_DATA_MAP
}

BOOL CAtmeasureView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CRecordView::PreCreateWindow(cs);
}

void CAtmeasureView::OnInitialUpdate()
{
	m_pSet = &GetDocument()->m_atmeasureSet;
	CRecordView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_ListCtrl.InsertColumn(0,_T("时间"),LVCFMT_IMAGE|LVCFMT_LEFT);
	m_ListCtrl.SetColumnWidth(0,80);
	m_ListCtrl.SetColumnWidth(1,60);
	m_ListCtrl.InsertColumn(1,_T("通道号"));
	m_ListCtrl.SetColumnWidth(1,50);
	m_ListCtrl.InsertColumn(2,_T("点号"));
	m_ListCtrl.SetColumnWidth(2,50);
//	m_ListCtrl.InsertColumn(3,_T("波长"));
//	m_ListCtrl.SetColumnWidth(3,60);
	m_ListCtrl.InsertColumn(3,_T("温度"));
	m_ListCtrl.SetColumnWidth(3,60);
	m_ListCtrl.InsertColumn(4,_T("应变"));
	m_ListCtrl.SetColumnWidth(4,60);
	m_ListCtrl.InsertColumn(5,_T("压力"));
	m_ListCtrl.SetColumnWidth(5,60);

//	this->show();
//	GetDlgItem(IDC_temp)->ShowWindow(SW_SHOW);
//	GetDlgItem(IDC_CHANGE)->ShowWindow(SW_HIDE);
//    GetDlgItem(IDC_preasure)->ShowWindow(SW_HIDE);
//	this->SampPara();
//	CAtmeasureDoc *aa;
//	aa->SampPara();
//	CAtmeasureDoc::SampPara();


}

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureView printing

BOOL CAtmeasureView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CAtmeasureView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CAtmeasureView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureView diagnostics

#ifdef _DEBUG
void CAtmeasureView::AssertValid() const
{
	CRecordView::AssertValid();
}

void CAtmeasureView::Dump(CDumpContext& dc) const
{
	CRecordView::Dump(dc);
}

CAtmeasureDoc* CAtmeasureView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAtmeasureDoc)));
	return (CAtmeasureDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureView database support
CRecordset* CAtmeasureView::OnGetRecordset()
{
	return m_pSet;
}


/////////////////////////////////////////////////////////////////////////////
// CAtmeasureView message handlers

int CAtmeasureView::SetCtrlCOM(CString str)
{
    CAtmeasureDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//TODO
//判断端口号
	int port;
	if(!str.CompareNoCase("COM1"))
		port = 1;
	else if(!str.CompareNoCase("COM2"))
		port = 2;
	else if(!str.CompareNoCase("COM3"))
		port = 3;
	else if(!str.CompareNoCase("COM4"))
		port = 4;
	else if(!str.CompareNoCase("COM5"))
		port = 5;
	else if(!str.CompareNoCase("COM6"))
		port = 6;
	else
		port = 0;

	if(port == 0)
	{
		MessageBox("非法的控制端口","错误!",MB_ICONERROR);
		return 2; //port set error
	}
//判断串口是否存在以及是否被占用
	HANDLE m_hCom;
	m_hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL,
		 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
	if(m_hCom == INVALID_HANDLE_VALUE)
	{
		MessageBox("控制端口不存在或以被占用","",MB_ICONINFORMATION);
		return 3;  //port invalide
	}
	CloseHandle(m_hCom);

//生成一个串口控件
	if(m_bCtrlCOMCreated == 0)
	{
		pDoc->m_CtrlCOM.Create(NULL,0,CRect(0,0,0,0),this,IDC_CTRLCOM_MSCOMM); //??????
		m_bCtrlCOMCreated = 1;
	}
	
	if(pDoc->m_CtrlCOM.GetPortOpen())	//如果串口是打开的,则行关闭串口
		pDoc->m_CtrlCOM.SetPortOpen(FALSE);
//参数设置
	pDoc->m_CtrlCOM.SetCommPort(port);  
	pDoc->m_CtrlCOM.SetInBufferSize(1024); //?????
	pDoc->m_CtrlCOM.SetOutBufferSize(1024); //?????
	pDoc->m_CtrlCOM.SetInputLen(0);	//读全部字符
	pDoc->m_CtrlCOM.SetInputMode(1);  //二进制方式
	pDoc->m_CtrlCOM.SetRThreshold(1);
	pDoc->m_CtrlCOM.SetSettings("9600,n,8,1");

	if(!pDoc->m_CtrlCOM.GetPortOpen())				//如果串口没有打开则打开
		pDoc->m_CtrlCOM.SetPortOpen(TRUE);			//打开串口
	else
	{
		MessageBox("打开控制端口失败!","错误!",MB_ICONERROR);
		return 1;      //open COM error
	}
	pDoc->m_CtrlCOM.GetInput();

//	MessageBox("控制端口打开成功","成功",MB_ICONINFORMATION);

	return 0;
}

int CAtmeasureView::SetDataCOM(CString str)
{
    CAtmeasureDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//TODO
//判断端口号
	int port;
	if(!str.CompareNoCase("COM1"))
		port = 1;
	else if(!str.CompareNoCase("COM2"))
		port = 2;
	else if(!str.CompareNoCase("COM3"))
		port = 3;
	else if(!str.CompareNoCase("COM4"))
		port = 4;
	else if(!str.CompareNoCase("COM5"))
		port = 5;
	else if(!str.CompareNoCase("COM6"))
		port = 6;
	else
		port = 0;

	if(port == 0)
	{
		MessageBox("非法的数据端口","错误!",MB_ICONERROR);
		return 2; //port set error
	}
//判断串口是否存在以及是否被占用
	HANDLE m_hCom;
	m_hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL,
		 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
	if(m_hCom == INVALID_HANDLE_VALUE)
	{
		MessageBox("数据端口不存在或以被占用","",MB_ICONINFORMATION);
		return 3;  //port invalide
	}
	CloseHandle(m_hCom);

//生成一个串口控件
	if(m_bDataCOMCreated == 0)
	{
		pDoc->m_DataCOM.Create(NULL,0,CRect(0,0,0,0),this,IDC_DATACOM_MSCOMM); //??????
		m_bDataCOMCreated = 1;
	}
	
	if(pDoc->m_DataCOM.GetPortOpen())	//如果串口是打开的,则行关闭串口
		pDoc->m_DataCOM.SetPortOpen(FALSE);
//参数设置
	pDoc->m_DataCOM.SetCommPort(port);  
	pDoc->m_DataCOM.SetInBufferSize(1024); //?????
	pDoc->m_DataCOM.SetOutBufferSize(1024); //?????
	pDoc->m_DataCOM.SetInputLen(0);	//读全部字符
	pDoc->m_DataCOM.SetInputMode(1);  //二进制方式
	pDoc->m_DataCOM.SetRThreshold(1);
	pDoc->m_DataCOM.SetSettings("115200,n,8,1");

	if(!pDoc->m_DataCOM.GetPortOpen())				//如果串口没有打开则打开
		pDoc->m_DataCOM.SetPortOpen(TRUE);			//打开串口
	else
	{
		MessageBox("打开数据端口失败!","错误!",MB_ICONERROR);
		return 1;      //open COM error
	}
	pDoc->m_DataCOM.GetInput();

//	MessageBox("数据端口打开成功","成功",MB_ICONINFORMATION);

	return 0;
}

void CAtmeasureView::OnStart() 
{

	// TODO: Add your command handler code here
	CAtmeasureDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
//	pDoc->Pointpos(11);
//////////////初始化参数///////////
	pDoc->SampPara();
	CheckNum=0;
	CheckNumG=0;
    pDoc->JobOK=true;
    pDoc->sndTempNum=0;
////////////////////打开并设置数据和控制端口//////////////////
	if(m_AlreadyOpen == false)
	{
		int dataport,ctrlport;
		dataport = SetDataCOM(pDoc->CtrlPort);
		ctrlport = SetCtrlCOM(pDoc->DataPort);

		if((dataport==0)&&(ctrlport!=0))
		{
			pDoc->m_DataCOM.SetPortOpen(FALSE);
			return;
		}
		if((dataport!=0)&&(ctrlport==0))
		{
			pDoc->m_CtrlCOM.SetPortOpen(FALSE);
			return;
		}
		if((dataport!=0)&&(ctrlport!=0))
			return;
		m_AlreadyOpen = true;
	}
	else
	{
		MessageBox("请先停止监控","",MB_ICONWARNING);
	}
	
	SetTimer(ID_TIMER,pDoc->SamNormHZ*1000,NULL);
	pDoc->DataCOMClosed = false;
	pDoc->SendTo51();
//	pDoc->Pointpos(12);
}

void CAtmeasureView::OnStop() 
{
	// TODO: Add your command handler code here
	CAtmeasureDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
//	pDoc->Pointpos(21);

	if(m_AlreadyOpen == true)
	{
		KillTimer(ID_TIMER);
		pDoc->DataCOMClosed = true;

		pDoc->m_DataCOM.SetPortOpen(FALSE);
		pDoc->m_CtrlCOM.SetPortOpen(FALSE);
		m_AlreadyOpen = false;
        if(CheckNum==0)
		{
			MessageBox("监控已停止","",MB_ICONWARNING);
		}
		
	}
	else
	{
		MessageBox("监控尚未开始","",MB_ICONWARNING);
	}
//	pDoc->Pointpos(22);
}

void CAtmeasureView::OnCommCtrlcom()
{
	CAtmeasureDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
//    pDoc->Pointpos(41);

	if((CheckNum>=20)||(CheckNumG>=20))
	{
        	OnStop();
			OnStart();
	}

	
	if(pDoc->m_CtrlCOM.GetCommEvent()==2)
	{
		    pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
			pDoc->datacont = 0;
			pDoc->m_CtrlCOM.SetInBufferCount(0); 

	}

	else 
       pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
//     	pDoc->Pointpos(42);
}

void CAtmeasureView::OnCommDatacom()
{
	CAtmeasureDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
//	  pDoc->Pointpos(51);
   if(pDoc->m_DataCOM.GetCommEvent()==2)
		 {			 
	       	Sleep(30);
	       	pDoc->GetData();	//put the data in DataInWithHead[64]
		        
			if(pDoc->CheckData() == false)//check the data in DataInWitHead[64]
			{

⌨️ 快捷键说明

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