串口温度数据采集并实时显示
更新时间:2024-07-08 08:45:01 阅读量: 综合文库 文档下载
- 串口数据采集实时显示推荐度:
- 相关推荐
[请 输 入 专 业] 论文
[请输入学校名称
串口温度数据采集并实时显示
(上位机部分)
姓 名: [请输入作者] 学 号: [请 输 入 学 号] 指导教师: [请输入指导教师]
2013年4月17日
一、原理
读串口数据的原理是,只要当有数据向串口发数据来时,计算机就会自动将其数据写到一个特定的缓冲区,我们只要写程序去读那个特定的缓冲区就可以了.
有数据向串口发过来时,程序可以将数据接收到,接收的数据是字符型的,那么将数据转化为数字型的,再将这个数据的大小作为画图的某一个点的纵坐标,横坐标为数据的序号.将这些点用线连起来就是一个曲线图了,这个就是图形显示基本原理.
查看原来的数据的原理也是这样的,不同的地方就是,数据是从文件中来,同样的也是将多个数据分成一个一个的,然后这一个数据的大小就是画图的某一个点的纵坐标,横坐标同样为数据的序号,再将这些点用线连起来就是曲线图.
图形能移动的原理,是我们首先改变的只是数据,图形并没有变,但图形的形式是由这些数据来确定的,当数据发生变化后,我们通过刷新显示区来变化的.
二、程序流程
发送到串口来的数 按 《 方 式 查
选择接收数据的方查看以前的数据 接收数据 打开以前的数据文件 显示 保存数据 按》方式查按<方式查按>方式查
发送到串口来的数
OnComm() OnComselect(),OnComspe查看以前的数据 打开以前的数据文件
Display() OnPaint() OnComm() OnButton4(OnButton5(OnButton7OnButton6(三、串口程序设计
///////////////文件 commDlg.cpp////////////////
//一个类,对话框类,本程序使用的是对话框形式,这个类是在VC用MFC自动生成的,其中包括了对话框程序应有的一些方法 class CAboutDlg : public CDialog { };
/********************以下的个方法也是VC的MFC的对话框程序固有的,也是MFC自动生成的**************/
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP()
CCommDlg::CCommDlg(CWnd* pParent /*=NULL*/): CDialog(CCommDlg::IDD, pParent) { }
void CCommDlg::DoDataExchange(CDataExchange* pDX) { }
//下面这个包括的是界面中的组件
BEGIN_MESSAGE_MAP(CCommDlg, CDialog) END_MESSAGE_MAP()
// CCommDlg message handlers BOOL CCommDlg::OnInitDialog() { }
void CCommDlg::OnSysCommand(UINT nID, LPARAM lParam) { }
// The system calls this to obtain the cursor to display while the user drags the minimized window.
HCURSOR CCommDlg::OnQueryDragIcon() { }
BEGIN_EVENTSINK_MAP(CCommDlg, CDialog) END_EVENTSINK_MAP()
/********************以上的个方法也是VC的MFC的对话框程序固有的,也是MFC自动生成的**************/
/********************我在做这个程序时以上的程序并没有手动修改*******************************/
// 画图函数
// 算法:运用LineTo函数把120个点连成折线 void CCommDlg::OnPaint()
{ }
//对串口数据的处理,包括接收,保存等 void CCommDlg::OnComm() { }
//开串口程序
void CCommDlg::OnButton1() { }
//清除编辑框内容程序
void CCommDlg::OnButton2() { }
//选择那一个串口程序
void CCommDlg::OnComselect() { }
//选择波特率
void CCommDlg::OnComspeed() { }
//停止/继续程序
void CCommDlg::OnStoprecv() { }
//对数据显示前的处理:将新数年据加到左边,原来的右移一位 void CCommDlg::Display() { }
//以下四个函数是查看原来数据的程序 //按钮《 程序
void CCommDlg::OnButton4() { }
//按钮 》程序
void CCommDlg::OnButton5() { }
//按钮 < 程序
void CCommDlg::OnButton6() { }
//按钮 > 程序
void CCommDlg::OnButton7() { }
//此函数用来查看最后一屏数据 void CCommDlg::OnButton8() { }
对于其它的文件中的程序我没有手动修改,均为MFC自动生成,我在这就不作详细介绍了.
共有4个程序文件,5个头文件 comm.cpp commDlg.cpp mscomm.cpp StdAfx.cpp
comm.h commDlg.h mscomm.h Resource.h StdAfs.h
┏━━━━━━━━━━━━━━━━━━━━━┓ ┃ 源 码 爱 好 者 ┃ ┣━━━━━━━━━━━━━━━━━━━━━┫ ┃ ┃ ┃ 提供源码发布与下载 ┃ ┃ ┃ ┃ http://www.codefans.net ┃ ┃ ┃ ┃ 互助、分享、提高 ┃
┗━━━━━━━━━━━━━━━━━━━━━┛ 田远驰 t.yc@163.com
四、数据采集实时显示程序设计
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起始位,接着的一个字节为整数部分,再接着发一个字节的数据为小数部分。取数算法如下: BYTE a=* (char *)(data+i) BYTE b=* (char *)(data+(++i)) float c=(float)a+(float)(b)/10
4、画图原理
我画图使用的是画直线的方式(LineTo()),先定义一个全局变量用来保存采集的数据值,在画图函数OnPaint()中用这个全局变量来作为纵坐标,等分的120个点作为横坐标,那么就有120个点,最后用直线将这120个点连接起来就组成了一个完整的曲线图。只要当全局变量中的数值发生变化后就使用函数this->Invalidate()强制重载OnPaint()函数,那么数据图就可以动起来了。OnPaint()画图函数如下: void CCommDlg::Display()
{
if (NextTime <= 600 && stop==FALSE) { LineHight[NextTime/5] = LineHight[121]; //中保存的是最新采集的一个数据 } else { for (int i=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()。 void CCommDlg::OnButton7() {
if (stop==FALSE) { gogo=NextTime; DTemp=m_ReceiveData; for (int i =0;i<120;i++) LHTemp[i]=LineHight[i]; }
stop=TRUE;//关闭接收数据,使显示区和数据区用来为显示原来数据用 if (NextTime==0) NextTime=595; NextTime=NextTime-595;
SetDlgItemText(IDC_STOPRECV,\继续显示\ //先取出文件中的数据,放入一个数组中 CStdioFile file;
if(file.Open(FilePath,CFile::modeRead)) { CString str; CString instr; CString outstr;
CString sss; int i; 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 (int i =0;i<120;i++) LHTemp[i]=LineHight[i]; 以便在继续接收时能接着原来的。
6、数据保存方式
对采集的数据采用文本方式保存于一文件中,保存格式为,第120数据保存一次,数据采用推算法来确定时间。如:08.9 33.5 08.8 65.4 09.8 09.3?? 程序算法为:
if (file.Open(FilePath,CFile::modeCreate|CFile::modeReadWrite)) {
file.Write(m_ReceiveData,600);//写入120个数据 file.Close(); }
完整算法见:OnComm()
7、通用性
为了提高程序的通用性,串口的波特率,串口号都采用下拉选择的方式,在使用中可跟据情况选择。
┏━━━━━━━━━━━━━━━━━━━━━┓
┃ 源 码 爱 好 者 ┃ ┣━━━━━━━━━━━━━━━━━━━━━┫ ┃ ┃ ┃ 提供源码发布与下载 ┃ ┃ ┃ ┃ http://www.codefans.net ┃ ┃ ┃ ┃ 互助、分享、提高 ┃ ┗━━━━━━━━━━━━━━━━━━━━━┛
田远驰 t.yc@163.com
五、说明:
你只需要确定一个mscomm32.ocx控件在system目录下并且该控件已经被windows注册。
方法:将mscomm32.ocx copy到C:\\winnt\\system32目录下 运行:regsvr32 mscomm32.ocx
┏━━━━━━━━━━━━━━━━━━━━━┓ ┃ 源 码 爱 好 者 ┃ ┣━━━━━━━━━━━━━━━━━━━━━┫ ┃ ┃ ┃ 提供源码发布与下载 ┃ ┃ ┃ ┃ http://www.codefans.net ┃ ┃ ┃ ┃ 互助、分享、提高 ┃ ┗━━━━━━━━━━━━━━━━━━━━━┛
正在阅读:
串口温度数据采集并实时显示07-08
第1章 网络互联设备和管理08-14
2007年香格里拉4---6月份营销方案07-25
2019年中考数学专题提升(6)一次函数与反比例函数的综合(含答案)11-12
湘潭市部分市直事业单位公开考试录(聘)用07-08
县委上半年依法行政工作规划与2022年工作思路及打算07-30
宠物用品项目可行性研究报告 - 图文04-27
楼兰公主02-14
物探钻机项目投资计划07-08
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 数据采集
- 串口
- 实时
- 温度
- 显示
- 十三五重点项目-高性能纳米晶超薄带项目资金申请报告
- 2017年高考时政热点微专题(一):微专题十三 共同打造中国—东
- 圣诞木制品市场前景预测及投资规划分析报告(目录)
- 美术教学改革与教学方法的转变-教育文档
- 大型综合体商业购物中心物业管理公司投标书
- 附图易懂24孔口琴教程
- 北语201609考试批次《人员选拔与聘用管理》(结课作业)答案
- 家庭社会工作论文
- 超高层电梯的配电要点及案例 - 图文
- “十三五”重点项目-雷达显示管生产建设项目可行性研究报告 - 图
- 2008年上半年综合管理处工作总结及下半年工作要点
- 苏教版六年级上册习作2《我对爸爸妈妈说:我爱你!》范文(计25
- 软件详细设计说明书-招商引资平台
- 药师2017年终个人工作总结
- 利用easyboot制作集成PE,原版系统,修改版系统的N合一维护u盘
- 中医妇科学方剂口诀
- 市五年级语文上册第一单元导学案编写:居思
- 助推低碳经济发展的审计监督方法研究
- 机械类毕业设计说明书
- 全国普通高校2018年招生统考高三理科综合(一)模拟金卷生物试题Wo