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

📄 recvview.cpp

📁 一个VC++编写的串口通信程序
💻 CPP
字号:
// RecvView.cpp : implementation file
//

#include "stdafx.h"
#include "ComDbg.h"
#include "RecvView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CRecvView

IMPLEMENT_DYNCREATE(CRecvView, CEditView)

BEGIN_MESSAGE_MAP(CRecvView, CEditView)
	//{{AFX_MSG_MAP(CRecvView)
	ON_WM_CHAR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CRecvView::CRecvView()
{
	m_pDoc		=NULL;
	m_pedt		=NULL;
	m_hThread	=NULL;
	m_nbpl		=8;
	m_ptext		=NULL;
	m_ptext=new char[TBUF];

	LOGFONT	lf={0};
	lf.lfCharSet=GB2312_CHARSET;//134
	lf.lfOutPrecision=3;
	lf.lfClipPrecision=2;
	lf.lfQuality=1;
	lf.lfPitchAndFamily=2;
	lstrcpy(lf.lfFaceName,_T("宋体"));
	lf.lfHeight=-17;
	lf.lfWeight=FW_REGULAR;
	m_font.CreateFontIndirect(&lf);
}

CRecvView::~CRecvView()
{
	if(m_ptext != NULL)
		delete [] m_ptext;
}

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

	return CEditView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CRecvView drawing

void CRecvView::OnDraw(CDC* pDC){}

/////////////////////////////////////////////////////////////////////////////
// CRecvView diagnostics

#ifdef _DEBUG
void CRecvView::AssertValid() const
{
	CEditView::AssertValid();
}

void CRecvView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}
CComDbgDoc* CRecvView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CComDbgDoc)));
	return (CComDbgDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CRecvView message handlers

void CRecvView::OnInitialUpdate() 
{
	CEditView::OnInitialUpdate();
	m_pDoc=GetDocument();
	m_pedt=&GetEditCtrl();
	SetFont(&m_font);
//	m_pedt->SetReadOnly(TRUE);

}
void CRecvView::Clear()
{
	m_pedt->SetWindowText(_T(""));
}

void CRecvView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar == 13)
	{
		CEditView::OnChar(nChar, nRepCnt, nFlags);
	}
}

DWORD WINAPI CRecvView::RecvThread(LPVOID lpParam)
{
	CRecvView*	pCls=(CRecvView*)lpParam;
	ASSERT(pCls != NULL);
	pCls->m_evnStop.ResetEvent();
	DWORD	dwWait=0;
	while(TRUE)
	{
		dwWait=::WaitForSingleObject(pCls->m_evnStop,5000);
		if(dwWait == WAIT_OBJECT_0)		break;
		pCls->Recv();
	}
	return 0;
}

BOOL CRecvView::StartRecv()
{
	StopRecv();
	DWORD	dwID=0;
	m_hThread=CreateThread(NULL,0,RecvThread,this,0,&dwID);
	TRACE("ProcThread 0x%X Created\n",dwID);
	return (m_hThread != NULL);
}

void CRecvView::StopRecv()
{
	if(m_hThread == NULL)	return;
	m_evnStop.SetEvent();
	DWORD	dwWait=::WaitForSingleObject(m_hThread,15000);
	if(dwWait != WAIT_OBJECT_0)
		::TerminateThread(m_hThread,-1);
	m_hThread=NULL;
}

void CRecvView::Recv()
{
	BYTE	buf[RBUF]={0};
	BYTE*	p=buf;
	for(int	n=0;n<RBUF;n++)
	{
		if(!m_pDoc->m_com.Recv(p,1))	break;
		p++;
	}
	n=p-buf;
	if(n>0)
	{
		char	szt[8]={0};
		char	endl[3]={0x0d,0x0a,0x00};
		if(m_ptext == NULL)
		{
			m_pedt->SetWindowText(_T("内存不够!"));
			return;
		}
		memset(m_ptext,0,TBUF);
		m_pedt->GetWindowText(m_ptext,TBUF-1);
		memset(m_szl,0,sizeof(m_szl));
		char*	pszl=m_szl;
		int	idx=m_pedt->GetLineCount()-1;
		int	ilen=m_pedt->GetLine(idx,pszl,LBUF-1);
		if(ilen%BPB)	while(*pszl == TEXT(' '))pszl++;
		int it=m_nbpl-lstrlen(pszl)/BPB;
		if(it==m_nbpl)	it=0;
		int	nl=(n-it)/m_nbpl;
		if((n-it)%m_nbpl)	nl++;
		if(it>0)			nl++;
		idx=0;
		it=lstrlen(pszl)/BPB;
		for(int il=0;il<nl && idx<n;il++)
		{
			for(;it<m_nbpl && idx<n;it++)
			{
				sprintf(szt,_T("0x%02X "),buf[idx]);
				lstrcat(m_ptext,szt);
				if(it == m_nbpl-1)
					lstrcat(m_ptext,endl);
				idx++;
			}
			it=0;
		}
		m_pedt->SetWindowText(m_ptext);
	}
}

⌨️ 快捷键说明

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