网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

温湿度采集系统C#

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
C#温湿度采集系统C#目   录
摘   要 3ABSTRACT 4前   言 5第一章  绪  论 6•1.1 研究背景 6•1.2 设计内容 6•1.3 技术路线 7第二章 技术背景介绍 9•2.1 C#.NET技术 92.1.1 .NET平台概述 92.1.2 C#语言介绍 12•2.2 ADO.NET技术 132.2.1 ADO.NET概念 132.2.2 数据库的连接 142.2.3 数据库操作 152.2.4 访问数据库 162.2.5 其他组件介绍 17•2.3 XML技术 182.3.1 XML简介 182.3.2 XML的特点 182.3.3 应用XML 182.3.4 访问XML技术 19•2.4 技术路线比较 20第三章  系统软件设计 23•3.1 需求分析 23•3.2 系统结构设计 23•3.3 程序结构设计 243.3.1 主界面设计 253.3.2 参数设置界面 263.3.3 数据输入界面 273.3.4 数据查询界面 283.3.5 帮助界面 29•3.4. 数据库设计 30•3.5  XML设计 32•3.6 串口通信协议 32第四章  软件系统实现 34•4.1 数据部分实现 34•4.2 数据库实现 38•4.3 XML技术实现 42第五章  系统测试及误差分析 46•5.1系统调试 46•5.2误差分析 47•5.3 .NET的开发调试方法 475.3.1断点调试 475.3.2 跟踪和调试 47结 论 49总结与体会 50谢 辞 51参考文献 52附录一:翻译英文部分 53附录二:翻译中文部分 116
 

温湿度采集系统,单片机;串行通信;数据交换  论文 摘   要
 
随着计算机技术的飞速发展和普及,数据采集系统也迅速地得到应用。温湿度数据采集系统的主要功能是把模拟信号变成数字信号,并进行分析、处理、存储和显示。本设计要求在Windows环境下实现PC机与单片机之间的串口通信,以PC机作为上位机,单片机作为下位机。考虑到C#编程语言具有面向对象的设计方法,友好的用户界面等优点,通过串口RS232进行串口通信把温度、湿度、露点数据传送给PC机,显示在用C#语言开发的一个可以显示温湿度数据的界面上,再进行相关的数据处理。本设计在此基础上还设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。相关部分附有程序流程图,程序代码。
经实验证明本系统的稳定性良好,测量误差在允许的范围之内,能够满足实验对数据采集和记录的要求和相应的精度要求。   
 
关键词:单片机;串行通信;数据交换;
   ABSTRACT 
With the rapidly development of computer technology and penetration, the data acquisition system are also rapidly applied. Temperature and humidity data acquisition system’s main function is translate analog signals into digital signals,and then to analysis, processing,storage and display.The design’s requirements beyond the Windows environment is to achieve communication between PC and the serialport. Consider PC as a microcontroller, SCM as the next machine.
Taking into account the C # programming language has object-oriented
design and friendly user interface, and other advantages .Through a serial RS232 implement serial communication and transmit the temperature, humidity, dew
point to the PC and show the temperature and humidity data on the interface which is develop with the C #  language, and then begain the data processing . The design not only design the overall program, but also has the ability to achieve the various functional modules between the hardware and software that  are basis on function of the system. There are some revelant charts and procedures code to show.
The experiment has proved that the stability of the system is well, and measurement accuracy is also in the allowable scope, able to meet the experimental data acquisition and recording of the request and the corresponding accuracy. 
Key Words:Singlechip;Serial Communication;Data Exchange;
 

论文前言
 
本次毕业设计的主要任务是温湿度数据采集系统—上位机驱动程序的开发。通过串口RS232实现单片机与PC机之间的通信,数据的传送。PC机与单片机构成的上位机、下位机分布式控制系统是一种常见的工业控制系统,单片机作为下位机可进行现场数据采集和就地控制,并可将采集到的数据或者状态信息传送到上位PC机,以做进一步的分析处理。本文论述了了在C#.NET环境下如何实现单片机与PC机之间串行通信所需条件,以及运用C#语言开发数据传送的界面,通过对控件的编程实现数据库的连接和XML技术的操作等问题。
随着科学技术的飞速发展,数据采集系统的应用越来越广泛。在生产过程中,应用这一系统可对生产现场的工艺参数进行采集,监视和记录,提高产品质量,降低成本。在科学研究中,应用数据采集系统可获得大量的动态信息,是研究瞬间物理过程的有力工具,也是获取科学奥秘的重要手段之一。
本论文总共分为五章来论述整个设计的内容。其中,第一章主要从三个方面展开论述选题的背景、意义,以及整个设计所采用的技术路线和应用。第二章论述了设计中用到的技术背景,分别从C#.NET技术、ADO.NET技术、XML技术等三个部分详细阐述技术路线的比较,重点介绍串口通信协议,以及单片机与PC机之间如何通信。第三章首先着重介绍整个系统框架的设计,以及程序结构框架的设计。然后主要从数据接收问题,访问数据库,XML操作等三个方面一一作详细说明。接下来,第四章讲述系统的功能实现,也分为四个方面:串口通信实现,数据传送实现,访问数据库实现,访问XML实现等。最后,第五章中简单涉及在整个设计的完成过程中,软件调试出现的问题及解决方案。
本文主要围绕单片机与上位机之间的串口通信问题进行展开的,其中涉及到数据库的知识和XML技术,在今后的学习中,有待进一步深入讨论和交流。 
2008年6月4日
 
第一章   绪  论
 
·1.1 研究背景
随着信息领域各种技术的发展,在数据采集方面的技术也取得了很大的进步,采集数据的信息化是目前社会的主流发展方向。各种领域都用到了数据采集,在石油勘探、地震数据采集领域已经得到应用。随着测控技术的迅猛发展,以嵌入式计算机为核心的数据采集系统己经在测控领域中占到了统治地位。数据采集系统是将现场采集到的数据进行处理、传输显示、存储等操作。数据采集系统的主要功能是把模拟信号变成数字信号,并进行分析、处理、存储和显示。温湿度数据采集系统广泛的应用于人们的日常生活中,而驱动程序的开发让实时操作与监控更方便。基于Windows环境下利用VS.NET Framework平台开发的驱动程序也具备这些特点。其中温湿度数据采集系统就是基于这个原理来采集外界的温度、湿度及露点,利用上位机对数据进行处理。总之,不论在哪个应用领域中,数据采集与处理越及时,工作效率就越高,取得的经济效益也越高。
 
·1.2 设计内容
该设计硬件部分核心器件为AT89C51单片机。通过编写大量汇编程序来支撑单片机实现温湿度接收、转换、存储和显示等,最终温湿度用数码管显示出来。软件方面通过串口RS232进行串口通信把温湿度数据传送给PC机。鉴于PC机具有强大的监控和管理功能,单片机具有快速以及容易控制的特点,在数据量不大、传输要求不高的情况下,采用给PC机配置的RS-232标准串行接口COM1、COM2等相连接来实现单片机系统与PC机之间的数据交换。该设计软件方面是在Windows XP环境下,对Visual Studio C#.NET中的串口组件进行编程实现单片机与PC之间的串行通信,其通信线路通过RS232连接,通过串口RS232进行串口通信把温度数据传送给PC机,显示在用C#.NET编辑的一个温湿度数据显示的界面上,再对数据进行处理存储在数据库中,并且以XML文档的格式存储。
PC机与单片机的通信接口电路框图如图1.1所示:
若图片无法显示请联系QQ3710167,C#温湿度采集系统管理系统免费,转发请注明源于www.lwfree.cn
图1.1 PC机与单片机通信接口电路
   其中:  2脚:RxD,串行数据接收引脚,输入。
3脚:TXI),串行数据发送引脚,输出。
5脚:GND。
·1.3 技术路线
根据本系统设计的要求及功能,采用的技术路线有以下几种:
一.C#.NET语言
本系统是在C#.NET环境下设计Windows Form,该窗体是在设计程序时,用来制作用户数据输入输出界面的基本对象窗体,是整个用户界面的框架。所以系统设计之前,必须熟悉C#.NET的开发环境,以及掌握C#语言的编程规则。在熟悉了工具箱提供的控件及其功能后,依照本系统需要的实现功能,对所需的控件,进行编程实现。
二. ADO.NET技术
 C#.NET中对数据库的访问是通过ADO.NET来实现的,使用ADO.NET作为数据库存取的接口。ADO.NET是ADO的升级版本,专为Microsoft.NET平台量身打造,采用离线存储模式,可供多人同时存储,特别适合在Internet环境中使用。基于温湿度数据采集系统—驱动程序开发的目的,系统要求:当通过串口通信将采集到的温湿度显示在Windows Form界面上,对数据进行处理,然后自动存储在数据库中,提供用户输入、查询记录等功能。因此,在对数据库操作之前,需了解各种数据库的连接方式,以及进行插入、修改、查询等操作相关的SQL语句。另外,在引用数据库之前需在库文件中添加数据库的命名空间。
三. XML技术
  .NET是基于XML的,XML具有跨平台性和简洁性,在.NET框架结构中,XML当作一种应用间无缝接合的手段,用于多种应用之间的数据处理,不同应用之间的互操作和协调工作。在系统设计中,当采集到的温湿度数据存放在监控信息表格中,通过编程使数据自动生成XML文档保存,并存放在指定的路径下,供用户查看记录。因此,进行XML文件操作必须掌握XML文档的语法、写入及读取的编程规则等相关知识,了解XML的应用。在引用之前,需在库文件中添加相应的XML的命名空间。
 
温湿度采集系统C#
第二章 技术背景介绍
 
·2.1 C#.NET技术   
2.1.1 .NET平台概述
Microsoft.NET将开创程序开发的新局面,特别对网络程序的开发有很大的推动作用,该平台提供一种更有效更强大的Web服务;而在应用程序方面,.NET平台下的开发也变得更简洁,通过其丰富的,功能强大的类库可以很快地开发所需求的程序。
一. Microsoft.NET平台包括:
(1) 创建和操作新一代服务的.NET基础结构和工具。
(2) 启用大量客户机的.NET User Experience.NET。
(3) 建立新一代高度分布式的.NET组件服务。
(4) 启用新一代互联网设备的.NET设备软件。
二..NET架构如图2.1所示:                    图2.1 .NET架构结构图 
 
1.通用语言运行库
Common Language Runtime(CLR)是.NET架构中最基本的部分,包含程序代码的编译、安全性的控管、类库与可执行文件的缓存等功能。
2.基类库
   .NET Framework为了达到不同语言在类库上的统一,定义了基类库(Base  Class  Library),为了让这一组类库能够广泛适应开发各类型应用程序,因此库类中包含了几百个类,内容包含了Windows窗体、控件、 Web应用程序中的状态处理、 缓存、XML等。
 3. ADO.NET与XML
    ADO(ActiveX Data Object)与ADO.NET最主要的差别在于内存中处理数据的方式不同。在ADO中使用记录集(Recordset)处理数据,而在ADO.NET中则使用数据集(Dataset)。
 4. Windows窗体与Web窗体
    新一代的Web应用程序开发使用ASP.NET技术,除了延续ASP容易使用的特点之外,现在更将程序代码与界面设计(HTML)分开,并使用类似Windows窗体的开发方法来开发Web应用程序,因此可以像开发Windows窗体一样,完全以面向对象的观念来设计Web应用程序,以便简化程序设计流程。
   在数据库支持方面,不论是Windows窗体还是Web窗体,都支持控件的数据绑定功能,可以轻易地将数据库中的数据字段,动态绑定到控件上,大幅度简化数据库应用程序的开发过程。
5.通用语言规范
   在.NET构架中定义了一个通用语言规范(Common Language Specification,CLS),包括函数(类的方法)调用方式、参数传递方式、数据类型、异常处理方式等,只要符合这个规范的程序语言,就可以使用。
在程序语言的数据类型上,CLS使用通用类型系统(Common Type System)来定义语言的数据类型。
6.程序语言
.NET支持多种语言,仅.NET架构就默认至少支持Visual Basic.NET与C#两种语言。
7.跨平台的.NET
 .NET上的组件在第一次执行时必须经过CLR的编译后才能真正交给CPU执行。
 
三. NET开发环境:
1 .NET平台的运行对硬件的要求如下:
(1)计算机/处理器
建议配置:装有450MHZ Pentium Ⅱ级别处理器的PC。
最低配置:装有300450MHZ Pentium Ⅱ级别处理器的PC,否则编译过程运行异常缓慢。
 (2)RAM的最小要求
Windows XP Professional     : 160 MB RAM。
Windows 2000 Professional   : 96 MB RAM。
    Windows 2000 Server         : 192 MB RAM。
    Windows NT 4.0 Workstation  : 64 MB RAM
 (3).硬盘
    标准版:在安装驱动器上有2.5GB,包括系统驱动器上的500MB。
    Professional 和Enterprise版:在安装驱动器上有3.5GB,包括系统驱动器上的500MB。
(4).驱动器
    CD-ROM或DVD-ROM驱动器,用以使用光盘,装入开发平台程序,不过也可以选择网络安装方式。
 (5).显示器
     Super VGA(800×600)或更高分辨率的256色显示器。
 (6).输入设备
     Microsoft鼠标或兼容的指针设备。
 
2. .NET平台的运行对软件的要求如下:
C#作为.NET基础上的一门开发语言,因此C#的开发环境首先应该满足.NET的运行需要。一般来说 ,.NET的运行在软件方面有如下需求:
(1).操作系统
 Microsoft Windows NT4.0或更高版本的操作系统,包括Microsoft Windows 2000系列, Microsoft Windows 2003系列,不支持Microsoft Windows 95、Microsoft Windows 98、Microsoft Windows Me等操作系统。
(2).Framework
Framework是.NET的支持基础,包含.NET平台的运行库与公共语言运行时,所有的.NET平台下的程序都需要基于它的类库来建立程序,而所有的程序也需要先编译为中间语言(IL)然后由公共语言运行时管理执行。
(3).MDAC
当要使用数据库、XML等对象的时候,.NET还要一个基本组件—MDAC(Microsoft Data Access Components),即微软数据访问组件。几乎所有的Windows平台下的数据库访问都是由这些组件来完成的,因此,对于.NET数据库开发来说, MDAC是一个不可缺少的部分。.NET需要MDAC2.7以上版本。
(4).其他需求
如果要在.NET平台下开发Web站点的话,还需安装FrontPage服务扩展和Internet Explorer5.5以上的浏览器。
 
2.1.2 C#语言介绍
      C#是一种现代的面向对象的程序开发语言。使用C#语言设计的组件能够用于Web服务,这样通过Internet,它可以被运行于任何操作系统上的编程语言所调用。与C与C++相比较,C#比它们更简洁、更加高效。C#没有丢失C与C++的基本特点—强大的控制
 

温湿度采集系统,单片机;串行通信;数据交换
能力和高度的灵活性,在很大程度上,C#与C及C++有着很多相似之处。
   C#语言的特点如下:
C#是专门为.NET的应用而开发的语言,这从根本上保证了C#与.NET的完美结合。在.NET运行库的支持下,.NET的各种优点都能通过C#体现出来。C#的特点如下:
(1)语法简洁
    在.NET平台上,C#代码不允许直接对内存进行操作。对类、方法的引用的操作符变得十分简单,只有一个“.”。
(2)面向对象设计
    在C#的类型系统中,每种类型都可以看作一个对象。C#提供装箱和拆箱机制来完成对象操作。
    C#只允许单继承,即每个类都不能存在多个基类,这在根本上避免了类型定义的混乱,而且C#没有全局函数,没有全局变量。任何对象都必须封装在类中。这使得代码具有更好的可读性,而且也减少了因命名而带来的冲突。
(3)与Web紧密结合
    .NET平台设计的一个重要考虑因素就是使应用程序的解决方案与Web标准相统一,需要能与HTML和XML语言建立联系。
(4)完善的安全性和错误处理
    在C#的设计中可以消除软件开发过程中许多常见的错误,并提供包括类型安全在内的完整的安全机制;另一方面,C#会帮助开发者以更少的代码来实现同样的功能,这在减轻程序员工作负担的同时也能降低错误发生的可能。
    C#不支持不安全的指向,C#会对指向的有效性进行验证。另外C#还提供了边界检查和溢出检查功能。
     
·2.2 ADO.NET技术
2.2.1 ADO.NET概念
ADO.NET是微软新一代.NET数据库的存取结构,ADO是ActiveX  Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据存取架构,用来开发数据库应用程序。在ADO.NET中最重要的两个概念就是Managed Provider和DataSet。Managed Provider提供了DataSet与数据库之间的联系,并可以通过数据集命令将所需要的数据填充到DataSet中。DataSet是不依赖于数据库的独立数据集合,即使数据连接断开, DataSet依然是可用的。通过DataSet, ADO.NET访问数据库的步骤为:
(1) 创建一个与数据源的连接;
(2) 请求一个数据集合;
(3) 将集合放入DataSet中;
(4) 关闭数据连接;
(5) 在DataSet上进行所需要的操作;
(6) 将DataSet的变化更新到数据库中;
2.2.2 数据库的连接
    Connection对象是.NET数据提供程序的一个组件。.NET框架中的数据提供程序用作应用程序和数据源之间的桥梁,并且用于从数据源检索数据,以及协调对返回到数据源的数据的更改。
1.数据库的连接过程如图2.2所示:
2.各种数据库的常见连接字符串方式:
(1) 连接SQL Server数据库
 SQLClient方式:
 Sever=服务器名;uid=用户名;pwd=密码;database=数据库名;
 OleDb方式:
 Provider=SQLOLEDB;DataSource=服务器名;uid=用户名;pwd=密码;Catalog=数据库名;
 Odbc方式:
 Driver={SQL Server};Server=服务器名;Database=数据库名;uid=用户名;pwd=密码若图片无法显示请联系QQ3710167,C#温湿度采集系统管理系统免费,转发请注明源于www.lwfree.cn

图2.2 数据库连接过程图
(2) 连接Access数据库
 OleDb方式:
 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=数据库路径;
 Odbc方式:
 Driver={ Microsoft Access Driver(*.mdb)};Dbq= “数据库路径”;Uid=;Pwd=;   3.打开与关闭连接
Connection对象提供下列两种常用方法:
·Open()方法:用来建立并打开一个数据库的联机;
·Close()方法:将数据库的联机关闭;
2.2.3 数据库操作
 使用Command执行数据库操作一般有以下3个步骤:
  (1)建立数据库连接,使用Connection对象的Open()方法;
  (2)执行数据库操作,使用ExecuteReader()方法或ExecuteNonQuery()来执行数据库命令;
  (3)关闭数据库连接,使用Connection对象的Close()方法;
   针对不同的数据库调用模式,不同的模式访问数据库对应的Command也不同,如下:
 ◇ SQLClient模式下为:SqlCommand;
 ◇ OleDb模式下: OleDbCommand;
 ◇ Odbc模式下: OdbcCommand;
Command命令可以根据所设定的SQL语句的功能,自动选择SelectCommand 、InsertCommand、 UpdateCommand 、和DeleteCommand等命令,从而实现对数据库的各种操作。
(1) 插入数据
     插入数据用在将信息添加到数据库中,SQL语句的格式为:
     INSERT into TableName VALUES (‘第一列的值’,’第二列的值’,…)
  (2) 修改数据
     修改数据用于对数据库中已有数据进行更新,SQL语句的格式为:
UPDATE TableName SET…WHERE…
  (3) 查询数据
        查询数据是通过数据库检索命令从数据库中获得一个数据库集,再将数据集通过格式处理呈现于页面。SQL语句格式为:
       Select…from TableName Where…Order…。
   (4) 删除数据
       删除数据用于删除数据库中符合特定要求的数据,SQL语句的格式为:
       DELECT from TableName where…。
 
2.2.4 访问数据库
    在ADO.NET中,Windows平台下主要有3种数据库访问模式:OLEDB模式、ODBC模式、SqlClient模式。
    (1) OLEDB模式
OLEDB模式主要用于访问OLEDB所支持的数据库。OLEDB是Microsoft开发的一种高性能、基于COM的数据库技术。OLEDB和其他Microsoft数据库技术的不同之处在于
 

温湿度采集系统C#
OLEDB提供通用数据访问的模式。OLEDB数据提供程序通过OledbConnection对象提供了与使用OLEDB公开的数据源的连接以及与Microsoft SQL Server版本6.x或较早版本的连接。
(2) ODBC模式
ODBC模式主要用于访问ODBC所支持的数据库,该模式是Windows平台下的一种通用数据访问模式。一般在Windows平台下存在的数据库都可以通过建立系统DSN来实现对数据库的调用。
(3) SQLClient模式
SQLClient只用于访问 MS SQLServer数据库,是ADO.NET中的比较特殊的组件。使用SQLClient模式需要引入的命名空间有:System.Data,System.Data.SQLClient。
 
2.2.5 其他组件介绍
   DataAdapter将数据从数据库中取出后,填充到DataSet中,然后让DataSet充当程序调用的缓冲数据源,最后还可以将结果反馈到数据库,这就是DataAdapter与DataSet访问数据的操作模型,如图2.3所示:
        图2.3 数据库访问模型
    DataAdapter表示一组数据命令和一个数据库连接,用于填充DataSet和更新数据源。它作为DataSet和数据源之间的连接器通过映射Fill向DataSet填充数据,通过Update向数据库更新DataSet中的变化。
    DataAdapter的使用方法为:
    SqlDataAdapter myCommand=new SqlDataAdapter(Sql语句,数据库连接对象);
DataSet表示数据在内存中的缓存。无论包含的数据来自什么数据源,它都会提供一致的关系模型编程。一个DataSet表示整个数据集,其中包含对数据进行包含、排序和约束的表以及表之间的关系。
    定义DataSet的方法为:
    DataSet 名称=new DataSet();
然后可以使用DataSet作为数据源了,在使用的时候可以直接访问某一个数据。可以用DataTable和DataView显示数据。另外,dataGrid是.NET中常用的数据绑定控件,它可以与DataSet配合实现强大的数据显示、数据处理功能。
 
·2.3 XML技术
2.3.1 XML简介
     XML是Extensible Markup Language的缩写,是一种可扩展标记语言,是由全球信息网络协会,将SGML的格式精简后制定的新标准,可以用来定义一种新的标记语言。XML文档是网页的最新标准。XML制定的标记语言,主要是用来解释该文件的数据与结构。在XML中,标记只用于描述数据,XML使数据、表示所以XML文档容易解读、组合,也就是说XML文档可以被任何的应用软件解读,所以使用XML文档将是未来电子商务的趋势。
 
2.3.2 XML的特点
XML主要具有以下几个特点:
(1)    简洁有效。
(2) 易学易用。
(3) 开发的国际化标准。
(4) 高效可扩充。
 
2.3.3 应用XML
C#为XML技术提供了很好的支持。 System.XML命名空间中的XML类提供使用XML文档和数据的功能。XML类支持分析和编写XML文档、编辑内存中的XML数据、数据验证、以及XSLT转换等。
(一). XML的读取
XML的读取可以通过XmlReader类来实现。
    XmlReader类是一个提供对XML数据的非缓存、只进只读访问的抽象基类。而且它支持从流或文件读取XML数据。该类定义的方法和属性支持浏览器数据并读取节点的内容,其中当前节点指读取器所处的节点。使用任何返回当前节点值的读取方法和属性推进读取器。
XmlReader的功能如下:
□ 检查字符是不是合法的XML字符,元素和属性的名称是不是有效的XML名称。
□ 检查XML文档的格式是否正确。
□ 根据DTD或架构验证数据。
□ 从XML流检索数据或使用提取模型跳过不需要的记录。
若要读取XML文档中数据记录,可以通过DataSet对象的ReadXml方法实现。
(二).XML的写入
    XML文件的写入可以通过类XmlWriter实现。XmlWriter类是一个抽象基类,提供只进、只写、非缓存的方式来生成XML流。
    XmlWriter实例使用静态System.XML.XmlWriter.Create方法创建。XmlWriterSettings类用于指定要在新的XmlWriter对象上启用的功能集。使用XmlWriterSettings类的属性启用或禁用功能。通过将XmlWriterSettings对象传递给Create方法,指定要支持的写入器功能。
    DataSet对象的WriterXml方法可将内存中更新完成的DataSet对象写回指定的XML文档中。
 
2.3.4 访问XML技术
     方法一: 通过DataSet访问XML
     通过DataSet访问XML一般先将XML数据载入到DataSet中,使用的是XmlReader命令;如果要将DataSet中的数据写成XML的话,一般用到的是XmlWriter命令。
 方法二: 通过DOM访问XML
    DOM(Doeument Object Module)是 W3C制定的一种基于树形结构的独立语言和平台的标准,它提供一个可以通用于各种程序语言、操作系统和应用程序的接口,它定义了文档的逻辑结构以及存取和维护文档方法。利用 DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。DOM是对XML数据的描述体系,它用树型结构的文档来保存XML数据,它包括了对XML的解析和处理XML数据的API 。
    Microsoft的.NET围绕 XML这一核心提供一个强大而快速的开发语言C#,C#完全支持 DOM模型。使用 DOM 模型的优点在于它允许编辑和更新 XML文档,可以随机访问文档中的数据,可以使用 XPath查询。XPath即XML路径语言(XML Path Language),是一种用于在 XML文档中定位节点的语言,XPath对于 XML查询类似于 SQL对于数据库查询,非常方便。DOM是XML一个很重要的接口,它提供良好的机制对XML文档中的节点进行操作和访问并且很大程度上保证了各平台之间的互操作性。
 
·2.4 技术路线比较
    现今应用比较广泛的编程语言主要有C# 、Java、C/C++等。简单地说,它们不是一种语言,语法有差别,编程时具体用到的类库或者函数库也不一样。虽然它们不是一种语言,不过却也有所联系。广泛地说,C可以看作其他三种语言的源语言,因为其他三种语言几乎都是从C而来的,无论从数据类型还是控制语句看,其他三种语言都有从C得来的迹象。
Java和C#都比较高级,可以看作高级语言的高级语言,优点是开发容易,但运行效率不如更为底层的C/C++。
具体选择使用的时候,可以根据实际的项目需要选择。运行效率要求高的,底层控制要求高的用C/C++,否则可以选择Java或C#;跨平台的要求高的可以用Java。关于跨平台,C/C++也是很好的语言,因为所有平台都支持,不同的是,不同平台支持的实现不同,类库不同,要编写跨平台的程序,需要选择跨平台的类库。
如下表格1.2所示为C#、 C++ 、Java重要功能的比较:
 

温湿度采集系统C#
C#与Java作为目前两种最具有潜力的语言,在进行比较的话,C#有这样一些优点:
(1) C#面向对象的程度比Java高
  C#中的基本类型都是面向对象,例如:当定义一个int类型的变量以后,就可以通过这个变量来访问int类型的成员。实际上,C#每一个基本类型都内建了相应的类,如int→Int32。Int32是系统提供的一个类,基本类型int就映射为类Int32。
  在Java中找不到这样的内建关系。Java只是提供了操作这些基本类型的工具类。如:Interger对应于int。但是这只是一个简单的操作基本类型的工具,int在Java中并不是基于对象的。
  C#参考了大多数面向对象的语言,并且解决已有的面向对象语言的一些弊病,可以说,C#大大提高了面向对象语言的技术和实用性。
(2) C#具有比Java更强大的功能
  C#拥有Visual Basic开发的快捷和C++的强大特点。任何Visual Basic和C/C++程序所能做到的都可以用C#语言简单的实现。也就是说在Windows平台下,C#足以取代Visual Basic和C/C++。而且C#较Java在面向对象开发上要简单。C#提供了语言面向对象的技术和思想,结合了面向模块和面向对象的技术,使用户使用起来更方便 、更快捷。C#还提供了非常大的兼容性,可以用C#调用已有的Visual Basic、C/C++,COM和VBX等,几乎可以把它当作是所有微软产品的总接口。
(3) C#的速度比Java快
  为了跨平台C#也采用了JIT编译器,但不是简单的移植和套用原有的JIT技术,而是进一步发展与提升,所以C#比Java的执行速度快。
第三章  系统软件设计
 
·3.1 需求分析
    温湿度数据采集系统是利用单片机及传感器对外界的温湿度进行数据采集的系统。随着计算机技术的发展,上位机的应用越来越广泛。而温湿度数据采集系统—上位机驱动程序开发目的就是实现一套无纸化的实时操作系统,将采集到的数据在利用C#语言开发的界面上显示,并且可以以多种方式存储,供读者查询。本系统主要实现以下供能:
◇ 数据显示:显示温度、湿度、露点。
◇ 操作日志:显示当前的串口操作信息。
    ◇ 监控信息:记录当前的数据信息。
    ◇ 数据输入:将数据保存到数据库。
◇ 数据查询:可查询记录的数据信息。
◇ 帮助功能。
 
·3.2 系统结构设计
综合考虑本系统的功能,系统应该以数据为中心。系统主要处理的是一个数据的交互问题,即保障上位机与硬件设备的通信正常。在通信正常的情况下,上位机将采集到的数据进行处理,因此本系统的底层采用Access数据库支持。前台采用C#.NET设计的Windows窗体应用程序,实现一个C/A模式的结构。并通过对Windows窗体的设计,使能实现对数据进行显示、保存、查询等功能。若图片无法显示请联系QQ3710167,C#温湿度采集系统管理系统免费,转发请注明源于www.lwfree.cn
本系统的总体流程图如下图3.1所示:
3.3 程序结构设计
根据系统要实现的功能,整个系统的程序框架设计可分为四个部分来完成,即接收发送数据部分、连接数据库部分、保存为XML文档部分、其他帮助功能等。其中,每个部分的模块再根据要求详细设计。由于整个设计的功能实现是基于C#.NET环境下制作的窗体的,因此每个部分模块都是以窗体的形式实现。整个程序的框架如图3.1所示:
3.3.1 主界面设计
    在一个应用程序中必须对界面进行良好的设计,使其既能完成程序的功能,有能使用户方便地使用。本系统主界面采用通用的MID窗体模式,实现的功能有:当数据通过RS232传送到上位机,能在界面上显示,通过操作菜单栏,对数据进行处理,如输入数据,发送数据、参数设置、查询、帮助等功能。其界面设计如图3.3所示:
     

                    图3.3     主界面
该界面中添加了主菜单、快捷栏和状态栏,主菜单中囊括了主要的功能,快捷栏可方便用户快速进行操作,状态栏可用于显示串口信息和系统时间等。另外,通过对组件进行编程,界面可以显示和发送数据。
3.3.2 参数设置界面
  该界面主要实现对串口参数的设置,保存等功能。依次在每个复合框中填入数据,根据硬件设备的串口配置参数,选定合适的串口参数进行操作,通过下拉复合框可对参数进行设置修改,保证串口通信的正常。其界面设计如图3.4所示:
 
温湿度采集系统,单片机;串行通信;数据交换
可通过以下代码进行连接:
     private void open_sysConfigs_Click(object sender, EventArgs e)
    {
       SerialPortSettings slPortSettings = new SerialPortSettings();
       serialPortSettings.ShowDialog();
 }
3.3.3 数据输入界面
该界面用于将采集到的温度、湿度、露点存储在数据库中,用DataGridview对数据进行绑定显示。然后对该数据库进行各种操作。点击”退出”按钮即可退出数据输入界面。
数据输入界面如图3.5所示:

                     图 3.5    数据输入界面
该界面连接代码如下 : 
private void btn_insertdata_Click(object sender, EventArgs e)
    {
      insertdata  new insertdata();
      ff.ShowDialog();
     }
3.3.4 数据查询界面
    该界面用于用户查询记录的数据信息。用DataGridView显示查询的结果。“删除”按钮可以清除当前DataGridView中的内容,点击”退出”按钮即可退出查询界面。
    数据查询界面如图3.6所示:

                       图3.6    数据查询
该界面连接代码如下 :
private void seledata_Click(object sender, EventArgs e)
     {
         selectdata selectdata = new selectdata();
         selectdata.ShowDialog();
      }
3.3.5 帮助界面
   该界面用于帮助用户了解温湿度数据采集的功能,通过访问该界面还可以了解C#.NET的开发环境及应用背景。
   帮助界面如图3.7所示:

图3.7    关于数据采集系统
     该界面连接代码如下:
     private void tst_Describe_Click(object sender, EventArgs e)
     {
         myProject Project = new myProject();
         myProject.ShowDialog();
      }
     
·3.4. 数据库设计
   本系统是在Access 2003环境下建立数据库的。一个数据表在建立时,一定要先规划好各个字段的属性设置,然后才进一步输入记录数据。建立的数据表有data表和parament表。表的设计如下:
    (1) data表设计
    data表格主要是用来存放采集到的温度、湿度和露点的数值,供用户进行新增、修改、查询等操作。
表中各字段的属性说明如下表3.8所示:
                        表3.8  data表





字段名称

数据类型

备注


编号

文本

主键


温度

文本




湿度

文本




露点

文本




记录日期

时间




记录时间

时间


    (2) parament表设计
       Parament表格是用来存放串口参数的设置值。可供用户进行更新操作。
            表中各字段的属性说明如下表3.9所示:
                              表3.9  Parament表





 字段名称

数据类型

字段说明

备注


Para_ID

文本

参数编号

主键


Para_Name

文本

参数名称




Para_Value

文本

参数数值




Para_Atti

文本

参数属性




Para_Des

文本

描述


 
 
 
             
 
 
 
      连接数据库的代码为:
      {
   string connStr;
         connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ff.mdb";
         OleDbConnection conn= ne OleDbConnection(connStr);
         conn.Close();
 
温湿度采集系统C#
3.5  XML设计
    当数据显示在界面上,进行分割处理存储在监控信息的表格中后,可自动生成XML文档保存。本系统中采用DOM和DataSet方式访问XML的。
 
·3.6 串口通信协议
所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度,传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。根据硬件设备的参数,设置好串口参数后,打开串口, 若接收到“R”,则发送“2”回复单片机,表示开始接收数据。最后对接收到的数据进行处理。
串口程序运行时的流程图如下图3.10所示:
设置的串口通信参数如下表3.11所示:
                        表3.11  串口参数设置





串口号

COM1


波特率

9600


数据位

8


停止位

1


校验位

None
本系统中的程序只是利用 C#语言和串口通讯控件实现数据的收发,其实可以在此基础上开发出更为强大的通信处理程序,比如可以 利用c#强大的多线程机制,同时进行多个串口数据的收发处理,因为C#语言的优势,我们可以容易的将数据转换为 xml文件或者发布到网络,或者轻松存入不同的数据库。所以利用 C# 开发通用串口程序具有比其他语言更好的优势,具有更好的应用前景。
 
温湿度采集系统,单片机;串行通信;数据交换
第四章  软件系统实现
 
·4.1 数据部分实现
在整个系统的设计过程中,数据的接受和发送是最为重要的部分,因为数据的处理都是以这个部分为前提,因此,在进行设计时,一定要掌握C#.NET环境下,串口通信部分的实现,以及串口通信协议。下面分别介绍串口打开、关闭、数据接受与发送等部分程序的代码。
(1) 打开串口程序如下:
      private void myopen()               //定义myopen()函数
      {
        try
        {
          if (!this.seriPort1.IsOpen)    //当串口打开时
           {
              this.serialPort1.Open();     //打开一个串口连接
              this.tsbtn_openSerialPort.Text = “关闭串口”;
              this.tsbtn_openSerialPort.Tag = 1;
              this.tsbtn_autoMonitor.Enabled = true;
              this.btn_Send.Enabled = true;
                          this.tsl_connection.Image = global::SerialPortTerminal.Properties.Resources.connect;
              this.tsl_connection.ToolTipText = “串口连接已开启”;
              this.tssl.Properties.Resources.connect;
              this.tssl_logs.Text = “串口连接已开启”;
              this.tssl_logs.ToolTipText = “串口连接已开启”;
             }
          }
              catch (Exception ex)          //捕获异常,当前串口已被占用
              {
                MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);  
           }
      }
 
(2) 关闭串口程序如下:
         private void myclose()            //定义myclose()函数
        {
           if (this.ialPort1.Close();     //关闭一个串口连接
 this.tsbtn_openSerialPort.Text =“打开串口”; 
              this.tsbtn_openSerialPort.Tag = 0;
              this.tsbtn_autoMonitor.Tag = 0;
              this.tsbtn_autoMonitor.Text = “开始监控”;
              this.tsbtn_autoMonitor.Enabled = false;
              this.btn_Send.Enabled = false;
              this.tsl_connection.Image = global::SerialPortTerminal.Properties.Resources.disconnect;
              this.tsl_connection.ToolTipText =“串口连接已关闭”;
              this.tssl_logs.Image = global::SerialPortTerminal.Properties.Resources.disconnect;
              this.tssl_logs.Text =“串口连接已关闭”;  
              this.tssl_logs.ToolTipText =“串口连接已关闭”;
            }
        }
          private void openSerialPort_Click(object sender, EventArgs e)
         {(this.openSerialPort.Tag); //定义一个串口标志变量
         if (i == 0)     //当串口未打开时
          {
            myopen();    // 执行打开串口函数
           }
         else
          {
            myclose();  //否则,执行关闭串口函数
           }
        }
 
(3) 数据接收程序:
                  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
       {
         int iSum = 0;                  //定义一个变量
         string strTemp1 = “”;          //初始化变量
         byte[] bTemp = new byte[4096]; //赋值接收字符串最大长度
         if (serialPort1.IsOpen)        //如果串口已打开
         {
          (1000);         //控制线程
          iSum =t1.BytesToRead;   //赋值按字节读取
          int iRel = serialPort1.Read(bTemp, 0, iSum);
          serialPort1.Close();         // 关闭串口
          //strTemp1 = Encoding.Unicode.GetString(bTemp, 0,iSum).ToString();         //转换字符
                    strTemp1 = strTemp1 + Encoding.ASCII.GetString(bTemp, 0,iSum).ToString();        //字符按ASCII编码
 
温湿度采集系统,单片机;串行通信;数据交换
  SetText(strTemp1);            //调用线程
}
          if (!serialPort1.IsOpen)    //如果串口关闭
          {
           serialPort1.Open();      //打开串口
          }
      }
      delegate void SetTextCallback(string strText); //线程安全
      private void SetText(string strText)    //定义线程
      {
       if (this.richTextBox_Receive.InvokeRequired)
       {
         SetTextCallback d = new SetTextCallback(SetText);
         this.
        else
        {
          richTextBox_Receive.Text = strText; //赋值给
richTextBox_Receive.Text
          }
      }
程序运行后结果如图4.1所示:

                        图 4.1 数据接收
 
(4)数据发送程序:
   private void btn_Send_Click(object sender, EventArgs e)
   {
     string senddata = “2”;   //回复
    //senddata = Encrypt(senddata);//把字符串转换为字节数组
     this.serialPort1.WriteLine(senddata);//把字节值写入缓冲区
    }
如图4.1所示界面,点击“发送”按钮即可发送指定数据,也可设定计时器的属性,设置为自动发送。
 
·4.2 数据库实现
当采集到的温度、湿度、露点显示在界面上,通过连接数据库,使其自动保存在数据库中,并且提供插入、修改、查询、更新等操作。
(1) 插入数据程序:
    private void btnAdd_Click(object sender, EventArgs e)
   {
     string strAnalysisTime = DateTime.Now.ToString();  //赋值记录时间
     string connStr, insertSql;  //定义变量
     connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ff.mdb";//连接数据源
     into data(温度,湿度,露点,记录时间)Values('" + txtTemp.Text + "','" + txtHum.Text + "','" + txtLu.Text + "','" + strAnalysisTime + "')";   //  设置插入数据
      OleDbCommand Icmd = new OleDbCommand(insertSql, conn);
      Icmd.ExecuteNonQuery(); //执行插入
      conn.Close();     //关闭连接
}
程序运行后结果如图4.2所示:

                  图4.2 数据插入
 
(2) 数据查询程序:
private void btn_select_Click(object sender, EventArgs e)
     {
    string sTime = select_Time.Value.ToString();
    int iSpace = sTime.IndexOf(" ");  
    string sdate = sTime.Substring(0, iSpace);
    string selectCmd = "SELECT * FROM data  WHERE 记录日期 = '" + sdate + "'";
    string connStr ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ff.mdb";
         OleDbConnection conn = new OleDbConnection(connStr); //建立连接
         OleDbDataAdapter myAdapter = new OleDbDataAdapter(selectCmd, conn);
         DataSet myDataSet = new DataSet();
         myAdapter.Fill(myDataSet, "data");
         dataGridView1.DataSource = myDataSet.Tables["data"];
        }
程序运行后结果如图4.3所示:
 
温湿度采集系统C#
(3)数据删除程序:
   private void btnDel_Click(object sender, EventArgs e)
   {
string sTime = select_Time.Value.ToString();
     int iSpace = sTime.IndexOf(" ");  
     string sdate = sTime.Substring(0, iSpace);
string connStr, delSql;
     connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ff.mdb";//连接数据源
     delSql = " Delete From data WHERE 记录日期= '" + sdate + "'";
 //删除指定的记录
     OleDbConnection conn = new OleDbConnection(connStr);//建立连接
     OleDbCommand Dcmd = new OleDbCommand(delSql, conn); ;//建立执行操作
     conn .Open();   //打开连接
     Dcmd.ExecuteNonQuery();//执行删除操作
     conn.Close();  //关闭连接  
 }
 
 (4)数据更新程序:
   private void btnUpdate_Click(object sender, EventArgs e)
    {
      string strAnalysisTime = DateTime.Now.ToString();
      string connStr, updateSql;   //定义变量
      connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ff.mdb";  //连接数据源
      OleDbConnection conn = new OleDbConnection(connStr);  //建立连接字符串
      updateSql = "Update data Set 温度='" + txtTemp.Text + "',湿度='" + txtHum.Text + "',露点='" + txtHum.Text + "',记录时间='" + strAnalysisTime + "' ";    //更新数据
      OleDbCommand Ucmd = new OleDbCommand(updateSql, conn);   //建立执行操作
      conn.Open();   //打开连接
      Ucmd.ExecuteNonQuery();   //执行更新操作
      conn.Close();    //关闭连接
}
 
·4.3 XML技术实现
    当数据显示在界面上,进行处理后以DataGrid的形式存在监控信息里,并且自动生成XML文档保存。供用户查看数据记录。
    1.串口参数程序代码:
     private static bool CreateXmlFile(string xmlFile)
      {
        try
        {
         XmlDocument xmlDocument = new XmlDocument();
//创建根节点
         XmlElement root = xmlDocument.CreateElement("AppSettings");
         //创建声明节点
                     XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null);
           xmlDocument.AppendChild(xmlDeclaration);
//创建子节点
          XmlElement xmlElement1 = xmlDocument.CreateElement("PortName");
            xmlElement1.InnerText = "COM1";
            root.AppendChild(xmlElement1);
          XmlElement xmlElement2 = xmlDocument.CreateElement("BaudRate");
            xmlElement2.InnerText = "9600";
            root.AppendChild(xmlElement2);
          XmlElement xmlElement3 = xmlDocument.CreateElement("DataBits");
            xmlElement3.InnerText = "8";
            root.AppendChild(xmlElement3);
          XmlElement xmlElement4 = xmlDocument.CreateElement("StopBits");
            xmlElement4.InnerText = "1";
            root.AppendChild(xmlElement4);
          XmlElement xmlElement5 = xmlDocument.CreateElement("Parity");
            xmlElement5.InnerText = "None";
            root.AppendChild(xmlElement5);
            xmlDocument.AppendChild(root);
           //创建或保存 XML 文档
            xmlDocument.Save(xmlFile);
           return true;
         }
          catch //(Exception ex)
          {
            return false;
           }
        }
程序运行后生成XML文档如下:
    
-
         COM1
         9600
         8
         1
         None
    

 
2.数据部分程序代码:
     internal static Boolean WriteXml(DataGridView dgView,string xmlFileName,string tableName,string tableNameSpace)    //将 DataGridView 生成 XML 数据存储文件
     {
      try
      {
       int rows = dgView.Rows.Count;   //赋值rows等于表格的行数
       if (rows > 0)     //判断如果行数大于零
       {
                    tableName = (tableName.Trim().Length > 0) ? tableName : "table"; // 判断,然后获取表名字
        tableNameSpace = (tableNameSpace.Trim().Length > 0) ? tableNameSpace : "";  // 判断,获取空间
        int columns = dgView.Columns.Count;  //赋值columns等于表格列数
                  DataTable dataTable = new DataTable(tableName, tableNameSpace); // 初始化dataTable
         for (int i = 0; i < columns; i++)   // 判断i小于列数
        {
         DataColumn dataColumn = new DataColumn();  //定义dataColumn
         dataColumn.DataType = System.Type.GetType("System.String");
         dataColumn.ColumnName = dgView.Columns[i].Name; //设置列的名称
                   dataColumn.Caption = dgView.Columns[i].HeaderText; //设置列的标题
         dataColumn.ReadOnly = true;  //列的属性可以更改
         if (i == 0)    //如果i 恒等于零
         {
          dataColumn.Unique = true; //列的每一行的值都是唯一的
 
温湿度采集系统C#
 }
          dataTable.Columns.Add(dataColumn);  //否则获取整个列的值
          }
          for (int i = 0; i < rows; i++)    //判断i的值是否小于rows
          {
           DataRow dataRow = dataTable.NewRow(); // 定义dataRow
           for (int j = 0; j < columns; j++)
           {
           dataRow[j] = dgView.Rows[i].Cells[j].Value;
           }
           dataTable.Rows.Add(dataRow);
            }
           dataTable.RemotingFormat = SerializationFormat.Xml; //确定XML文档的序列
           //dataTable.PrimaryKey[0] = dataTable.Columns[0];
           xmlFileName = (xmlFileName.Trim().Length > 0) ? xmlFileName : "XmlFile";
           dataTable.WriteXml("AppConfigs/" + xmlFileName + ".xml");
            }     // 存取XML文档的文件夹路径
           return true;
            }
           catch(Exception ex)     //捕获异常
            {
             MessageBox.Show(ex.Message);
             return false;
            }
        }
 
温湿度采集系统,单片机;串行通信;数据交换
  第五章  系统测试分析
程序的编写是一个不断完善的过程,在这个过程中不可避免的会出现一些错误。这些错误可以分为可预知的和不可预知的。编写程序时,常会碰到语法错误、逻辑错误或运行时错误。语法错误大多在编译或程序编译阶段指出。而逻辑错误最难找出,可用Visual Studio .NET提供的调试(Debug)工具,逐行观察结果找出错误处。至于运行时错误,可用异常处理技巧。本章主要介绍.NET环境下的C#程序的调试方法及异常处理技巧。
·5.1系统调试
    温湿度数据采集系统主要是用来测量外界的温度、湿度及露点。驱动程序的开发是通过上位机对数据进行显示处理。在上位机的软件系统调试过程中,不可避免地出现了一些错误问题。其中比较难解决的问题如下:
    (1) 串口通讯数据接收部分
原本程序运行时数据无法传到上位机,通过研究发现接收到的数据为一字符串,因此改用ReceivedBytesThreshold方法,设好接收数据的长度,若接收数据的结尾是固定的字符或字符串还可采用ReadTo的方法或在DataReceived事件中判断接收的字符是否满足条件。然后再对数据进行处理。
上位机与下位机进行通讯时,波特率必须采用一致数值,才能保证数据传送的速度符合要求。
(2) C#程序与数据库的连接问题
    在程序运行后,提示错误“无法找到数据库”,检查之后把连接的数据库的路径改为相对路径,如:connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ff.mdb";再运行后可以连接到数据源了。因为系统程序难免会在不同的PC机上运行,因此采用绝对路径的话连接的数据库会无法找到,改用相对路径就没错误了。
(3) 类的引用问题
通常情况下,进行C#的编程时不需要引用特殊的类,但是在与数据库的连接,进行XML的操作时必须在库文件中添加一些特殊的类,如:Access数据库的应用时需加using System.Data.OleDb;而对XML的操作时需加 using System.XML。
 
·5.2测试分析
    在数据接收的部分,通过显示表明接收到的数据的帧与下位机原本设定的不完                  全一样。也就是如果微机在下一帧数据接收前即10ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;如果微机在10ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情况下接收缓冲区的大小就会影响实时监测效果,所以接收缓冲区设置不能过大,以保证数据处理的实时性。 
 
·5.3 .NET的开发调试方法
5.3.1断点调试
这个是常用的调试方法,当程序运行提示有错误时,可在程序的某一条设置断点,然后单步执行追踪断点处的值,这种方法简单实用。
5.3.2 跟踪和调试
    当程序运行时,可以使用Debug 类的方法来生成消息,以帮助监视程序执行顺序、检测故障或提供性能度量信息。默认情况下,Debug 类产生的消息显示在 Visual Studio 集成开发环境 (IDE) 的“输出”窗口中。可以使用 WriteLine () 方法生成后面带有行结束符的消息。当使用此方法生成消息时,每条消息在“输出”窗口中均显示为单独的一行。
   (1) 使用Debug 类
    Ⅰ 启动 Visual Studio.NET。
    Ⅱ 新建一个名为 conInfo 的新 Visual C# .NET 控制台应用程序项目。将创建 Class1。在 Class1 的顶部添加以下名称空间:using System.Diagnostics;
    Ⅲ  初始化变量的声明语句添加到 Main 方法。
    Ⅳ 直接输入将类生成的消息指定为 WriteLine 方法的第一个输入参数。按 CTRL+ALT+O 组合键以确保“输出”窗口可见。
(2) 使用 Trace 类
还可以使用 Trace 类生成监视应用程序执行的消息。Trace和Debug 类共享大多数相同的方法来生成输出。可以在同一应用程序中分别或同时使用 Trace 和Debug 类。在一个“调试解决方案配置”项目中,Trace 和 Debug 两种输出均为活动状态。该项目从这两个类为 Listener 对象生成输出。但是,“发布解决方案配置”项目仅从Trace 类生成输出。该“发布解决方案配置”项目忽略任何 Debug 类方法调用
 

温湿度采集系统C#
    结   论
 
Microsoft.NET是一种面向网络、支持各种用户终端的开发平台环境。C#语言是一种现代的面向对象的程序开发语言,它使得程序员能够在.NET平台上快速开发种类丰富的应用程序。.NET平台提供了大量的工具和服务,能够最大限度地发掘和使用计算机能力。
在.NET平台下运用C#语言可以发开出各种Windows应用程序和控制台程序,而且使用方便,在C#.NET环境下使用工具箱中的各种组件,对组件进行编程即可实现所需的功能。在串口通信方面,C#与VB大不相同,相比之下,运用C#更具挑战性,因为它不提供串口控件,必须使用SerialPort类,在熟悉串口通信技术及协议后进行编程。利用RS232可以实现单片机与PC机之间的通信,数据的接收和反馈。数据可以显示在用C#语言开发的界面上,并且通过与数据库的连接,让数据自发保存在数据库中,供用户进行插入、修改、删除等操作。而且,通过访问XML技术,还可以使数据自动生成XML文档保存等。
用C#语言设计的组件能够用于Web服务,通过Internet,可以被运行于任何操作系统上任何编程语言所调用。因为C#是.NET平台的通用开发工具,它能够建造所有的.NET应用。其固有的特性保证了它是一种高效、安全、灵活的现代程序设计语言,所以从最普通的应用到大规模的技术开发,C#与.NET平台的结合可以提供完整的解决方案。
总结与体会
 
通过这半年时间的不懈努力,终于完成了毕业设计。从选题到搜集资料,再到亲自动手设计制作,虽然花费了大量的时间和精力,但是也从中学到了不少的东西。
C#.NET语言是一门新的编程语言,是一个全新的领域,对于一个编程方面比较弱的人来说无疑会感到困难和茫然。一开始着手查阅资料的时候,觉得很陌生,因为之前的学习中没有涉及到,而且想在短短3个月内精通一门编程语言不是一件轻松的事,不过,在老师的鼓励和帮助下,我决定好好学习C#语言,锻炼自己的毅力。三个多月以来,遇到的问题到是不少。特别是在调试环节,每当出现的结果和预想的不一样或没有达到预期的效果时,就必需不断地调试,一步一步的来,说起来容易,做起来不是那么轻松。有时我也想停下,但还是坚持下来了。 当出现问题时调试很多遍都没有解决时,就停下来,冷静的分析一下,逐个调试可能出现的错误,直到出现自己满意的结果。虽然过程很难坚持下来,但是当整个毕业设计完成时,自己会得到极大的鼓励和满足感。
这次毕业设计也暴露出自己在专业知识方面的很多不足之处,尤其是编程能力比较薄弱。这次实践是对自己大学四年所学知识的一次大检阅,让我明白自己懂的知识还很浅薄,虽然马上要毕业了,但是求学之路还很长,在以后工作中还应该努力学习,不断的完善自己,争取使自己成为一个对社会有所贡献的人。
 

温湿度采集系统,单片机;串行通信;数据交换
论文谢辞
在本次论文完成过程中,我得到很多老师和同学的帮助。首先,我要感谢我的导师—张果老师。从课题的选择到论文的最终完成,张老师始终给予我细心的指导和不懈的支持。在遇到困难的时候,我手足无措,曾想到放弃继续求知,当张老师得知我的想法,不仅没有责怪我,反而鼓励我说编程是个痛苦的过程,但是当你设计完成的时候,将会得到无比的喜悦和收获,尤其在困难面前不能低头,应该重拾信心。正是张老师的悉心教导,让我有了勇气面对设计过程中的种种困难。张老师不仅对我本次设计的完成有莫大的帮助,更重要的是您从教会了我正确对待学习的态度,凡是都要对自己有信心,因为自信是成功的开端。另外,从张老师身上,我学会了严肃的科学态度,严谨的治学精神,精益求精的工作作风,这些都深深地感染和激励着我。人应该不断的完善自己,而不能追求原地踏步。我人生的角色即将转换,我该走出校园了,在这转变发生之前我有张老师给我的如此多的指导,使我在面对以后的工作和生活有可以借鉴的资本。在此,我要真诚的说声:“谢谢您,张老师!”
其次我要感谢本次毕业设计小组的所有同学,谢谢你们一直的支持和鼓励,虽然相处的时间不长,但是我们已经成为学习上的知己,无论在今后的学习还是工作中,希望我们能一起继续努力,实现自己心中的理想。
最后,要感谢我的父母,谢谢您们这么多年来的爱护和支持,有您们的陪伴,我会更加努力的。
现在即将挥别我的学校、老师、同学还有我四年的大学生活,虽然依依不舍,但是还是对前面的路充满信心,只想说感谢我的学校和老师,有你们的教诲伴随我,今后,我会继续努力,好好工作!好好学习!好好生活!
 

温湿度采集系统C#
 参考文献
 
[1]. Maiani B,Still J著 ,康博译 .Visual C#.NET编程经典.北京:清华大学出版社,2002.23—27.
[2].郑小平. Visual C#.NET开发实践.北京:人民邮电出版社,2001.
[3].Glenn JohnSon.ADO.NET 2.0高级编程.清华大学出版社,2006.
[4].扬帆.ASP.NET技术与应用.北京:高等教育出版社,2004.
[5].于风明.单片机原理及接口技术.北京:中国轻工业出版社,1999.
[6].Jason Price. C#数据库编程从入门到精通.北京:电子工业出版社,2003.
[7].Mickey Williams. Visual C#.NET技术内幕.北京:清华大学出版社,2003,3.
[8].王燕.面向对象的理论与C#实践.北京:清华大学出版社,1997.
[9].周之燕.现代软件工程.北京:科学出版社,2000.
[10].郑人杰.软件工程.北京:清华大学出版社,1999.
[11].曹祖圣等. Visual C#.NET程序设计经典.北京:科学出版社,2004.
[12].张立等. C#2.0完全自学手册.北京:机械工业出版社,2006.12.
[13].施燕妹等. C#语言程序设计教程.北京:中国水利水电出版社,2004.7.
[14].黄军等.C#串口通信编程.北京:人民邮电出版社,2001.
[15].J.Richter. Microsoft .NET Framework Delivers the Platform an Integrated, Service-Oriented Web.MSDN Magazine,Sept.2000.
[16].A.Troelsen. C# and the .NET Platform, Apress, Berkeley, 2001.
 
温湿度采集系统,单片机;串行通信;数据交换
附录一:翻译英文部分
本文引自网站http://www.ibm.com
 
Modeling C# applications using Rational Modeling Extension for .NET
                       ABSTRACT
   
Learn how to model Microsoft.NET C# applications by using IBM Rational Modeling Extension for .NET, which is available in IBM Rational Software Modeler, Rational Systems Developer, and Rational Software Architect. This article describes how to model various C# constructs, and the author assumes that you are familiar with basic UML modeling concepts and using Rational modeling tools.




     IBM Rational Modeling Extension for Microsoft.NET enables .NET application developers to use Rational modeling tools in designing applications.This extension is available in IBM Rational Software Modeler, IBM Rational Systems Developer, and IBM Rational Software Architect, and it includes support for modeling C# applications.
 
Key Words: Structure;Extentsion;Modeling;
 
Text
If you have knew about modeling simple C# applications by using the C# profile and type library provided by Rational Modeling Extension for Microsoft.NET. Therefore, you should now be familiar with modeling C# classes, structures, interfaces, delegates, enumerations, fields, and methods. This article like to use the same example of the graphics library project used as common to help you understand how to model other C# concepts, such as indexers, properties, operators, and others.
This part builds on the previous article by describing how to use this extension to model these constructs:
·         Constructors and destructors ;
·         Operators ;
·         Properties ;
·         Indexers;
·         Events ;
·         Attributes;
·         Namespace ;
This article also explains how to validate your model for C# applications.
 
Part 1. Modeling constructors and destructors
    Like C# methods, a constructor or destructor is also modeled as a UML operation with optional an <> stereotype for specific modifiers (for example, extern). A UML operation representing a constructor is given the same name as its parent class or structure name. A destructor is named in a similar manner, except that it has a ~ (tilde) followed by the model’s name.
A return type should not be set for a UML operation representing either a constructor or a destructor. Parameters are added to the constructor similarly to how you add parameters to method. A static constructor is modeled by setting the static property of the corresponding UML operation.
Figure 1 shows a constructor with two arguments of type Point and a destructor modeled for the DrawingSurface class of the sample application used here for illustration purposes.

     Figure 1. C# constructor DrawingSurface(Point start,Point end) and destructor DrawingSurface().
Part 2.Modeling operators
C# operators are modeled as UML operation with optional <> stereotype for specific modifiers, such as extern. A unary operator is named by using the key word operator followed by the unary operator symbol. For example, the unary increment operator is named as operator ++. A return type and a single parameter are set for UML operation that represents a unary operator.
A UML operation representing a binary operator is named similarly to unary operator, but the symbol is one of the binary operators. Also, two parameters are set, and the return type is specified for a UML operation corresponding to a C# binary operator. For example, a C# operator of == (two equal signs) is named operator == in the UML model. The conversion operators in C# are represented by UML operations named as either implicit operator or
 

温湿度采集系统C#
explicit operator. Such a UML operation should specify the target type of the conversion as the return type and the source or input type of the conversion as a parameter type.
Figure 2 shows an examples for modeling C# unary, binary, and conversion operators. The unary operator ++ takes a parameter of type Point and returns a Point. The binary operator != takes two parameters each of type Point and returns a bool type. The implicit conversion operator is defined, which converts a Point type to int.

                       Figure 2. C# unary, binary, and conversion operators
 
Part 3.Modeling properties
A C# property is modeled as a UML property (either a UML attribute or an association end) along with a <> stereotype. The UML property should have the same name and type as its corresponding C# property. Modifiers for a C# property are available as Boolean stereotype properties. For example, abstract, virtual, extern, and override are available in the <> stereotype properties.
In addition to the modifiers, the stereotype has a property called accessors that which can be set to one of the following values: read-only, write-only or read & write. The read-only value should be used whenever the corresponding C# property has only the get accessor method. Similarly, write-only should be used whenever the corresponding C# property has only set accessor. When the C# property has both get and set accessors, the read & write value should be used.
An abstract property is modeled as a UML property with <> stereotype with its abstract stereotype property set to true. For this example, you will model a C# property called distance for the Point structure. This property represents the distance of the point from its origin. Because the distance is calculated from the X and Y coordinates, you will model it as a read-only property. To do this, follow these steps (also see Figure 3):
1.      Add a public field named distance to Point, and set its type to int.
2.      Apply the <> stereotype to the distance field.
3.      Set the accessors property of the stereotype to read-only .
       Figure 3. C# distance property
Part 4.Modeling indexers
A  C# indexer is modeled as a UML operation with <> stereotype. A UML operation representing an indexer should always be named as this . The formal parameters of the C# indexer become the parameters of the corresponding UML operation and the type of the indexer becomes the return type of the UML operation. Indexer modifiers like new, virtual, extern etc. are available as stereotype properties. A sealed indexer is represented by selecting the Leaf property of the corresponding UML operation.<> has a property named accessors which can take values : read-only, write-only and read & write depending on whether the C# indexer has only get accessor or only set accessor or both get and set accessors respectively. This is very much similar to accessors property of <>.
For this example (Figure 4), you will model a read-only indexer (thus it has only a get accessor) in the DrawingSurface class. This indexer will have two parameters of type int, and it will return a Point type. Basically, the purpose of this indexer is to return a point corresponding to a given row and column on the drawing surface. Follow these steps:
1.      Add a UML operation named this to the UML DrawingSurface class.
2.      Apply the <> stereotype to the operation that you added in previous step.
3.      Add two parameters of type int to the operation, and name them row and column.
4.      Set the return type of the operation as Point structure.
Set the property accessors in the stereotype to read-only (see Figure 4).
 
温湿度采集系统,单片机;串行通信;数据交换
Figure 4. C# indexer Point this[int row, int column]
Part 5.Modeling events
A C# event is modeled as a UML property (either a UML attribute or an association end), along with a <> stereotype. The UML property should have the same name as its corresponding C# event. The type of the UML property should be a UML class with a <> stereotype. Modifiers for a C# event are available as Boolean stereotype properties. For example, abstract, virtual, extern, override, and other modifiers are available in the <> stereotype properties. The accessors stereotype property is set to true if the event has its accessors (add or remove); otherwise, it is set to false.
This example (Figure 5) uses the handleResize() delegate for an event named mouseDrag in the class DrawingSurface class. To do this:
1.      Add a public UML attribute to the DrawingSurface class, and apply the <> stereotype.
2.      Set the attribute's type to a UML class that represents the handleResize delegate.
3.      Set the accessors stereotype property to true, thereby indicating that add and remove accessors will be specified.

                Figure 5. C# public event for handleResize mouseDrag 
Part 6.Modeling attributes
The C# language allows programmers to provide certain kinds of declarative information through attributes attached to program entities. These attributes are defined as attribute classes. Attribute classes can be modeled in a manner similar to any other class, and they have a generalization relationship with a System.Attribute. The attribute use with a specific entity is depicted as a stereotype property named attributes in the corresponding stereotype for the entity. For example, an attribute declared for a C# class can be set as a string in the attributes stereotype property in the <> stereotype.
For this example, you will model an attribute class called TestAttribute and its use (also see Figure 6 and Figure 7):
1.      Create a UML class named TestAttribute.
2.      From the Project Explorer, look for the System.Attribute class in the References section of an imported C# project, and drag it onto a diagram. (Importing a C# project is described in this article about using this Rational extension to visualize .NET applications.)
3.      Drag the TestAttribute class onto the diagram also, and show a generalization relationship from TestAttribute to System.Attribute.
4.      Apply the <> stereotype to TestAttribute.
5.      Set the attributes stereotype property in the <> to [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)].
6.      Now, to use this attribute on any of your classes, such as GraphicObject, apply the <> stereotype and set its attributes stereotype property to [TestAttribute].
Figure 6. C# TestAttribute attribute class representation

Figure 7. C# Attribute use for TestAttribute
The attributes property in various stereotypes is are used in a similar manner, including the properties for these stereotypes:

<>.
<>.
<> .
Part 8.Modeling namespace
A C# namespace is modeled as a UML package. All types in a namespace are modeled as UML types in the corresponding package. The package should be named without any special characters. As an example, a class called MyClass in a namespace called com.ibm should be modeled as a class in a package called ibm, which is nested in another UML
 
温湿度采集系统C#
package called com, rather than creating a class for MyClass in a UML package named com.ibm.
 
Part 9.Validating your model
After a C# application has been modeled in Rational Modeling Extension for .NET, you can verify the correctness of the model by using the Model Validation feature available in version 7.0.0.1 and later of this extension. To validate a model:

Select the model in the Project Explorer.
Right-click and choose Validate from the pop-up menu (see Figure 8).
The model is then validated and any errors or warnings are shown in the error log. For
 

温湿度采集系统C#example, model validation will catch errors such as incorrect modeling of C# delegates.
使用 Rational Modeling Extension对C#结构建模
                          摘 要
   利用 IBM Rational Modeling Extension for .NET(该扩展也可以在 IBM  Rational Software Modeler、Rational Systems Developer 和 Rational Software Architect 中使用)对 Microsoft.NET C# 应用程序建模。本文介绍了如何对各种各样的 C# 结构建模,作者假设您熟悉基本的 UML 建模概念,以及 Rational 建模工具的使用。
    IBM Rational Modeling Extension for Microsoft.NET 允许 .NET 应用程序开发人员使用 Rational 建模工具设计应用程序。它是可用在 IBM Rational Software Modeler、IBM  Rational Systems Developer 和 IBM  Rational Software Architect 中的扩展,并且包括对 C# 应用程序建模的支持。
 
关键字: 结构;扩展;建模;
 
 
正文
 
如果已经了解了利用Rational Modeling Extension for Microsoft.NET 供的 C# 概要文件和类型库对简单的 C# 应用程序建模。那么应该熟悉了对 C# 类、结构(Structure)、接口(interface)、委托(delegate)、枚举(enumeration)、字段(field)和方法(method)的建模。本文将介绍使用图形类库相同的实例来帮助您了解如何对其他的 C# 概念,例如索引器、属性、操作,及其它建模。
这里着重介绍如何使用该扩展对这些结构建模:
·         操作符 ;
·         属性(property);
·         索引器 ;
·         事 ;
·         属性(attribute);
·         命名空间 ;
以及如何验证C#应用程序的模型。
 
一.对构造方法和析构方法建模
    像 C# 方法一样,构造方法(constructor)和析构方法(destructor)也被建模为 UML 操作,并且带有针对专门的修饰符(举例来说,extern)的可选择的 <> 原型。表示构造方法的 UML 操作有和其母体类或结构名相同的名字。析构方法按类似的方式命名,除了它的母体名前有一个 ~(否定号)。
    不应该为表示构造方法或析构方法的 UML 操作设置返回类型。向构造方法添加参数的方式类似于向方法添加参数的方式。通过给相应的 UML 操作设置 static 属性来对 static constructor 建模。
图1展示了为示例应用程序(在这里用于举例)的 DrawingSurface 类建模的带有两个 Point 类型参数的构造方法和一个析构方法。
         图 1. C# 构造方法 DrawingSurface(Point start,Point end) 和析构方法 DrawingSurface()
二. 对操作符建模
     C# 操作符(operators)被建模为带有针对特定修饰符,例如 extern的可选的 <>原型的UML操作。单目操作符(unary operator)是通过在关键字 operator 后跟单目运算符符号来命名的。举例来说,单目增量运算符命名为 operator ++。表示单目运算符的UML操作还设置有返回类型和一个参数。表示双目运算符(binary operator)的UML操作的命名方式类似于单目运算符,但符号是双目运算符之一。同样,设置有两个参数,并且为 C# 双目运算符相对应的UML操作指定了返回类型。举例来说,C# 操作符==(两个等号)在UML模型中为 operator ==。C#中的转换操作符由名为隐式操作符(implicit operator)或显式操作符(explicit operator)的UML操作表示。这样的 UML 操作应该将转换的目标类型指定为返回类型,转换的源或输入类型指定为参数类型。
图 2 显示了为 C# 单目、双目,和转换操作符(conversion operator)建模的实例。单目运算符 ++ 的参数是类型 point的,并返回 Point。双目运算符 != 的两个参数是类型 Point 的,并且返回 bool 类型。隐式转换操作符将 Point 类型转换为 int。
 
温湿度采集系统C#
图 2. C# 单目、双目,和转换操作符
三. 对属性(property)建模
    C# 属性(propertie)被建模为带有UML属性<> 原型的 UML 属性(UML attribute 或关联端)。UML属性应该与其相应的 C# 属性具有相同的名称和类型。C# 属性的修饰符作为 Boolean 原型属性。举例来说,abstract、virtual、extern 和 override 在 <>原型属性中都有。
除了修饰符,原型还拥有名为 accessors 的属性,可以将该属性设置为以下值之一:read-only、write-only 或 read & write。在相应的 C# 属性只有 get accessor 方法时应该使用 read-only 值。类似的,在相应的 C# 属性只有set accessor 时,应该使用 write-only。当 C# 属性有get 和set 存取器时,应该使用read & write 值。
抽象属性被建模为带有 <> 原型的 UML 属性,它的 abstract 原型属性被设置为 true。对于此实例,您将为 Point 结构对名为 distance 的 C# 属性建模。该属性表示从原点到该点之间的距离。因为距离是由 X 和 Y 坐标计算的,所以您将把它建模为只读属性。要做这些,依据以下步骤(也参见图 3):

向 Point 添加名为 distance 的 public 字段,并将其类型设置为 int。
向 distance 字段应用 <> 原型。
将原型的 accessors 属性设置为 read-only 。

              图 3. C# distance 属性
四. 对索引器建模
    C#索引器(indexer)被建模为带有 <>原型的UML操作。表示索引器的UML操作应该总是被命名为this。C# 索引器的形式参数成为相应的UML操作的参数,而索引器的类型成为UML 操作的返回类型。索引器修饰符,像 new、virtual、extern 等等用作原型属性。通过选择相应的 UML 操作的 Leaf 属性来表示 sealed 索引器。<> 拥有名为 accessors 的属性,其取值为:read-only、write-only 和 read & write,这依据 C# 索引器是否只有get accessor set accessor 或者分别拥有get和set accessors。这非常类似于<> 的accessors 属性。
对于本实例(图 4),将对 DrawingSurface 类中的只读索引器建模(因而它只有get 存取器)。该索引器将有两个 int 类型的参数,并且它将返回 Point 类型。本质上,该索引器的目的是返回一个与绘制面上已知的行和列相对应的点。依据以下步骤:
1.    向 DrawingSurface 类添加名为this的UML 操作。
2.    向您在前面步骤中添加的操作应用<>原型。
3.    向操作添加两个int类型的参数,并将其命名为row 和column。
4.    将操作的返回类型设置为Point 结构。

将原型的 accessors 属性设置为 read-only(参见图 4)。
                 图 4. C#索引器 Point this[int row, int column]  
 
五. 对事件建模
C# 事件(event)被建模为带有 <> 原型的 UML 属性(UML attribute 或关联端)。UML 属性应该和其相应的 C# 事件有相同的名称。UML 属性的类型应该是带有 <> 原型的UML类。C#事件的修饰符作为 Boolean 原型属性。举例来说 example、abstract、virtual、extern override,和其它修饰符在<> 原型属性中可用。如果事件有它的存取器(add 或 remove)的话,将 accessors 原型属性设置为 true,否则将其设置为 false。
该实例(图 5)将 handleResize() 委托用于 DrawingSurface 类中的名为 mouseDrag 的事件。要这样做:
1.向DrawingSurface 类添加 public UML 属性,并应用 <> 原型。
2.将属性的 type 设置为表示 handleResize 委托的 UML 类。
3.将 accessors 原型属性设置为 true,从而说明将指定 add 和 remove accessors。
 
温湿度采集系统,单片机;串行通信;数据交换
六.对属性建模
    C#语言允许程序设计人员通过附加在程序实体上的 attributes 来提供某些类型的说明性的信息。这些属性(attribute)被定义为 属性类。属性类建模的方式类似于任何其他的类,并且它们和 System.Attribute 有泛化关系。与具体实体一起的属性被描述为相应的实体的原型中名为 attributes 的原型属性。举例来说,为 C# 类声明的属性可以设置为<> 原型中的 attributes 原型属性中的字符串。
对于该实例,将对名为 TestAttribute 的属性类及它的使用来建模(也参见图 6 和图 7):

创建名为 TestAttribute 的 UML 类。
2.    在 Project Explorer 中,在所导入的 C# 项目的 References 部分中寻找 System.Attribute 类,并将其拖到图上。(导入 C# 项目的方法参见关于使用该 Rational 扩展来可视化 .NET 应用程序。也将 TestAttribute 类拖到图上,并显示从 TestAttribute 到 System.Attribute 的泛化关系。
3.    向TestAttribute 应用 <>原型。
4.    向[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] 设置<>中的attributes原型属性。
5.    现在,对任意的类应用该属性,例如 GraphicObject,应用 <> 原型,并将其 attributes 原型属性设置为 [TestAttribute]。

图 6. C# TestAttribute 属性类的表示
         图 7. 用于 TestAttribute 的 C# Attribute
在各种各样的原型中,attributes 属性的用法都类似,包括这些原型的属性:

<> .
<> .
<>.
八. 对命名空间建模
   C# 命名空间(namespace)建模为UML包。命名空间中的所有类型建模为相应的包中的UML类型。对包的命名不应该有任何特殊的字符。举例来说,名为 MyClass 类处于com.ibm 的命名空间中,应该将它建模为ibm 包中的类,该包处于另一个名为com 的UML包中,而不是为MyClass 在名为com.ibm 的UML 包中创建一个类。
 
九. 验证模型
   当在 Rational Modeling Extension for .NET 中对 C# 应用程序建模之后,您可以通过该扩展的版本 7.0.0.1 和之后的版本中可用的 Model Validation 特性来验证模型的正确性。要验证模型:
1.    在 Project Explorer 中选择模型。
2.    单击右键,并在弹出菜单中选择 Validate(参见图 8)。
然后验证模型,在错误日志中显示出任何的错误或警告。举例来说,模型验证会捕获例如对 C# 委托的不正确的建模的错误。
 
  • 上一篇资讯: 模拟电路课程设计部分
  • 下一篇资讯: 校园网络办公系统
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师