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

📄 exa06view.cpp

📁 比较经典的串口开发原码
💻 CPP
字号:
// exa06View.cpp : implementation of the CExa06View class
//

#include "stdafx.h"
#include "exa06.h"

#include "exa06Doc.h"
#include "exa06View.h"
#include "COMctrl.h"

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

extern CEvent InsertCompelte;
extern bool ThreadWorking;
#define ID_TIMER 1


IMPLEMENT_DYNCREATE(CExa06View, CScrollView)

BEGIN_MESSAGE_MAP(CExa06View, CScrollView)
	//{{AFX_MSG_MAP(CExa06View)
	ON_COMMAND(ID_START, OnStart)
	ON_COMMAND(ID_STOP, OnStop)
	ON_WM_TIMER()
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	ON_COMMAND(ID_DATASEARCH, OnDatasearch)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CExa06View, CScrollView)
    //{{AFX_EVENTSINK_MAP(CExa06View)
	ON_EVENT(CExa06View, IDC_DATACOM_MSCOMM, 1 /* OnComm */, OnCommDatacom, VTS_NONE)
	ON_EVENT(CExa06View, IDC_CTRLCOM_MSCOMM, 1 /* OnComm */, OnCommCtrlcom, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()


CExa06View::CExa06View()
{
	// TODO: add construction code here
	m_bCtrlCOMCreated = 0;
	m_bDataCOMCreated = 0;
	m_AlreadyOpen     = false;

	vScrollPos = 0;
	hScrollPos = 0;

}

CExa06View::~CExa06View()
{
}

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

	return CScrollView::PreCreateWindow(cs);
}

void CExa06View::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

#ifdef _DEBUG
void CExa06View::AssertValid() const
{
	CScrollView::AssertValid();
}

void CExa06View::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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



//////////////////////////////////////////////////////////////////////////////////////
//////Drawing
void CExa06View::OnDraw(CDC* pDC)
{
	CExa06Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(pDoc->m_backgroundset == 1)
	{
		BITMAP bm;
		CBitmap *pBitmap = &pDoc->m_background;
		pBitmap->GetBitmap(&bm);

		pDoc->m_BackgroundSize.cx = bm.bmWidth;
		pDoc->m_BackgroundSize.cx = bm.bmHeight;

		SetScrollSizes(MM_TEXT,CSize(bm.bmWidth,bm.bmHeight));
				
		pDC->SetMapMode(MM_TEXT);			
		OnPrepareDC(pDC);
		
		CDC memDC;
		memDC.CreateCompatibleDC (pDC);
		CBitmap* pOldBitmap = memDC.SelectObject (pBitmap);
		
		pDC->BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
		memDC.SelectObject (pOldBitmap);

		
	//加入点的位置,显示
/*		CString str;
		structbuffer temp[4];
		int i = 1;
	pDoc->Lock.Lock();
		if(pDoc->ListBuffer.GetCount()>=4)
		{
			POSITION pos = pDoc->ListBuffer.GetTailPosition();
			if(!pDoc->ListBuffer.IsEmpty())
			{
				temp[0] = pDoc->ListBuffer.GetTail();
				while(i<4)
				{
					temp[i] = pDoc->ListBuffer.GetPrev(pos);
					i++;
				}
			}
			else
			{
				for(i=0;i<4;i++)
				{
					temp[i].CurChannel = i;
					for(int j=0;j<pDoc->PointPerChannel;j++)
					{
						temp[i].buffer[j] = 0;

					}
				}
			}
	pDoc->Lock.Unlock();
*/		CString str;
		pDoc->drawLock.Lock();
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<pDoc->PointPerChannel;j++)
				{	
					
					str.Format("T:%.1f",pDoc->tempdraw[i].buffer[j]);
					if(pDoc->tempdraw[i].alarm ==1)
						pDC->SetTextColor(RGB(255,0,0));
					pDC->TextOut(pDoc->PointPos[pDoc->tempdraw[i].CurChannel*pDoc->PointPerChannel+j].x,
						pDoc->PointPos[pDoc->tempdraw[i].CurChannel*pDoc->PointPerChannel+j].y,
						str);
				}
			}
		pDoc->drawLock.Unlock();
	
	//在上面加入点的位置盒显示
	
	}

	
}

///////////////////////about COM: setting , send and receive/////////////////////
int CExa06View::SetCtrlCOM(CString str)
{
	CExa06Doc* 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 CExa06View::SetDataCOM(CString str)
{
	CExa06Doc* 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;
}


//when data comes , windows will call this function
void CExa06View::OnCommDatacom()
{
	CExa06Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(pDoc->m_DataCOM.GetCommEvent()==2)
	{

		Sleep(50);
		pDoc->GetData();	//put the data in DataInWithHead[64]
		if(pDoc->CheckData() == false)//check the data in DataInWitHead[64]
		{
			AfxMessageBox("校验和错误");
			pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
			return ;
		}
		if(pDoc->AddToDataList() != 0)
		{
			AfxMessageBox("串口数据错误");
			pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
			return;
		}

		if(pDoc->datacont<20)
		{
			pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
			Sleep(30);
			pDoc->datacont++;
		}
		else
		{
			pDoc->SendTo51();
//AfxMessageBox("after com data");
		}
	}
}

void CExa06View::OnCommCtrlcom()
{
	CExa06Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(pDoc->m_CtrlCOM.GetCommEvent()==2)
	{
//AfxMessageBox("in com ctrl");
		if(pDoc->ctrlcont<=4)
		{
			pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
			pDoc->ctrlcont++;
			pDoc->datacont = 0;
			Invalidate();
		}
		else
		{
			Invalidate();
			InsertCompelte.SetEvent();	
		}
	}
}
////////////////////////////STARTING SYSTEM////////////////////////////
void CExa06View::OnStart() 
{
	CExa06Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//TODO HERE
//打开并设置数据和控制端口
	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;
	ThreadWorking = true;

	AfxBeginThread((AFX_THREADPROC)InsertDB,pDoc);
	pDoc->SendTo51();
	

}

/////////////////////////////SYSTEM STOPPED//////////////////////////////////
void CExa06View::OnStop() 
{
	CExa06Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

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

		pDoc->m_DataCOM.SetPortOpen(FALSE);
		pDoc->m_CtrlCOM.SetPortOpen(FALSE);
		m_AlreadyOpen = false;

		MessageBox("监控已停止","",MB_ICONWARNING);
	}
	else
	{
		MessageBox("监控尚未开始","",MB_ICONWARNING);
	}

}



void CExa06View::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CExa06Doc* pDoc = GetDocument();

	pDoc->SendTo51();
	pDoc->ctrlcont = 0;
//	AfxMessageBox("in ontime");
	CScrollView::OnTimer(nIDEvent);
}

void CExa06View::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	if(nSBCode == SB_THUMBPOSITION || nSBCode == SB_THUMBTRACK)
	vScrollPos = nPos;

	CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CExa06View::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	if(nSBCode == SB_THUMBPOSITION || nSBCode == SB_THUMBTRACK)
	hScrollPos = nPos;

	CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CExa06View::OnDatasearch() 
{
	// TODO: Add your command handler code here
	WinExec("odbc1.exe",SW_SHOWMAXIMIZED);
}

⌨️ 快捷键说明

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