串口温度数据采集并实时显示.docx

上传人:b****5 文档编号:11879441 上传时间:2023-04-08 格式:DOCX 页数:13 大小:82.59KB
下载 相关 举报
串口温度数据采集并实时显示.docx_第1页
第1页 / 共13页
串口温度数据采集并实时显示.docx_第2页
第2页 / 共13页
串口温度数据采集并实时显示.docx_第3页
第3页 / 共13页
串口温度数据采集并实时显示.docx_第4页
第4页 / 共13页
串口温度数据采集并实时显示.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

串口温度数据采集并实时显示.docx

《串口温度数据采集并实时显示.docx》由会员分享,可在线阅读,更多相关《串口温度数据采集并实时显示.docx(13页珍藏版)》请在冰豆网上搜索。

串口温度数据采集并实时显示.docx

串口温度数据采集并实时显示

 

串口温度数据采集并实时显示(上位机部分)

姓名:

[请输入作者]

学号:

[请输入学号]

指导教师:

[请输入指导教师]

2018年8月26日

1、原理

读串口数据的原理是,只要当有数据向串口发数据来时,计算机就会自动将其数据写到一个特定的缓冲区,我们只要写程序去读那个特定的缓冲区就可以了.

有数据向串口发过来时,程序可以将数据接收到,接收的数据是字符型的,那么将数据转化为数字型的,再将这个数据的大小作为画图的某一个点的纵坐标,横坐标为数据的序号.将这些点用线连起来就是一个曲线图了,这个就是图形显示基本原理.

查看原来的数据的原理也是这样的,不同的地方就是,数据是从文件中来,同样的也是将多个数据分成一个一个的,然后这一个数据的大小就是画图的某一个点的纵坐标,横坐标同样为数据的序号,再将这些点用线连起来就是曲线图.

图形能移动的原理,是我们首先改变的只是数据,图形并没有变,但图形的形式是由这些数据来确定的,当数据发生变化后,我们通过刷新显示区来变化的.

 

二、程序流程

 

 

 

3、串口程序设计

///////////////文件commDlg.cpp////////////////

//一个类,对话框类,本程序使用的是对话框形式,这个类是在VC用MFC自动生成的,其中包括了对话框程序应有的一些方法

classCAboutDlg:

publicCDialog

{

};

/********************以下的个方法也是VC的MFC的对话框程序固有的,也是MFC自动生成的**************/

CAboutDlg:

:

CAboutDlg():

CDialog(CAboutDlg:

:

IDD)

{

}

voidCAboutDlg:

:

DoDataExchange(CDataExchange*pDX)

{

}

BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)

END_MESSAGE_MAP()

CCommDlg:

:

CCommDlg(CWnd*pParent/*=NULL*/):

CDialog(CCommDlg:

:

IDD,pParent)

{

}

voidCCommDlg:

:

DoDataExchange(CDataExchange*pDX)

{

}

//下面这个包括的是界面中的组件

BEGIN_MESSAGE_MAP(CCommDlg,CDialog)

END_MESSAGE_MAP()

//CCommDlgmessagehandlers

BOOLCCommDlg:

:

OnInitDialog()

{

}

voidCCommDlg:

:

OnSysCommand(UINTnID,LPARAMlParam)

{

}

//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdragstheminimizedwindow.

HCURSORCCommDlg:

:

OnQueryDragIcon()

{

}

BEGIN_EVENTSINK_MAP(CCommDlg,CDialog)

END_EVENTSINK_MAP()

/********************以上的个方法也是VC的MFC的对话框程序固有的,也是MFC自动生成的**************/

/********************我在做这个程序时以上的程序并没有手动修改*******************************/

 

//画图函数

//算法:

运用LineTo函数把120个点连成折线

voidCCommDlg:

:

OnPaint()

{

}

//对串口数据的处理,包括接收,保存等

voidCCommDlg:

:

OnComm()

{

}

//开串口程序

voidCCommDlg:

:

OnButton1()

{

}

//清除编辑框内容程序

voidCCommDlg:

:

OnButton2()

{

}

//选择那一个串口程序

voidCCommDlg:

:

OnComselect()

{

}

//选择波特率

voidCCommDlg:

:

OnComspeed()

{

}

//停止/继续程序

voidCCommDlg:

:

OnStoprecv()

{

}

//对数据显示前的处理:

将新数年据加到左边,原来的右移一位

voidCCommDlg:

:

Display()

{

}

//以下四个函数是查看原来数据的程序

//按钮《程序

voidCCommDlg:

:

OnButton4()

{

}

//按钮》程序

voidCCommDlg:

:

OnButton5()

{

}

//按钮<程序

voidCCommDlg:

:

OnButton6()

{

}

//按钮>程序

voidCCommDlg:

:

OnButton7()

{

}

//此函数用来查看最后一屏数据

voidCCommDlg:

:

OnButton8()

{

}

 

对于其它的文件中的程序我没有手动修改,均为MFC自动生成,我在这就不作详细介绍了.

共有4个程序文件,5个头文件

comm.cpp

commDlg.cpp

mscomm.cpp

StdAfx.cpp

comm.h

commDlg.h

mscomm.h

Resource.h

StdAfs.h

┏━━━━━━━━━━━━━━━━━━━━━┓

┃源码爱好者┃

┣━━━━━━━━━━━━━━━━━━━━━┫

┃┃

┃提供源码发布与下载┃

┃┃

┃┃

┃┃

┃互助、分享、提高┃

┗━━━━━━━━━━━━━━━━━━━━━┛

田远驰t.yc@

4、数据采集实时显示程序设计

1、串口控件使用说明

本程序使用VC6.0的通用串口控件MSCOMM32.OCX来对发送到串口的数据进行采集处理。

主要使用方法

串口设置:

m_Comm.SetSettings(“波特率,校验方式,数据位数,停止位数”)

取串口数据:

m_Comm.GetInput()

你只首先要确定一个mscomm32.ocx控件在system目录下并且该控件已经被windows注册,本程序才能正常运行。

 

2、串口数据的获取

if(m_Comm.GetCommEvent()==2)//判断接收缓冲区内有无数据

{

m_input1=m_Comm.GetInput();//读取缓冲区内的数据

…………

m_input2.GetOneDimSize();//确定数据长度

m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

由于直接获取的数据为VARIANT型数据,我们再通过数据类型转换来变为我们所要的数据类型INT和CString型。

 

3、整数位与小数位的处理

为了提高精度,对数据采用两位整数,一位小数年的方式,在发送数据时,最前一个字节为FF起始位,接着的一个字节为整数部分,再接着发一个字节的数据为小数部分。

取数算法如下:

BYTEa=*(char*)(data+i)

BYTEb=*(char*)(data+(++i))

floatc=(float)a+(float)(b%10)/10

 

4、画图原理

我画图使用的是画直线的方式(LineTo()),先定义一个全局变量用来保存采集的数据值,在画图函数OnPaint()中用这个全局变量来作为纵坐标,等分的120个点作为横坐标,那么就有120个点,最后用直线将这120个点连接起来就组成了一个完整的曲线图。

只要当全局变量中的数值发生变化后就使用函数this->Invalidate()强制重载OnPaint()函数,那么数据图就可以动起来了。

OnPaint()画图函数如下:

voidCCommDlg:

:

Display()

{

if(NextTime<=600&&stop==FALSE)

{

LineHight[NextTime/5]=LineHight[121];//中保存的是最新采集的一个数据

}

else

{

for(inti=0;i<120;i++)

{

LineHight[i]=LineHight[i+1];

}

LineHight[120]=LineHight[121];

}

NextTime=NextTime+5;

this->Invalidate();

return;

}

 

5、查看以前的数据

查看以前的数据的方法是,将数据从文件中取出并将每一个数据都付给那一个全局变量,最后同样用this->Invalidate()就能显示以前的数据了。

具体算法见commDlg.cpp文件中的OnButton4()和OnButton5()函数。

按秒移动查看以前数据算法见OnButton6()和OnButton7()。

voidCCommDlg:

:

OnButton7()

{

if(stop==FALSE)

{

gogo=NextTime;

DTemp=m_ReceiveData;

for(inti=0;i<120;i++)LHTemp[i]=LineHight[i];

}

stop=TRUE;//关闭接收数据,使显示区和数据区用来为显示原来数据用

if(NextTime==0)NextTime=595;

NextTime=NextTime-595;

SetDlgItemText(IDC_STOPRECV,"继续显示");

//先取出文件中的数据,放入一个数组中

CStdioFilefile;

if(file.Open(FilePath,CFile:

:

modeRead))

{

CStringstr;

CStringinstr;

CStringoutstr;

CStringsss;

inti;

while(file.ReadString(str))//逐行查询,至到文件尾

{

instr+=str;

}

if(instr.GetLength()>=600&&NextTime>instr.GetLength()-600)NextTime=instr.GetLength()-600;

for(i=0;i<120;i++)//取出起点后的120个数据

{

sss=instr[NextTime];

sss+=instr[NextTime+1];

outstr+=sss+instr[NextTime+2]+instr[NextTime+3]+"";

LineHight[i]=atoi(sss);

NextTime=NextTime+5;

}

m_ReceiveData=outstr;

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

this->Invalidate();//更新图相

}

}

在移动数据以前要对当前显示的数据进行保存:

gogo=NextTime;

DTemp=m_ReceiveData;

for(inti=0;i<120;i++)LHTemp[i]=LineHight[i];

以便在继续接收时能接着原来的。

 

6、数据保存方式

对采集的数据采用文本方式保存于一文件中,保存格式为,第120数据保存一次,数据采用推算法来确定时间。

如:

08.933.508.865.409.809.3……

程序算法为:

if(file.Open(FilePath,CFile:

:

modeCreate|CFile:

:

modeReadWrite))

{

file.Write(m_ReceiveData,600);//写入120个数据

file.Close();

}

完整算法见:

OnComm()

 

7、通用性

为了提高程序的通用性,串口的波特率,串口号都采用下拉选择的方式,在使用中可跟据情况选择。

┏━━━━━━━━━━━━━━━━━━━━━┓

┃源码爱好者┃

┣━━━━━━━━━━━━━━━━━━━━━┫

┃┃

┃提供源码发布与下载┃

┃┃

┃┃

┃┃

┃互助、分享、提高┃

┗━━━━━━━━━━━━━━━━━━━━━┛

田远驰t.yc@

五、说明:

你只需要确定一个mscomm32.ocx控件在system目录下并且该控件已经被windows注册。

方法:

将mscomm32.ocxcopy到C:

\winnt\system32目录下

运行:

regsvr32mscomm32.ocx

┏━━━━━━━━━━━━━━━━━━━━━┓

┃源码爱好者┃

┣━━━━━━━━━━━━━━━━━━━━━┫

┃┃

┃提供源码发布与下载┃

┃┃

┃┃

┃┃

┃互助、分享、提高┃

┗━━━━━━━━━━━━━━━━━━━━━┛

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1