当前位置:首页 >> 信息与通信 >>

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


[请 输 入 学 校 名 称
[请 输 入 专 业] 论文 请

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

姓 学

名: [请输入作者] 号: [请 输 入 学 号]

指导教师: [请输入指导教师]

2012 年 4 月 9 日

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

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

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

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

二、程序流程

发送到串口来的数

选择接收数据的方

查看以前的数据

接收数据

打开以前的数据文件

显 示

保 存 数

按 《 方 式 查

按 》 方 式 查

按 < 方 式 查

按 > 方 式 查

发送到串口来的数

OnComselect(),OnComspe

查看以前的数据

OnComm()

打开以前的数据文件

Display() OnPaint()

OnComm () OnButton4(

OnButton5(

OnButton7

OnButton6(

三、串口程序设计
///////////////文件 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* CDialog(CCommDlg::IDD, pParent) { } pParent /*=NULL*/):

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 自动生成 我在这就不作详 细介绍了. 细介绍了 个程序文件,5 共有 4 个程序文件 个头文件 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)/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 ┃ ┃ ┃ ┃ 互助、分享、 ┃ 互助、分享、提高 ┃ ┗━━━━━━━━━━━━━━━━━━━━━┛


赞助商链接
相关文章:
远程串口温度采集系统设计_图文
远程串口温度测量系统设计 摘要 远程温度测量系统是利用下位机实时温度的采集,并...而且对所设计电路给出了相应的软件设计, 包括串行口初始化,数据采集和数据传输...
单片机温度采集与显示
该系统利用 AT89C52 芯片控制温度传感器 DS18B20 进行实时温度检测并显示,能够...MAX232 芯片与计算机的 RS232 接口进行 串口通信,方便的采集和整理时间温度数据...
远程串口温度采集系统设计
用VB进行串口实时数据采... 24页 免费 基于51单片机与PC机的远... 37页 免费...本设计用 52 单片机为主要硬件,设计了包括温度采集,温度显示,串口通信等外围 ...
基于labview的串口温度采集系统设计
自生成温度信号,通过温度的采集实现对温度数据采 集,预处理,分析,储存和显示...组成测温单元,实时、方便、可靠的 实现对单点温度测量,通过RS232串口将数据传送...
温度数据的无线传输和实时监控系统123
(1)系统能够对所传输的温度数据进行自动采集、测量、格式转换、现场实时 显示和...(3)通过串口 RS232 和上位机 PC 机相连,将无线接收到的数据上传给上位机, ...
DS18B20温度采集并由lcd显示
显示 蜂鸣器 温度传感器 串口下载 备注 单片机 AT24C02(DIP 封装) 1 软件组成...采集温度数据,经I/O口传给单片机,单片机对接收到的数据进行实时 在lcd上显示,...
基于单片机实现温度信号的上位机监测
(b)上位机能读取单片机送至串口温度数据,将温度数据实时显示,并绘制出 实时的温度曲线。 (c)程序需将读取的温度信号分批次和采集时间分别写入文本文件和数据库...
基于labview的串口温度采集系统设计
上位机软件,控制采集模块进 行温度采集,串口数据传输,然后对数据处理和显示。...测温单元,实时、方便、可靠 的实现对单点温度测量,通过RS232串口数据传送给...
基于温度采集的单片机和Visual C++串口通信(带电脑端程序)
单片机作为温控器,选用 DS18B20 数字温度传感器, 可任意设置上下限报警温度,采用数码管实时显示温度,通过串口利用单片机与上位机的通 信,对温度进行采集数据处理和...
基于温度采集的单片机和串口通信(带电脑端程序)_课程设...
单片机作为温控器,选用 DS18B20 数字温度传感器, 可任意设置上下限报警温度,采用数码管实时显示温度,通过串口利用单片机与上位机的通 信,对温度进行采集数据处理和...
更多相关标签: