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


发布评论