ccontrolview.cpp

来自「MSCOMM控件写的串口通讯程序」· C++ 代码 · 共 288 行

CPP
288
字号
// CControlView.cpp : implementation of the CCControlView class
//

#include "stdafx.h"
#include "CControl.h"

#include "CControlDoc.h"
#include "CControlView.h"
#include "Dialog1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ID_COMMCTRL 1001
/////////////////////////////////////////////////////////////////////////////
// CCControlView

IMPLEMENT_DYNCREATE(CCControlView, CView)

BEGIN_EVENTSINK_MAP(CCControlView,CView)
ON_EVENT(CCControlView,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)
END_EVENTSINK_MAP()

BEGIN_MESSAGE_MAP(CCControlView, CView)
	//{{AFX_MSG_MAP(CCControlView)
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCControlView construction/destruction

CCControlView::CCControlView()
{
	// TODO: add construction code here
	m_Info.nState=1;
}

CCControlView::~CCControlView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCControlView drawing

void CCControlView::OnDraw(CDC* pDC)
{
	CCControlDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc); 
	ChangeDisplay();
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CCControlView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCControlView diagnostics

#ifdef _DEBUG
void CCControlView::AssertValid() const
{
	CView::AssertValid();
}

void CCControlView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CCControlView message handlers

void CCControlView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog1 dlg;
	if(m_Info.nState==0)
	{
		dlg.Col="是否进行合闸操作";
		dlg.State="分闸位置";
	}
	else
	{
		dlg.Col="是否进行分闸操作";
		dlg.State="合闸位置";
	}
	if(dlg.DoModal()==IDOK)
	{
		int Addr=0;
		if(m_Info.nState==1)
		{
			BYTE buff[12]={Addr,00,0x33,Addr,0x33,Addr,Addr,00,0x33,Addr,0x33,Addr};
			CCControlView::OnMsgcommSend(buff);
		}
		else
		{
			BYTE buff[12]={Addr,00,0xcc,Addr,0xcc,Addr,Addr,00,0xcc,Addr,0xcc,Addr};
			CCControlView::OnMsgcommSend(buff);
		}
	}
	CView::OnLButtonDown(nFlags, point);
}

void CCControlView::ChangeDisplay()
{
	CClientDC dc(this);
	if(m_Info.nState==0)
		dc.TextOut(10,10,"分闸位置");
	else
		dc.TextOut(10,10,"合闸位置");
//this->Invalidate();
}

void CCControlView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	m_Com.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,10,10),this,ID_COMMCTRL);
	m_Com.SetCommPort(1);
	m_Com.SetInBufferSize(1024);
	m_Com.SetOutBufferSize(1024);
	if(!m_Com.GetPortOpen())
		m_Com.SetPortOpen(TRUE);
	m_Com.SetInputMode(1);
	m_Com.SetSettings("9600,n,8,1");
	m_Com.SetRThreshold(1);
	m_Com.SetInputLen(0);
	//////////
	m_Com1.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,10,10),this,ID_COMMCTRL);
	m_Com1.SetCommPort(2);
	m_Com1.SetInBufferSize(1024);
	m_Com1.SetOutBufferSize(1024);
	if(!m_Com1.GetPortOpen())
		m_Com1.SetPortOpen(TRUE);
	m_Com1.SetInputMode(1);
	m_Com1.SetSettings("9600,n,8,1");
	m_Com1.SetRThreshold(1);
	m_Com1.SetInputLen(0);
	SetTimer(1,1000,NULL);
}

void CCControlView::OnCommMscomm()
{
	VARIANT vResponse; 
	int k,nEvent;
	char * str;
	nEvent=m_Com.GetCommEvent();
	switch(nEvent)
	{
	case 2:
		k=m_Com.GetInBufferCount();
		if(k>12)//接受到1泰保护单元的信息
		{
			vResponse=m_Com.GetInput(); 
			str=(char *)(unsigned char *)vResponse.parray->pvData; 
			for(int i=0;i<52;i++)
				m_Inbuff[i]=(BYTE)(*(str+i)); 
			DataProcess();
			m_Com.SetInBufferCount(0);
			break;
		}
	case 3:
		break;
	case 4:
		break;
	case 5:
		break;
	case 6:
		break;
	default:break;
	}
}



void CCControlView::OnMsgcommSend(BYTE Outbuff[12])
{
	CByteArray array;
	array.RemoveAll();
	int Count=13;
	array.SetSize(Count);
	for(int i=0;i<Count;i++)
		array.SetAt(i,Outbuff[i]);
	m_Com1.SetOutput(COleVariant(array));
}

void CCControlView::DataProcess()
{
	BYTE lpc;
	int LXNAME=21;
	if((m_Inbuff[0]==0xeb)&&(m_Inbuff[1]==0x90)&&(m_Inbuff[2]==0xeb)&&(m_Inbuff[3]==0x90)
		&&(m_Inbuff[4]==0xeb)&&(m_Inbuff[5]==0x90))//进行报文头校验	
	{
		lpc=Main_LPC(6,50);
		if((m_Inbuff[6]!=0)||(m_Inbuff[7])!=LXNAME) 
			return;
		else
		{
	//		if(lpc != m_Inbuff[57])
	//			return ;
	//		else
			{
				switch(m_Inbuff[8])
				{
				case 0xe0:
					{
						int ZSD,ZSD1,ZSD2;
						/////////////////////////////////////////////
						ZSD=m_Inbuff[12];//处理指示灯信息										 
						ZSD1=ZSD&0X01;
						ZSD2=(ZSD>>1)&0X01; 
						if((ZSD1==1)&&(ZSD2==0)) m_Info.nState=1;
						if((ZSD1==0)&&(ZSD2==1)) m_Info.nState=0;
						if((ZSD1==1)&&(ZSD2==1)) m_Info.nState=2;
						if((ZSD1==0)&&(ZSD2==0)) m_Info.nState=2;
						ChangeDisplay();
					//	this->Invalidate();
					}
				case 0x0e:
					break;
				}
			}
		}
	}
}

BYTE CCControlView::Main_LPC(DWORD i, BYTE Num)
{
	BYTE x,j;
	x=m_Inbuff[i++];
	for(j=0;j<Num;j++)
		x=x^m_Inbuff[i++];
	x=~x;
	return x;
}

void CCControlView::OnTimer(UINT nIDEvent) 
{
	int Addr=0;
	if(m_Info.nState==1)
	{
		BYTE buff[13]={0xEB,0x90,0xEB,0x90,0xEB,0x90,0x00,0x15,0xE0,0x00,0x00,0x00,0xAA};
		CCControlView::OnMsgcommSend(buff);
	}
	else
	{
		BYTE buff[13]={0xEB,0x90,0xEB,0x90,0xEB,0x90,0x00,0x15,0xE0,0x00,0x00,0x00,0xA9};
		CCControlView::OnMsgcommSend(buff);
	}
	CView::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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