




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、3班级050811学号08081068题目:基于RS232接口的数据采集分析系统研究学院:技术物理学院专业:电子科学与技术学生姓名:于硕摘要RS232接口作为计算机通讯的一个标准接口在设备的通信传输,控制和状态监测等领域具有广泛的应用。本文首先介绍了在windows下对串口的控制,并使用API设计软件控制串口实现收发数据、指令。最后,根据需求,利用Visual Studio 2010设计上位机软件对基于RS232接口的激光功率计实现控制,数据采集以及实时分析。关键字:串口 RS232 上位机ABSTRACTRS232 interface as standard computer communi
2、cation interface is widely used in the device's data transmission, control and status monitoring.This paper first introduced how to control of the serial port under Windows, then use API to design software to control serial port sending, receiving data and instructions. Finally, according to the
3、 demand, we designed PC software by Visual Studio 2010 to control a laser power meter based on RS232 interface, realized data acquisition and real-time analysis.Keywords: SerialPort RS232 PC Software目录目录绪论10.1关于数据采集10.2数据采集分析系统概述2第一章 RS232接口51.1 关于串行传输51.2 RS232接口简介61.3 串口通信原理71.4 RS-232串口通信基本方法8第二章
4、 Windows下串口通信的实现112.1 概述112.2 MSComm控件介绍112.3 Windows API 串口编程13第三章 3-激光功率计的操作方法153.1 指令、数据的基本格式要求153.2 功率计的基本命令及使用153.3 功率计常用命令一览16第四章 数据采集上位机软件的设计194.1 程序通信核心:TSigma类194.2 程序主要功能的设计24第五章 程序功能的测试31第六章 结束语35参考文献37附录 程序部分代码39TSigma 类39程序的视类(View类)48程序的文档类(Document类)60附录 程序部分代码63绪论0.1 关于数据采集自从人类开始对自然界
5、开始认识以来,就有了测量、记录。从古时的结绳计数,到近代的各种指针式仪器,再到现在的各种数字式仪表、仪器,以及虚拟仪器,每一次测量技术的革新,都直接推动了科技的进步。科技的发展不仅仅受制于理论的发展,也受制于测量、记录、工程加工的方式。例如伽利略式望远镜的发明直接催动了一系列天文界的重大发现,扭秤的使用为万有引力系数的测量奠定了基础。直到现在,我们也不能说我们的测量技术达到了成熟,仍然有各种各样的物理量要通过很复杂的方式才能测量。这些不可避免的催生了数据采集技术。数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采非电量或者电量信号,送到上位机中进行分析,处理。数据采集系
6、统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。数据采集的目的是为了测量电压、电流、温度、压力或声音等物理现象。基于PC的数据采集,通过模块化硬件、应用软件和计算机的结合,进行测量。尽管数据采集系统根据不同的应用需求有不同的定义,但各个系统采集、分析和显示信息的目的却都相同。数据采集系统整合了信号、传感器、激励器、信号调理、数据采集设备和应用软件。在计算机广泛应用的今天,数据采集的重要性是十分显著的。它是计算机与外部物理世界连接的桥梁。各数据采集种类型信号采集的难易程度差别很大。实际采集时,噪声也可能带来一些麻烦。数据采集时,有一些基本原理要注意,还有
7、更多的实际的问题要解决。0.2数据采集分析系统概述在科研工作和学习中,我们经常用到一些仪器仪表。随着科技的发展,以前的指针式仪器仪表逐渐被现代化的电子仪器代替,并且很多都带有功能齐全的数据采集、显示功能。在新的工具给我们带来便利的同时,我们也会产生这样的疑问,以前我们采集了数据记录在纸上,现在是否可以直接将仪器与电脑连接,将数据直接传输到我们的电脑中?答案是肯定的,我们通过智能仪器提供的数据接口与PC机连接,不但实现的数据采集,并且还可以对数据进行实时分析、并永久的保存下来。这样一个系统就是我们所需要的数据采集分析系统。一般说来,数据采集系统由传感器、信号调理电路、数据采集电路三部分组成,如图
8、0-1所示。 图 0-1 数据采集系统的基本组成数据采集分析系统的任务就是采集传感器输出的模拟信号并转换成计算机能识别的数据信号,然后送入计算机进行相应的计算和处理,得出所需的数据。并计算得到的数据经行显示或打印,以便实现对某些物理量的实时控制。在生产生活的各个领域,数据采集分析系统几乎无处不在,凡是有自动检测及控制的地方都会有数据集采机系统的身影出现;从简单到复杂,从空中,地面到地下,凡是能想象到的地方都有使用数据采集分析系统的需求。因此,对本课题的研究有极其广阔的发展前景和巨大的经济价值。数据采集分析系统的发展起始于20世纪50年代,1956年美国首先研究了用在军事上的数字采集系统。20世
9、纪70年代中后期,随着微型机的发展,诞生了采集器,仪表同计算机溶为一体的数据采集分析系统。由于这种数据采集分析系统的性能优良,超过了传统的自动检测仪表和专用数据采集分析系统,因此获得了惊人的发展。到了80年代随着计算机的普及应用,数据采集分析系统的到了极大的发展,开始出现了通用的数据采集与自动测试系统。该阶段的数据采集分析系统主要有两类,一类以仪器仪表和采集器,通用接口总线和计算机等构成。第二类以数据采集卡,标准总线和计算机构成。及至90年代至今,在国际上技术先进的国家,数据采集技术已经在军事,航空电子设备及宇航技术,工业等领域被广泛应用。随着计算机技术的飞速发展和普及,数据采集分析系统在多个
10、领域有着广泛的应用。数据采集是工、农业控制系统中至关重要的一环,在医药、化工、食品、等领域的生产过程中,往往需要随时检测各生产环节的温度、湿度、流量及压力等参数。同时,还要对某一检测点任意参数能够进行随机查寻,将其在某一时间段内检测得到的数据经过转换提取出来,以便进行比较,做出决策,调整控制方案,提高产品的合格率,产生良好的经济效益。随着工、农业的发展,多路数据采集势必将得到越来越多的应用,为适应这一趋势,作这方面的研究就显得十分重要。在科学研究中,运用数据采集分析系统可获得大量的动态信息,也是获取科学数据和生成知识的重要手段之一。总之,不论在哪个应用领域中,数据采集与处理将直接影响工作效率和
11、所取得的经济效益。此外,计算机的发展对通信起了巨大的推动作用.计算机和通信紧密结合构成了灵活多样的通信控制系统,也可以构成强有力的信息处理系统,这样对社会的发展产生了深远的影响。数据通信是计算机广泛应用的必然产物。数据采集分析系统,从严格的意义上来说,应该是用计算机控制的多路数据自动检测或巡回检测,并且能够对数据实行存储、处理、分析计算以及从检测的数据中提取可用的信息,供显示、记录、打印或描绘的系统。数据采集分析系统一般由数据输入通道,数据存储与管理,数据处理,数据输出及显示这五个部分组成。输入通道要实现对被测对象的检测,采样和信号转换等工作。数据存储与管理要用存储器把采集到的数据存储起来,建
12、立相应的数据库,并进行管理和调用。数据处理就是从采集到的原始数据中,删除有关干扰噪声,无关信息和必要的信息,提取出反映被测对象特征的重要信息。另外,就是对数据进行统计分析,以便于检索;或者把数据恢复成原来物理量的形式,以可输出的形态在输出设备上输出,例如打印,显示,绘图等。数据输出及显示就是把数据以适当的形式进行输出和显示。由于RS-232在微机通信接口中广泛采用,技术已相当成熟。在近端与远端通信过程中,采用串行RS-232标准,实现PC机与单片机间的数据传输。第一章 RS232接口1.1 关于串行传输计算机与外界进行通信的方式有串行通信和并行通信两种,并行通信是一条信息的各个数据位同时被传输
13、的通信方式,相对应的,串行通信就是一条信息的各个数据位按顺序进行传输。通常认为,并行通信的传输速率要优于并行通信,但实际上,这一优势只能在传输距离近、传输频率相同的时候体现出来,随着传输频率的提高,并行传输中信号线之间的干扰愈发明显,而串行传输的信号线只有一根,不存在干扰的问题。现在,在我们的计算机中,即使硬盘与主板、CPU之间的数据传输都是使用SATA进行传输的(SATASerial Advanced Technology Attachment,串行高级技术附件)。我们最常用的U盘,计算机各种外设使用的我们再也熟悉不过的USB接口也是串行接口。但是仅仅是一个串行接口,也有着各种各样不同的标准
14、,比如:RS-232C、RS-422/RS485(这是我们一提到串口就会立刻想到的),上文中提到的SATA、USB,还有IEEE1394等等。串行通信接口的基本任务是:1、 实现数据的格式化2、 进行串并转换3、 控制数据传输速率4、 进行错误检测5、 进行TTL与EIA电平转换6、 提供接口标准所要求的信号线1.2 RS232接口简介图 1.1 DB9串口外观RS-232串行接口属于个人计算机(PC)及电信应用领域中最为成功的串行数据标准;而RS-422和RS-485串行接口则是工业应用领域中最为成功的串行数据标准,上述这些数据标准并不直接相互兼容,但在电信、自动控制及仪器仪表应用中,往往需
15、要在其之间进行数据通信。RS-232也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座。自IBM PC/AT开始使用简化了的9芯D型插座。至今25芯插头座现代应用中已经很少采用。电脑一般有两个串行口:COM1和COM2,你到计算机后面能看到9针D形接口就是了。 RS-422由RS-232发展而来,它是为弥补RS-23
16、2之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA提出的建议标准都是以
17、“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。 RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。因此在视频界的应用,许多厂家都建立了一套高层通信协议,或公开或厂家独家使用。如录像机厂家中的Sony与松下对录像机的RS-422控制协议是有差异的,视频服务器上的控制协议则更多了,如Louth、Odetis协议是公开的,而ProLINK则是基于Profile上的。 1.3 串口通信原理串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,
18、但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个
19、数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0127(7位)。扩展的ASCII码是0255(8位)
20、。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有
21、校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。1.4 RS-232串口通信基本方法1.4.1 连接器图1.2 DB25和DB9连接器外形及引脚定义RS232C标准规定设备间使用“D”型25针连接器的电缆通信,即DB25。实际上,RS-2
22、32的25条引脚中大部分是很少用的,在计算机与终端的通信中,一般只用39条引脚。例如,本例中,我们只用到了其中的三个引脚:TXD,RXD,GND。在使用中,我们最常用的是DB9连接器,图片给出了DB25和DB9连接器的在串口通信中的引脚定义:1.4.2 数据传送格式串行数据通信是把并行数据转换为串行数据按顺序依次发送。接受端再将接受到的串行数据转换成并行数据。串行数据可按两种方式进行,即同步方式和异步方式。同步方式适用于大批量数据通信,每次传送一组数据,在每组数据前加上一定的编制信号,使得双方保持同步。异步数据通信每次发送一个字符,在每个字符的二进制位串前加上启动位作为接收端的同步信号,这样每
23、发送一个字符,双方进行一次同步。串行异步数据传输有着严格的数据格式和时序关系。在空闲状态,线路呈现出高电平或者“1”状态。传输时,首先发送起始位,接收端接收到起始位,即开始接收过程。在后边的整个二进制位串传输过程中,都是以起始位作为同步时序的基准信号。起始位以“0”表示。紧跟其后的是数据位,根据采用的编码,数据位可能为5位到8位之间。奇偶位可以有也可以没有。处在最后的是停止位,停止位以“1”表示,位数可能是1位、1/2位或者2位。传送格式中的起始位和停止位在数据传输过程中起着十分重要的作用。通信中有两点影响着数据的正确接收。一是数据发送是随机的,接收端必须随时准备接收数据。另一方面,接收端和发
24、送端不是使用同一个时钟,在通信线路的两端各自具有时钟信号源,虽然可以设定双方的时钟频率一样,但脉冲边沿也不可能一致。脉冲周期、脉冲宽度总有误差。开始发送时,接收端必须准确地检测到起始位的下降沿,使其内部时钟和发送端保持同步。在对每个二进制位接收采样时,采样点应可能接近数据位中点。为了能及时发现起始位的下降边沿,大多数接收器使用高于发送数据波特率十六倍的频率时钟信号进行采样。这样,接收器能够在一个二进制位周期的1/16时间内检测到起始位的下降边。对数据位周期中心采样的偏差也不会超过位周期时间的1/16。第二章 Windows下串口通信的实现2.1 概述在很多情况下,远程监控和工业自动化领域系统经
25、常采用串并口通信编程,其中串行接口被广泛地应用于工程实践的长距离通信中。运用Windows通信API可以在Windows环境下进行串口编程,不用对硬件直接进行操作,并通过VC、VB和Delphi等语言进行调用,大大方便了对数据的处理。在Windows下,对串口进行控制主要有两种方式,一是使用MSComm串口控件,其二是使用系统提供的API函数对串口进行控制。另外,可以直接使用现有的串口类,可以从codeguru、codeproject上面下载得到许多别人写好的较为完善的串口类,如CSerialPort类,可以极大地简化、加速程序设计。2.2 MSComm控件介绍Microsoft Commun
26、ication Control(简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,为应用程序提供了通过串行接口收发数据的简便方法。使用MSComm控件时,我们无需花时间了解复杂的API函数,但仍使用控件间接的调用了API,只是先通过Comm.drv解释,再传递给驱动程序执行。MScomm控件提供了两种处理通信问题的方法,一是事件驱动,二是查询法。利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。以下是MSComm控件的常用属性和方法: 1. Commport:设置或返回串口号。 2. Settings:以
27、字符串的形式设置或返回串口通信参数。 3. Portopen:设置或返回串口状态。 4. InputMode:设置或返回接收数据的类型。 5. Inputlen:设置或返回一次从接收缓冲区中读取字节数。 6. InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。 7. InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。 8. Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。 9. OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。 10. OutBufferCount:设置或返回发送缓冲区
28、中等待计算机发送的字符数。 11. Output:向发送缓冲区发送数据,该属性设计时无效,运行可写。 12. Rthreshold:该属性为一阀值。当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent属性为ComEvReceive,并产生OnComm事件。用户可在OnComm事件处理程序中进行相应处理。若Rthreshold属性设置为0,则不产生OnComm事件。例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。这样接收缓冲区中接收到一个字符,就产生一次OnComm事件。 13. Sthreshold:该属性亦为一阀值。当发送缓冲区中字符数
29、小于该值时,MSComm控件设置Commevent属性为ComEvSend,并产生OnComm事件。若Sthreshold属性设置为0,则不产生OnComm事件。要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生OnComm事件,其后就不再产生OnComm事件。例如Sthreshold设置为3,仅当发送缓冲区中字符数从3降为2时,MSComm控件设置Commevent属性为ComEvSend,同时产生OnComm事件,如发送缓冲区中字符始终为2,则不会再产生OnComm事件。这就避免了发送缓冲区中数据未发送完就反复发生OnComm事件。 14. CommEvent:这是一个非常重要的属性
30、。该属性设计时无效,运行时只读。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋不同的代码,同时产生OnComm事件。用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。2.3 Windows API 串口编程API是附带在Windows内部的一个极其重要的组成部分。Windows的32位API主要是一系列复杂的函数和消息集合,可以看做是Windows系统为其下运行的各种开发系统提供的开放式通用功能增强接口。Windows环境下对串行端口进行操作,是把它作为文件来处理的,其中涉及到大量API函数,操作起来比较复杂,可以概括为以
31、下的几个操作步骤:1. 打开串行通信设备2. 指定并初始化读写缓冲区(可省)3. 设置串口属性,配置DCB结构4. 设置超时值5. 进行串行数据通信6. 关闭串行端口串行通信一般可以分为同步和异步两种操作方式。所谓同步方式是指在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到才返回。如果规定的待读取数据量大且设定的超时时间也较长,而接收缓冲区较小,则可能引起线程阻塞。而异步方式是利用Windows的多线程结构,让串口的读写操作在后台进行,而应用程序的其他部分在前台执行。如果按驱动方式分,串口通信也可分为查询和事件驱动两种方式。查询方式是指程序定期周期性地检
32、查串口的缓冲区,发现有数据就读取数据。查询的周期越小,实时性越高,越不容易丢失数据,但同样也更占CPU资源。事件驱动方式则是一种高效的串口读写方式,通过设置事件来通知系统工作,即当所预期的事件发生时,向系统发出消息,系统调用相应的消息响应函数进行处理,实时性较高,也避免了数据丢失。第三章 3-激光功率计的操作方法3激光功率计是我们实现数据采集的主要工具,我们使用激光功率计对激光的功率进行测量,并使用串口将其与计算机连接,从PC机上读取数据,并对数据进行处理。3.1 指令、数据的基本格式要求通过阅读激光功率计的用户手册可知,PC机与激光功率计终端的通信是通过串口发送字符串来实现的。每条命令或数据
33、都是一个字符串,并且以回车-换行(rn)结束。回车-换行是唯一的终止符,PC机发送指令、数据必须以回车-换行结束,否则功率计将无休止地等待终止符,同样,功率计发送给PC机的数据也可以用回车-换行来确定是否已发送完毕。3.2 功率计的基本命令及使用功率计的命令有两种类型,一是设置,一是查询。查询命令一定会用?来结束(在终止符之前)。设置命令主要用于初始化功率计,并设置各种参数。参数设置命令后面加一个?就会变成查询命令,功率计会在收到查询命令之后,将所查询的参数发送回来。3.3 功率计常用命令一览说明:1、命令有两种:设置命令和查询命令,表中有(?)的表示两种命令都可用,有?的表示只有查询命令,没
34、有?的表示只有设置命令。2、表中的命令大写部分是必须的,功率计不区分大小写,表中小写部分可以省略,但是要省略必须全部省略,比如第一条命令可以写作SYST:COMM:SERial:BAUD也可以写作SYSTem:COMMunicate:SERial:BAUD但是不可写作SYSTem:COMMun:SERial:BAUD通信命令命令描述SYSTem:COMMunicate:SERial:BAUD(?)串口波特率的设置、查询SYSTem:COMMunicate:SERial:PACE(?)设置查询主机通信低级流控制的方法SYSTem:COMMunicate:SERial:PARity(?)设置、查询
35、校验位SYSTem:COMMunicate:SERial:SBITs(?)设置、查询停止位SYSTem:COMMunicate:SERial:SERVice(?)设置、查询终端机是否发送响铃通知显示命令命令描述DISPlay:CLEar清空显示的文字,并使能测试数据的实时显示DISPlay:TEXT设置文字在显示区显示错误命令命令描述SYSTem:ERRor:ALL?查询队列中的所有错误SYSTem:ERRor:CLEar清除队列中的所有错误SYSTem:ERRor:COUNT?询问队列中现有错误的数量SYSTem:ERRor:NEXT?查询队列中的下一条错误仪器及探针信息命令命令描述SYST
36、em:INFO:INSTrument:CALDate?查询仪器的校准日期SYSTem:INFO:INSTrument:SERNumber?查询仪器的序列号SYSTem:INFO:PROBe:CALDate?查询探针的校准日期SYSTem:INFO:PROBe:MODEL?查询探针的型号SYSTem:INFO:PROBe:RESPonsivity?询问探针是否有响应SYSTem:INFO:PROBe:SERNumber?查询探针的序列号SYSTem:INFO:PROBe:TYPE?查询探针的类型SYSTem:INFO:PROBe:TYPE?查询探针的温度测量数据采集命令命令描述ABORt终止数据
37、采集过程INITiate使能数据采集过程FETCh:ALL?查询所有的可用数据记录FETCh:MISSing?查询由于缓冲区溢出而丢失的数据的数量FETCh:NEXT?查询下一条可用的数据记录FETCh:NRECords?查询可用的数据记录的数量测量设置命令命令描述CONFigure:AREA:APERture(?)设置、查询孔径面积CONFigure:AREA:CORRection(?)设置、查询面积校正的使能CONFigure:ATTEnuation:CORRection(?)设置、查询衰减校正的使能CONFigure:ATTEnuation:FACTor(?)设置、查询已连接探针的衰减系
38、数第四章 数据采集上位机软件的设计4.1 程序通信核心:TSigma类为了方便程序的改造以及移植,我们将功率计终端的通信、设置、数据采集封装成为一个类。使用时,只需要简单的实例化及设置即可完成所需要的功能。我们需要这个类具有以下功能:1. 存储与功率计连接的串口的相关信息(串口号、波特率、校验位、终止位)。2. 具有一定的缓冲区,将采集回来的数据存储起来,等待处理,而不丢失数据。3. 因为数据的读取相对于PC来说是个漫长的过程,在这过程中,PC可以完成许多其他的任务,因此我们的类必须是非阻塞的可以在后台执行数据的传输。4. 有基本的命令调用函数,而不必翻阅手册查询命令。5. 可以根据需要选择是
39、否给父窗口发送Windows消息,以便用户使用消息响应函数来处理。为了实现功能1,我们将串口操作的API调用直接封装到了类中,为了实现功能3,我们设计了多线程的数据传输函数。TSigma的主要成员函数设置实例的父窗口,以便发送消息:bool SetOwner(HWND hWnd);设置串口的相关参数:void SetPortName(const CString& port);/设置串口号void SetBaudRate(int baud);/设置波特率连接以及断开连接、询问是否连接:bool Connect();void Disconnect();bool isConnected();
40、发送、收取一条信息:bool SendSigmaMsg(const char* msg);/发送一条指令、信息bool GetSigmaMsg(char* msg);有关参数的设置以及查询:void SetApertureAera(float area);bool GetApertureAera(float& ans);void SetAreaCorrection( BOOL setValue );bool GetAreaCorrection(BOOL& ans);立即执行一次测量并读取测量值,成功返回true,并将结果存储在ans中,否则返回false:bool GetDat
41、aImmediate(double& ans);查询相关的器件信息:bool GetDeviceSn( char* sigma_sn );bool GetProbeSn( char* probe_sn );bool GetProbeModel( char* probe_model );子线程函数:CommProc这个函数主要负责通信,并将结果存储在缓冲区当中,当收到终止符(回车-换行)的时候,选择是否发送消息。函数结构如图:开始执行是否设置了父窗口报错并退出是否仍在连接状态中检查串口缓冲区是否有数据读取数据,并根据是否是终止符选择是否发送消息进入事件等待,直到收到串口的Event断开连
42、接并退出否否否是是是图4.1 程序CommProc线程结构图CommProc是通信线程函数,负责整个程序与终端机的通信,同时将接收到的数据以原来的格式存储到缓冲区。下面详细介绍CommProc。1、 调用时机当用户点击连接按钮之后,程序执行TSigma:Connect()函数,Connect函数将串口按照指定参数设置好之后,使用AfxBeginThread()将该线程打开并挂起,然后Connect函数检查AfxBeginThread()函数返回的指针,确认非空后(说明打开线程正常),开始执行。2、 函数参数由于线程函数是传递给windows指针,由windows调用的,所以函数必须符合规定的格
43、式,函数的参数只能有一个32位的pParam,当然这个参数是什么内容,由用户来定,但是必须是LPVOID类型(可以强制转换为任何类型的指针)。很明显,当我们有大量参数需要传递的时候,指针作为参数最为合适。虽然CommProc是TSigma的成员函数,但因为这个函数的特殊性,它必须是一个Static型,否则无法由系统调用。Static型函数是不能直接调用它的类成员(因为它不知道是应该是哪一个类,或者说类没有实例化,static函数是没有this指针的),所以我们需要将实例化的类指针传递给函数,其实就是普通成员函数的this指针。3、 返回值根据stdcall函数的规定,函数调用正常,返回0,否则
44、返回非0值,表示错误代码。4、 执行过程进入函数之后,首先检查是否有父窗口(仅在调试时有该过程)。完成函数变量的初始化之后就进入线程的循环,循环条件为:仍在连接状态中,即m_bConnected的值为true。循环过程很简单,检查串口缓冲区,有数据则读取,并放入自己的缓冲区,然后检查是否是终止符,考虑要不要发送消息。然后就用WaitForSigleEvent等待串口事件。Get*函数这些函数有bool GetApertureAera(float& ans);bool GetAreaCorrection(BOOL& ans);bool GetDataImmediate(doubl
45、e& ans);bool GetDeviceSn( char* sigma_sn );bool GetProbeSn( char* probe_sn );bool GetProbeModel( char* probe_model );这些函数都大同小异:关闭CommProc的消息发送功能(将m_fSendMessages设置为0,由函数自己来处理消息),然后给终端机发送请求数据的指令,并等待接收到终止符,等待用WaitForSigleEvent函数进行,设置最长等待时间为500ms来防止阻塞进程。例如bool TSigma:GetDeviceSn( char* sigma_sn )m_
46、fSendMessage=false;ResetEvent(m_hReceived);SendSigmaMsg("SYST:INFO:INST:SERN?");WaitForSingleObject(m_hReceived,m_nResponseTime);m_fSendMessage=true;if( GetSigmaMsg(sigma_sn) )return true;return false;函数的返回值都是布尔型,true表示执行成功,false表示执行失败,而实际的数据存储在传递给函数的指针指向的空间中。串口连接的关闭关闭串口连接是通过标志位来实现的,这个地方万万
47、不可以使用KillThread函数来终止线程,要否定线程内自己的循环条件来终止,并且要等待线程内循环的结束,否则会引起内存泄露:void TSigma:Disconnect()if(m_bConnected=false)return;m_bConnected=false;SetCommMask(m_hPort,0);WaitForSingleObject(m_pThread->m_hThread,INFINITE);m_pThread=NULL;CloseHandle(m_hPort);4.2 程序主要功能的设计概述程序要完成数据的采集和动态显示,并且能将采集的数据存储起来。为了快速的实
48、现这些功能,我们使用MFC内建的Document-View结构,并使用其内建的Serialize机制实现存储功能,这样可以方便的让我们的程序打开自己的文件,并且就如同数据采集时那样显示数据图像。程序中,采集的数据使用数组的方式存储,这样明确了各个数据的时间关系,并且能够快速的遍历、检索出所需要的数据,实现高级的计算要求,为以后程序功能的扩展提供了方便。因为我们对数据采集的速率要求并不高,一般在10Hz左右,所以没有使用复杂的方法进行定时,自动采集,而是简单的设置一个以采样周期为基准的定时器,定时执行GetDataImmediate成员函数,并在每次采集回数据之后刷新显示。最终我们的程序界面设计
49、如下图图4.2 程序界面我们使用了Visual Studio 2010提供的最新的Ribbon界面,使用时,先在左侧的Connect选项卡设置好端口号和波特率,然后进行连接,连接成功后,程序会在下方的状态区显示连接成功,并显示出功率计的序列号。连接完成后,就可以设置采样周期,按下START按钮开始采集。一旦开始采集后,采样周期设置框自动锁死,不能再更改。采集完成后,按下STOP按钮终止采集。采集过程中,在右上方的CurrentValue框中可以看到当前功率,选中Hold复选框后,当前功率数值将锁定,取消Hold之后恢复显示当前功率。采集完成后,可以使用程序的存储功能将数据存储起来。在程序执行的
50、任意时刻,可以使用自带的截图功能,将数据图像复制到剪贴板。数据存储结构的设计因为存储的内容很简单,单纯的浮点数,所以使用线性数组来存储,MFC提供CArray最合适不过,而且还支持Serialize功能,省去了文件存储的许多麻烦。除了从终端读取的数据需要存储之外,我们还需要将读取的周期存储起来。数据和周期是必须的,另外为了加速程序的执行,我们将最大值一并存储了起来,因为最大值是一个频繁使用的值,尤其是在绘图的过程中。下面是3SigmaDoc的成员变量:public:CArray<double,double> m_dataArray;double max_ans;int m_pero
51、id;存储、读取函数void CMy3SigmaDoc:Serialize(CArchive& ar)if (ar.IsStoring()ar<<max_ans;ar<<m_peroid;m_dataArray.Serialize(ar);elsear>>max_ans;ar>>m_peroid;m_dataArray.Serialize(ar);数据的绘图显示在绘制的过程中,我们将当前屏幕的位置计算出来,只绘制当前屏幕显示的内容,而不是绘制所有画幅来提高绘图效率。绘图的过程可以分为四步:1、 根据数据量,单位间隔计算画幅大小,并设置画幅
52、大小。GetClientRect(&ClientRect);sizeTotal.cx=ClientRect.Width();sizeTotal.cy=ClientRect.Height();int t_max=(ClientRect.Width()-START_X)/(axis_x_interval);if(nSize*period>t_max*1000)t_max=nSize*period/1000+1;sizeTotal.cx=(period*nSize*axis_x_interval/1000)+START_X+START_X;sizeTotal.cy=ClientRect
53、.Height();SetScrollSizes(MM_TEXT,sizeTotal);elseSetScrollSizes(MM_TEXT,sizeTotal);2、 绘制横向表格,并添加横坐标(以秒为单位)t_max=GetScrollPos(SB_HORZ)/axis_x_interval+(ClientRect.Width()-START_X)/(axis_x_interval)+1;for(int t=GetScrollPos(SB_HORZ)/axis_x_interval;t<=t_max;t+)int i=t*axis_x_interval+START_X;pDC->
54、;MoveTo(i,0);pDC->LineTo(i,ClientRect.Height();sprintf_s(text,100,"%ds",t);textRect.SetRect(i,ClientRect.Height()-START_Y+5,i+50,ClientRect.Height();pDC->DrawText(text,&textRect,DT_LEFT);pDC->SelectObject(pOldPen);pen.DeleteObject();3、 根据最大值绘制纵向表格,并添加纵坐标pen.CreatePen(PS_SOLID,
55、1,RGB(200,200,200);pOldPen=pDC->SelectObject(&pen);for(int i=0;i<=axis_y_num;i+)pDC->MoveTo(START_X,ClientRect.Height()-START_Y-axis_y_grid*i);pDC->LineTo(sizeTotal.cx,ClientRect.Height()-START_Y-axis_y_grid*i);textRect.SetRect(0,ClientRect.Height()-START_Y-axis_y_grid*i,START_X,Clie
56、ntRect.Height()-START_Y-axis_y_grid*i+50);sprintf_s(text,sizeof(text),"%1.0E",i*axis_y_interval);pDC->DrawText(text,&textRect,DT_RIGHT);pDC->SelectObject(pOldPen);pen.DeleteObject();4、 绘制曲线pen.CreatePen(PS_SOLID,2,RGB(0,255,255);pOldPen = pDC->SelectObject(&pen);pDC->MoveTo(START_X,ClientRect.Height()-START_Y);int imin=1000*GetScrollPos(SB_HORZ)/(period*axis_x_interval);int imax=min(imin+1000*ClientRect.Width()/(period*axis_x_interval)+1,pDoc->m_dataArray.GetSize();for(int i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/Z 45388.1-2025工业过程测量、控制和自动化第1部分:工业设施和智能电网之间的系统接口
- 天然气输配过程中能耗降低技术考核试卷
- 橡胶制品的供应链管理与协同创新考核试卷
- 绿色农业与食品安全考核试卷
- 宝石的结晶学与晶体生长研究进展评价考核试卷
- 礼仪用品企业环境管理体系考核试卷
- 辽宁省葫芦岛市六校联考2025届普通高中毕业班教学质量监测物理试题含解析
- 昆山杜克大学《学校体育学A》2023-2024学年第一学期期末试卷
- 永州市冷水滩区2025届三年级数学第二学期期末统考模拟试题含解析
- 山东医学高等专科学校《数学规划》2023-2024学年第一学期期末试卷
- 山东省高中名校2025届高三4月校际联合检测大联考生物试题及答案
- 2025年武汉数学四调试题及答案
- 【MOOC】数学建模精讲-西南交通大学 中国大学慕课MOOC答案
- 职业病防护设施与个体防护用品的使用和维护
- 2024年全国高中数学联赛北京赛区预赛一试试题(解析版)
- 绿化养护服务投标方案(技术标)
- 中国纺织文化智慧树知到期末考试答案2024年
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- GB/T 3091-2015低压流体输送用焊接钢管
- 实际控制人股东会决议
- 混凝土搅拌机设计论文
评论
0/150
提交评论