参考某度文库,补全作者未完全展示的部分操作,并略去部分没必要的操作
开发工具VS2013,2017后不支持MFC类型库
打开VS编辑器,文件-新建-项目-MFC应用程序-基于对话框 Dlg
打开资源对话框,添加相关资源文件
右击项目名或者类名,打开类向导,增加成员变量(类名CCommDemoDlg),Combox下拉框添加控件,Edit编辑框添加值变量
添加串口控件,右击对话框,插入Active控件,找到Microsoft Communicate Control,version6.0,“确定”,就会看到类似"电话"图标
右击"电话"图标,添加变量m_mscomm,伴随生成mscomm1.cpp和mscomm1.h两文件,确定
点击菜单栏-工具-选择工具箱项X-COM组件,添加TeeChart Pro Activex control v8组件,需要TeeChart8.ocx组件,插件注册方法–百度
TeeChart8.ocx 提取码:y8vq
添加完成后,工具箱栏会提供一个新的控件
拖拽此图标到对话,然后打开类向导-添加类-类型库中的mfc类,并添加相关5个类文件,头文件中会增加这几个文件
将新增的头文件加入CommDemoDlg.cpp头部
双击TeeChart,添加曲线Add Serial,添加fastline模板
标题命名在Title中,初值设置在Date中,ASXIS设置XY轴数据,最大值最小值left为Y,bottom为X
添加完成后,拉大对话框尺寸,并适当调整TeeChart宽度,即可出现下图
最后为相关控件添加实现函数,双击下拉框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);
}
右击串口控件,“电话”,增加事件处理程序
右击TeeChart控件,添加变量m_chart
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进制数据到此串口,即可出现数据波形。
串口测试软件 提取码:xwpf
完整项目