MFC简易串口数据波形显示

MFC简易串口数据波形显示

参考某度文库,补全作者未完全展示的部分操作,并略去部分没必要的操作
开发工具VS2013,2017后不支持MFC类型库

打开VS编辑器,文件-新建-项目-MFC应用程序-基于对话框 Dlg
MFC简易串口数据波形显示_第1张图片
MFC简易串口数据波形显示_第2张图片
打开资源对话框,添加相关资源文件
MFC简易串口数据波形显示_第3张图片

右击项目名或者类名,打开类向导,增加成员变量(类名CCommDemoDlg),Combox下拉框添加控件,Edit编辑框添加值变量
MFC简易串口数据波形显示_第4张图片
MFC简易串口数据波形显示_第5张图片
MFC简易串口数据波形显示_第6张图片

添加串口控件,右击对话框,插入Active控件,找到Microsoft Communicate Control,version6.0,“确定”,就会看到类似"电话"图标
MFC简易串口数据波形显示_第7张图片
MFC简易串口数据波形显示_第8张图片
右击"电话"图标,添加变量m_mscomm,伴随生成mscomm1.cpp和mscomm1.h两文件,确定MFC简易串口数据波形显示_第9张图片
点击菜单栏-工具-选择工具箱项X-COM组件,添加TeeChart Pro Activex control v8组件,需要TeeChart8.ocx组件,插件注册方法–百度
TeeChart8.ocx 提取码:y8vq
MFC简易串口数据波形显示_第10张图片
添加完成后,工具箱栏会提供一个新的控件
MFC简易串口数据波形显示_第11张图片
拖拽此图标到对话,然后打开类向导-添加类-类型库中的mfc类,并添加相关5个类文件,头文件中会增加这几个文件
MFC简易串口数据波形显示_第12张图片
MFC简易串口数据波形显示_第13张图片
MFC简易串口数据波形显示_第14张图片
MFC简易串口数据波形显示_第15张图片
将新增的头文件加入CommDemoDlg.cpp头部
MFC简易串口数据波形显示_第16张图片
双击TeeChart,添加曲线Add Serial,添加fastline模板
MFC简易串口数据波形显示_第17张图片
标题命名在Title中,初值设置在Date中,ASXIS设置XY轴数据,最大值最小值left为Y,bottom为X
MFC简易串口数据波形显示_第18张图片
MFC简易串口数据波形显示_第19张图片
MFC简易串口数据波形显示_第20张图片
添加完成后,拉大对话框尺寸,并适当调整TeeChart宽度,即可出现下图
MFC简易串口数据波形显示_第21张图片
最后为相关控件添加实现函数,双击下拉框Combox、button按钮,添加处理函数

void CCommDemoDlg::OnBnClickedBtnOpen()
{
	// TODO:  在此添加控件通知处理程序代码
	if (!m_mscomm.get_PortOpen())
	{
		m_mscomm.put_PortOpen(true);
		SetDlgItemText(IDC_BTN_OPEN, _T("关闭串口"));
		AfxMessageBox(_T("串口打开成功"));
	}
	else
	{
		m_mscomm.put_PortOpen(FALSE);
		SetDlgItemText(IDC_BTN_OPEN, _T("打开串口"));
	}
}


void CCommDemoDlg::OnCbnSelchangeComboComm()
{
	// TODO:  在此添加控件通知处理程序代码
	if (m_mscomm.get_PortOpen())
	{
		m_mscomm.put_PortOpen(FALSE);
	}
	m_mscomm.put_CommPort(m_CommSel.GetCurSel() + 1);
	UpdateData(FALSE);
}


void CCommDemoDlg::OnCbnSelchangeComboBard()
{
	// TODO:  在此添加控件通知处理程序代码
	CString csTemp;
	int i = m_BardSel.GetCurSel();
	int nSpeed;
	switch (i)
	{
	case 0:
		nSpeed = 2400;
		break;
	case 1:
		nSpeed = 4800;
		break;
	case 2:
		nSpeed = 9600;
		break;
	case 3:
		nSpeed = 19200;
		break;
	case 4:
		nSpeed = 38400;
		break;
	default:
		nSpeed = 9600;
		break;
	}
	csTemp.Format(_T("%d, n, 8, 1"), nSpeed);
	m_mscomm.put_Settings(csTemp);
}

Combox下拉框控件Data设置
MFC简易串口数据波形显示_第22张图片

右击串口控件,“电话”,增加事件处理程序
MFC简易串口数据波形显示_第23张图片
右击TeeChart控件,添加变量m_chart
MFC简易串口数据波形显示_第24张图片

void CCommDemoDlg::OnCommMscomm1()
{
	// TODO:  在此处添加消息处理程序代码
	VARIANT variant_inp;
	double chartdata;
	COleSafeArray safearray_inp;
	long nLen, k;
	byte rxdata[1024];
	CString strtemp;
	if (m_mscomm.get_CommEvent() == 2) //值为2,表示接收缓冲区内有字符
	{
		variant_inp = m_mscomm.get_Input();  //读取缓冲区消息
		safearray_inp = variant_inp;		//变量转换
		nLen = safearray_inp.GetOneDimSize(); //得到有效数据长度
		for (k = 0; k < nLen; k++)
		{
			safearray_inp.GetElement(&k, rxdata + k);
		}
		for (k = 0; k < nLen; k++)
		{
			strtemp.Format(_T(" %x "), *(rxdata + k));
			m_EditRecv += strtemp;
			chartdata = _ttof(strtemp);
			CSeries(m_chart.Series(0)).Add(chartdata, _T(""), 1);
			CAxes chartaxis = (CAxes)m_chart.get_Axis();
			CAxis chartaxisbottom = chartaxis.get_Bottom();
			chartaxisbottom.Scroll(1, TRUE);
		}
	}
	UpdateData(false);  //编辑框内容更新
}

初始化相关数据

BOOL CCommDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	ShowWindow(SW_MINIMIZE);

	// TODO:  在此添加额外的初始化代码
	m_mscomm.put_CommPort(2);
	m_mscomm.put_Settings(_T("9600, n, 8, 1"));
	m_mscomm.put_InBufferSize(1024);
	m_mscomm.put_OutBufferSize(1024);
	m_mscomm.put_InputLen(0);
	m_mscomm.put_InputMode(1);
	m_mscomm.put_RThreshold(1);
	m_mscomm.put_Settings(_T("9600, n, 8, 1"));
	CSeries(m_chart.Series(0)).Add(68, _T(""), 1);   //随意初值

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

屏蔽CommDemoDlg构造函数中的m_char初值设置

CCommDemoDlg::CCommDemoDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCommDemoDlg::IDD, pParent)
	, m_EditRecv(_T(""))
	//, m_chart(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

到此结束,测试可用虚拟串口软件发送16进制数据到此串口,即可出现数据波形。MFC简易串口数据波形显示_第25张图片
串口测试软件 提取码:xwpf

完整项目

你可能感兴趣的:(IT,template,class,mfc)