2024年4月5日发(作者:)

基于vs2010-mfc简易串口数据波形显示软件(入门篇)

软件版本 vs2010旗舰版

文件—新建—项目

选择基本对话框 语言—美国英语,若选择中国汉语,可能这版本没破解好,会有些问题。

后面就一直下一步,直到完成。

在右边工具箱中,添加下面需要用到的控件。如下图

右击类向导---项目com 类名CcomDlg。

点击成员变量,分别给他们添加变量名。添加完如下图:

添加串口控件。右击插入Active控件(X),找到如下确定。界面出现串口控件(小电话一样

的东东)

点击串口控件(小电话)右键添加变量,输入变量名m_mscomm ,同时下方出现mscomm1.h

和,点击确定,坐标目录生成该两个文件

点击菜单栏工具---选择工具箱项(X)--点击COM组件,浏览找到,可由网上

下载。

然后添加如下

之后再工具箱中最下面便可看到该控件

接下来拉出图形界面。

进入类向导,点击右上角添加类(C)—>类型库中的MFC类(T)…

添加这5个类

这里有很多这里有很多这里有很多

文件中添加头文件

#include "CTChart.h"

#include "CAxis.h"

#include "CAxes.h"

#include "CScroll.h"

#include "CSeries.h"

双击teechart,添加曲线Add

这里模板很丰富,这里我们选择FastLine

标题命名、初值点设置Data中、左轴底轴显示设置在Axis中,以及其他功能

到此,基本框架已经搭好了

后面添加程序

双击打开串口按钮

添加代码如下:

void CcomDlg::OnBnClickedButtonOpen()

{

}

// TODO: 在此添加控件通知处理程序代码

if( !m__PortOpen())

{

m__PortOpen(true);

SetDlgItemText(IDC_BUTTON_OPEN,_T("关闭串口"));

AfxMessageBox(_T("串口打开成功"));

}

else

{

m__PortOpen(FALSE);

SetDlgItemText(IDC_BUTTON_OPEN,_T("打开串口"));

}

双击发送按钮。添加代码如下:

void CCommTestDlg::OnBnClickedButtonSend()

{

// TODO: 在此添加控件通知处理程序代码

UpdateData(true); //读取编辑框内容

m__Output(COleVariant(m_EditSend));//发送数据

UpdateData(false); //更新编辑框内容

}

双击清除接收区按键。添加代码:

void CCommTestDlg::OnBnClickedButtonClear()

{

// TODO: 在此添加控件通知处理程序代码

m_();//清除接收对话框中的数据

UpdateData(FALSE);

}

双击串口combo box框,添加代码如下:

void CcomDlg::OnCbnSelchangeComboCom()

{

// TODO: 在此添加控件通知处理程序代码

if(m__PortOpen())

{

m__PortOpen(FALSE);

}

m__CommPort( m_Sel()+1 );

}

UpdateData(FALSE); //更新编辑框内容

双击波特率combo box框 添加代码如下

void CcomDlg::OnCbnSelchangeComboBandrate()

{

}

// TODO: 在此添加控件通知处理程序代码

CString temp;

int i=m_Sel();

int speed;

switch(i)

{

case 0:

speed=2400;

break;

case 1:

speed=4800;

break;

case 2:

speed=9600;

break;

case 3:

speed=19200;

break;

case 4:

speed=38400;

break;

}

(_T("%d,n,8,1"),speed);

m__Settings(temp);

右击串口控件,刚才那“电话“一样的东西—添加消息处理函数

添加编辑----生成串口消息处理函数,添加代码

//注意:这里只做了简单处理,接收区只是16进制代码

void CcomDlg::OnCommMscomm1()

{

// TODO: 在此处添加消息处理程序代码

VARIANT variant_inp;

double chartdata;

COleSafeArray safearray_inp;

long len,k;

byte rxdata[1024]; //设置BYTE 数组

CString strtemp;

if(m__CommEvent()==2) //值为2 表示接收缓冲区内有字符

{

variant_inp=m__Input(); //读缓冲区消息

safearray_inp=variant_inp; ///变量转换

len=safearray_DimSize(); //得到有效的数据长度

for(k=0;k

{

safearray_ment(&k,rxdata+k);

}

for(k=0;k

{

(_T(" %x "),*(rxdata+k)); //数据之间增加1或2个空格

m_EditReceive+=strtemp;

chartdata =_ttof(strtemp);

CSeries(m_(0)).Add(chartdata,_T(""),1);

CAxes chartaxis=(CAxes)m__Axis();

CAxis chartaxisbottom=(CAxis)_Bottom();

(1,TRUE);

}

}

UpdateData(FALSE); //更新编辑框内容

}

在文件中注释点下面一行

在文件的

BOOL CcomDlg::OnInitDialog()中

添加初始化代码

m__CommPort(1); //选择COM1

m__Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位

m__InBufferSize(1024); //接收缓冲区

m__OutBufferSize(1024);//发送缓冲区

m__InputLen(0);//设置当前接收区数据长度为0,表示全部读取

m__InputMode(1);//以二进制方式读写数据

m__RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的

OnComm事件

m__Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位

//chart初值 随意

CSeries(m_(0)).Add(68,_T(""),1);

编译发现出错

无法打开预编译头文件:“”: No such file or directory

解决方法

右键——属性,预编译头选“创建(Y/c)”.点击应用—确定

再次编译(Crl+F7)

点击调试运行

为了调试是否成功,这里连接了一个stm32开发板验证。Stm32串口接收程序中,每次中断

分别循环发送十六进制37 35 39 ’a’

调试助手中接收 37 35 39 61

OK,到此结束,一个简易的串口接收数据的上位机显示软件便完成,可以在此基础上修改

自己所需要的形式!

By DragonF

2014/8/15