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

📄 serialcheckview.cpp

📁 《精通VC++串口通信技术与工程实践》第三版的配套源码。
💻 CPP
字号:
// SerialCheckView.cpp : implementation of the CSerialCheckView class
//

#include "stdafx.h"
#include "SerialCheck.h"

#include "SerialCheckDoc.h"
#include "SerialCheckView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSerialCheckView

IMPLEMENT_DYNCREATE(CSerialCheckView, CFormView)

BEGIN_EVENTSINK_MAP(CSerialCheckView, CFormView)
	ON_EVENT(CSerialCheckView, ID_COMMCTRL, 1, OnCommMscomm, VTS_NONE)
END_EVENTSINK_MAP()

BEGIN_MESSAGE_MAP(CSerialCheckView, CFormView)
	//{{AFX_MSG_MAP(CSerialCheckView)
	ON_BN_CLICKED(IDC_CHANGE, OnChange)
	ON_BN_CLICKED(IDC_AUTO, OnAuto)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSerialCheckView construction/destruction

CSerialCheckView::CSerialCheckView()
	: CFormView(CSerialCheckView::IDD)
{
	//{{AFX_DATA_INIT(CSerialCheckView)
	m_strReceiveChar = _T("");
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	bValid = FALSE;
	N = 0;
}

CSerialCheckView::~CSerialCheckView()
{
}

void CSerialCheckView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSerialCheckView)
	DDX_Control(pDX, IDC_AUTO, m_ctrlAuto);
	DDX_Control(pDX, IDC_CHANGE, m_ctrlChange);
	DDX_Text(pDX, IDC_RESULT, m_strReceiveChar);
	//}}AFX_DATA_MAP
}

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

	return CFormView::PreCreateWindow(cs);
}

void CSerialCheckView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	DWORD style=WS_VISIBLE|WS_CHILD;
	if (!m_Com.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL))
	{
		TRACE0("Failed to create OLE Communications Control\r\n");
	    return; //fail to create  
	}
	
	// TODO: Add extra initialization here
	m_Com.SetCommPort(1); //选择COM1
	m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
	m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
	m_Com.SetRThreshold(1); 
	m_Com.SetInputMode(1);

	m_Com.SetSettings("9600,n,8,1");

	if(!m_Com.GetPortOpen()) //打开串口   
	{
		m_Com.SetPortOpen(TRUE);
	}
	else
		AfxMessageBox("串口1已被占用,请选择其他串口");

}

/////////////////////////////////////////////////////////////////////////////
// CSerialCheckView printing

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

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

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

void CSerialCheckView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CSerialCheckView diagnostics

#ifdef _DEBUG
void CSerialCheckView::AssertValid() const
{
	CFormView::AssertValid();
}

void CSerialCheckView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CSerialCheckView message handlers
//MSComm控件的OnComm事件处理过程。和其他的OnComm处理过程一样,这里也采用分支事 件//方式,图过是接收时间,则显示到接收显示文本框中,这些信息包括本机Modem返回信息,以及远程计算//机传送的数据。
void CSerialCheckView::OnCommMscomm()
{
    int  nEvent;
	
    nEvent = m_Com.GetCommEvent();

	switch(nEvent)
	{
	case 2:  //收到大于RTHresshold个字符
		switch(N)
		{
		case 1:
			OutputResult("bps = 9600, data = 8:");
			break;
		case 2:
			OutputResult("bps = 9600, data = 7:");
			break;
		case 3:
			OutputResult("bps = 9600, data = 6:");
			break;
		case 4:
			OutputResult("bps = 9600, data = 5:");
			break;
		case 5:
			OutputResult("bps = 4800, data = 8:");
			break;
		case 6:
			OutputResult("bps = 4800, data = 7:");
			break;
		case 7:
			OutputResult("bps = 4800, data = 6:");
			break;
		case 8:
			OutputResult("bps = 4800, data = 5:");
			break;
		case 9:
			OutputResult("bps = 2400, data = 8:");
			break;
		case 10:
			OutputResult("bps = 2400, data = 7:");
			break;
		case 11:
			OutputResult("bps = 2400, data = 6:");
			break;
		case 12:
			OutputResult("bps = 2400, data = 5:");
			break;
		case 13:
			OutputResult("bps = 1200, data = 8:");
			break;
		case 14:
			OutputResult("bps = 1200, data = 7:");
			break;
		case 15:
			OutputResult("bps = 1200, data = 6:");
			break;
		case 16:
			OutputResult("bps = 1200, data = 5:");
			break;
		}
		break;
	case 3:  //CTS线状态发生了变化
		break;
	case 4:  //DSR线状态发生了变化
		break;
	case 5:  //CD线状态发生了变化
		break;
	case 6:  //Ring Indicator发生变化
		break;
	}    

	
	
	UpdateData(FALSE);
}

void CSerialCheckView::OutputResult(CString strTemp)
{
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp, str = _T("");

	
	variant_inp = m_Com.GetInput();   //读缓冲区
	safearray_inp = variant_inp;  //VARIANT型变量转换为ColeSafeArray型变量
	len=safearray_inp.GetOneDimSize(); //得到有效数据长度
	for(k=0;k<len;k++)
		safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
	for(k=0;k<len;k++)             //将数组转换为Cstring型变量
	{
		BYTE bt=*(char*)(rxdata+k);      //字符型
							
		strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

		str = str + strtemp;    //加入接收编辑框对应字符串    
	}
		
	m_strReceiveChar = m_strReceiveChar + strTemp + " 输入字符 " + str + "\r\n";
}

void CSerialCheckView::OnChange() 
{
	// TODO: Add your control notification handler code here
	if(m_Com.GetPortOpen()) //打开串口   
		m_Com.SetPortOpen(FALSE);	
	
	m_Com.SetCommPort(1); //选择COM1
	m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
	m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
	m_Com.SetRThreshold(1); 
	m_Com.SetInputMode(1);

	N++;

	switch(N)
	{
	case 1:
		m_Com.SetSettings("9600,n,8,1");
		break;
	case 2:
		m_Com.SetSettings("9600,n,7,1");
		break;
	case 3:
		m_Com.SetSettings("9600,n,6,1");
		break;
	case 4:
		m_Com.SetSettings("9600,n,5,1");
		break;
	case 5:
		m_Com.SetSettings("4800,n,8,1");
		break;
	case 6:
		m_Com.SetSettings("4800,n,7,1");
		break;
	case 7:
		m_Com.SetSettings("4800,n,6,1");
		break;
	case 8:
		m_Com.SetSettings("4800,n,5,1");
		break;
	case 9:
		m_Com.SetSettings("2400,n,8,1");
		break;
	case 10:
		m_Com.SetSettings("2400,n,7,1");
		break;
	case 11:
		m_Com.SetSettings("2400,n,6,1");
		break;
	case 12:
		m_Com.SetSettings("2400,n,5,1");
		break;
	case 13:
		m_Com.SetSettings("1200,n,8,1");
		break;
	case 14:
		m_Com.SetSettings("1200,n,7,1");
		break;
	case 15:
		m_Com.SetSettings("1200,n,6,1");
		break;
	case 16:
		m_Com.SetSettings("1200,n,5,1");
		break;
	case 17:
		N = 0;
		m_strReceiveChar = "";
		break;
	}	

	m_Com.SetPortOpen(TRUE);
	UpdateData(FALSE);
		
	CString strTemp;
	if(N == 0)
		strTemp.Format("人工更改配置");
	else
		strTemp.Format("人工更改(模式%d)", N);
	m_ctrlChange.SetWindowText(strTemp);	
}

void CSerialCheckView::OnAuto() 
{
	// TODO: Add your control notification handler code here
	N = 0;
	bValid = !bValid;
	m_strReceiveChar = "";
	UpdateData(FALSE);
	
	if(bValid)
	{
		m_ctrlAuto.SetWindowText("停止自动");
		SetTimer(1, 5000, NULL);
	}
	else
	{
		m_ctrlAuto.SetWindowText("自动模式(1s)");
		KillTimer(1);
	}		
	
	m_ctrlChange.SetWindowText("人工更改配置");	
}

void CSerialCheckView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_Com.GetPortOpen()) //打开串口   
		m_Com.SetPortOpen(FALSE);	
	
	m_Com.SetCommPort(1); //选择COM1
	m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
	m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
	m_Com.SetRThreshold(1); 
	m_Com.SetInputMode(1);


	N++;	
	switch(N)
	{
	case 1:
		m_Com.SetSettings("9600,n,8,1");
		break;
	case 2:
		m_Com.SetSettings("9600,n,7,1");
		break;
	case 3:
		m_Com.SetSettings("9600,n,6,1");
		break;
	case 4:
		m_Com.SetSettings("9600,n,5,1");
		break;
	case 5:
		m_Com.SetSettings("4800,n,8,1");
		break;
	case 6:
		m_Com.SetSettings("4800,n,7,1");
		break;
	case 7:
		m_Com.SetSettings("4800,n,6,1");
		break;
	case 8:
		m_Com.SetSettings("4800,n,5,1");
		break;
	case 9:
		m_Com.SetSettings("2400,n,8,1");
		break;
	case 10:
		m_Com.SetSettings("2400,n,7,1");
		break;
	case 11:
		m_Com.SetSettings("2400,n,6,1");
		break;
	case 12:
		m_Com.SetSettings("2400,n,5,1");
		break;
	case 13:
		m_Com.SetSettings("1200,n,8,1");
		break;
	case 14:
		m_Com.SetSettings("1200,n,7,1");
		break;
	case 15:
		m_Com.SetSettings("1200,n,6,1");
		break;
	case 16:
		m_Com.SetSettings("1200,n,5,1");
		break;
	case 17:		
		N = 0;
		break;
	}	

	m_Com.SetPortOpen(TRUE);

	CString strTemp;
	strTemp.Format("停止自动(模式%d)", N);
	m_ctrlAuto.SetWindowText(strTemp);

	CFormView::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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