基于VC的上下位机串口通讯系统设计.docx

上传人:b****2 文档编号:2602456 上传时间:2023-05-04 格式:DOCX 页数:86 大小:556.31KB
下载 相关 举报
基于VC的上下位机串口通讯系统设计.docx_第1页
第1页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第2页
第2页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第3页
第3页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第4页
第4页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第5页
第5页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第6页
第6页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第7页
第7页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第8页
第8页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第9页
第9页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第10页
第10页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第11页
第11页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第12页
第12页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第13页
第13页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第14页
第14页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第15页
第15页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第16页
第16页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第17页
第17页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第18页
第18页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第19页
第19页 / 共86页
基于VC的上下位机串口通讯系统设计.docx_第20页
第20页 / 共86页
亲,该文档总共86页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于VC的上下位机串口通讯系统设计.docx

《基于VC的上下位机串口通讯系统设计.docx》由会员分享,可在线阅读,更多相关《基于VC的上下位机串口通讯系统设计.docx(86页珍藏版)》请在冰点文库上搜索。

基于VC的上下位机串口通讯系统设计.docx

基于VC的上下位机串口通讯系统设计

内蒙古科技大学

智能仪表综合训练设计说明书

 

题目:

基于VC的上下位机串口通讯系统设计

 

摘要

论文详细介绍了单片机做下位机与VC设计的上位机进行通信的软硬件实现。

在硬件设计中,下位机采用AT89C52单片机系统与上位机系统通过RS-232串行通信端口进行互连,采用MAX232电平转换器完成双向电平转换功能。

单片机系统接收由上位机传输过来的PID参数并在LED数码管上显示,同时可通过按键分别对参数进行加减操作,把修改后的PID参数再传给上位机。

在软件设计中,上位机采用VisualStudio2008中的MFC编写上位机的界面程序。

上位机可以显示测量数据,调节阀门开度,设定PID参数并可将参数传给下位机,也可接收下位机发送的PID参数。

关键词:

单片机;VC;串口通信;PID参数。

 

 

第1章前言

随着计算机技术尤其是单片微型机技术的发展,单片机被广泛应用在工业控制系统中。

单片机具有体积小、价格低廉、开发应用方便、可应用于恶劣工业环境的特点,在分布式控制系统中多采用单片机进行数据采集和现场控制。

由于单片机的计算能力有限,难以进行复杂的数据处理,因此在功能复杂的控制系统中常采上位机下位机系统,单片机用作下位机进行数据采集和设备控制,而PC机用做上位机进行复杂的数据处理和对单片机的控制。

现代信息网络技术的一个突出特点,就是使工业控制系统中的所有设备连接成网,从而在一个核心软件管理下工作,形成一个有机的整体。

这种整体网络方式在现代工业控制系统具有传统独立控制系统所无法比拟的先进性,不仅能极大地提高工业设备的生产效率,还可以大大提高系统的安全性和可靠性。

在单片机的输入输出控制中,除直接接上小键盘和LCD显示屏等方法外,一般都通过串口和上位机PC进行通信。

这样不仅能够实现远程控制,而且能够利用PC机强大的数据处理功能以及友好的控制界面。

在一般的利用PC机对单片机进行控制的场合,都是采用Windows作为上位机的平台,其优点是界面友好,编程和操作都比较容易。

因此研究PC机与单片机串行通信具有重要的现实及工业意义。

 

第2章总体设计方案

本课程设计中,开发上位机程序使用的开发环境是WIN7系统下用微软的VS2008集成开发环境,所用语言为C++。

主要任务是界面设计和串口通信的实现,以及由下位机上传的水位数据的图形显示。

下位机部分,开发所使用的集成环境为keil4,使用编程语言为C语言。

下位机主要实现的功能是收发数据,即与上位机进行通信。

通信的内容有PID参数的下传与显示,阀门开度的下传,以及水位数据上传给上位机。

其中上下位机通信采用的是异步串行通信。

通过RS—232和modbus协议完成数据通信的过程。

其流程图如图2.1所示。

2.1上位机程序设计

2.1.1面向对象的程序设计

这次开发所使用C++就是一种面向对象的编程语言,VisualStudio2008就是开发Windows程序最主要的集成开发环境之一,它不仅是C++语言的集成开发环境,还与Win32紧密相连,因此,VisualStudio2008可以完成各种应用程序开发,从底层的软件到顶层面向用户的软件。

使用VisualStudio2008环境开发应用程序缩短了开发时间,且界面友好,易于操作。

在开发Windows应用程序时,主要使用Windows提供的WindowsAPI即应用程序接口函数,或者是Microsoft提供的MFC即微软基础类库。

其中使用API开发Windows应用程序,我们需要大量的调用系统的API函数,而使用MFC实现同样的功能,系统会通过封装的方式提供给我们现成的功能模块调用,甚至大量的代码将由编译器自己生成。

省去了程序员大量的编写代码的时间,提高了编写Windows应用程序的效率。

是程序员专注于手中将要实现的任务,而非相对底层的实现机制。

这样更有利于开发出大型的,面向对象的应用程序。

2.1.2Windows应用程序

由于要开发的上位机需要与有良好的人机界面,这样就需要开发一个具有图形窗口的应用程序。

在Windows图形操作系统下,窗口程序是基于事件驱动的,也就是说用户可能随时发出各种消息,而每当一个操作完成,窗口程序也要完成相应的处理功能。

这与DOS下顺序执行的操作方式有很大的不同。

一个完整的窗口程序如图2.2。

图2.2应用程序窗口

2.1.3Windows消息机制

Windows程序启动后,执行特定的任务,其中最重要的是创建应用程序的主窗口,这个主窗口需要自己的代码来处理Windows发送给它的信息,所以Windows程序是通过来自操作系统的消息来处理用户的输入。

Windows中的大部分消息是严格定义的,而且适用于所有的程序。

例如,当创建一个窗口时,发送一个WM_CREAT消息;当用户按下鼠标左键时,会发送一个WM_LBUTTONDWON消息。

Windows还对选定的窗口发送WM_COMMAND消息,以响应用户菜单的选择、对话框按钮的单击等操作,用户也可以定义自己的消息,并且能够由程序发送到桌面的任何窗口,接收响应。

Windows对消息的处理过程为:

Windows在系统内部有一个消息队列,当输入设备有所动作的时候,Windows都会产生响应的记录放在系统的消息队列里,而每个记录中包含了消息的类型、发生的位置和发生的时间。

同时,Windows为每个程序维护一个消息队列,Windows检查系统消息队列里的应用程序消息发生的位置,进而送到相应的窗口中去。

2.1.4使用MFC程序设计

MFC中的类的名称都是以C为开头的,如果需要定义自己的类或者根据MFC库的基类派生新类时要使用相同的约定。

这样更有助于程序的理解。

而变量的命名需要使用匈牙利命名法。

这样可以是代码更加容易阅读。

MFC中如果要得到完整的应用程序,只需要从MFC中派生两个类即可:

应用程序类和窗口类。

CWinApp类对任何使用MFC编写的Windows程序来说都很重要,该类包括的对象包括启动、初始化、运行和关闭应用程序所需的一切代码。

MFC应用程序与用户交互的界面被称作框架窗口,因此,需要为应用程序从MFC类CFrameWnd中派生一个窗口类,而此类提供了创建和管理应用程序窗口所需的一切。

MFC程序的结构包括两个面向应用的实体——文档和视图。

文档是给予应用程序中与用户交互的数据集合的名称。

文档类是从MFC的库中的CDocument类派生的,需要添加数据成员来存储应用程序需要的数据,还要添加成员函数来支持对数据的处理。

视图总是与特定的文档对象相关。

视图对象可以提供一种机制来显示文档中存储的部分或全部数据。

视图定义了在窗口中显示的数据的方式以及与用户交互的方式。

与定义的文档方式类似,自己的视图类是通过CView类派生出来的。

显示视图的窗口框架被称为框架窗口。

视图实际上是在自己的、完全充满框架窗口的客户区窗口中显示的。

文档对象可以拥有任意多个与其相关的视图对象。

各个视图对象可以提供文档数据或文档子集的不同表示方法。

MFC提供了使文档与其视图相结合,以及使各个框架窗口与当前的活动视图相结合的机制。

文档对象自动维护着指向相关视图的指针列表,而视图对象拥有存储相关文档对象的指针的数据成员。

各个框架窗口都存储着一个指向当前活动视图对象的指针。

文档、视图和框架窗口之间的协作,是由另一个名为文档模版的MFC类的对象安排的。

这些指针使一种类对象的函数成员可以访问另一种类对象的公有数据或接口中的函数成员。

应用MFC编程时使用的到的功能组件:

(l)应用程序向导(Appwizard)。

Appwizard是一个标准的C++源代码生成器。

它通过一系列的对话框来提示用户输入所需创建的程序的信息。

然后APPWizard生成一些文件,这些文件构成程序的框架。

由APPwizard生成的程序是一个基本的Windows程序,它生成的是基本代码,用户应在此基础上完善自己内容。

(2)类向导(Classwizard)。

Classwizard是一个交互式工具,主要进行类代码的维护。

用来建立新的类,定制类,把消息映射为类成员函数,或者把控制框映射为类变量成员。

在开发程序时,可用Classwizard建立程序所需要的类,包括消息处理和消息映射例程(用于定位处理消息的代码)。

(3)资源视图(ResourceView)。

ResourceView包含了项目中所有的层次列表,用于编辑和管理应用程序中用到的各种可视元素,包括快捷键、对话框、图标、菜单、字符串、工具栏等。

(4)类视图(ClassView)。

ClassView用于显示项目中所有的类信息,主要是定制现有的类和建立新的类,并在每个类中,显示了成员函数和成员变量,还可以完成添加、删除、定位的功能。

(5)文件视图(FileView)。

FileView视图同ClassView非常相似,将项目中的所有文件(C++源文件、头文件、资源文件、Help文件等)以视图的形式分类显示。

在视图中可以显示和编辑源文件和头文件。

2.2上位机串口编程

2.2.1串口介绍

经过多年的发展,现今已经形成了许多串行通信接口的标准。

其中本次课程设计用到的RS-232标准是美国EIA(电子工业联合会)与BELL公司一起开发的通信协议。

它适合于数据传输速率在0—20000bit/s的范围内通信。

目前比较常用的串口有9针串口(DB9)和25针串口(DB25),近距离通信可以直接将通信接口用相应的线缆直接相连。

2.2.2使用串口控件方法

在win32环境中,实现串口编程一般可以通过两种方法实现:

一是使用Windows提供的API函数。

另一种是使用MSCommActiveX串口通信控件来实现。

API函数的使用为编程提供了最大的灵活性,可以直接的组织自己需要的串口模式。

而使用MSCommActive控件则更为方便简洁。

通信的方法主要有两种:

事件驱动的方法和查询法。

串口控件的主要属性、事件及方法:

CommPort:

表示通信的端口名。

Setting:

设置波特率、校验位、数据位、停止位。

PortOpen:

用于打开和关闭串口。

OutBufferSize:

设置并返回缓冲区的大小。

InBufferSize:

设置并返回接收缓冲区的大小。

Rthreshold:

设置并返回接收时产生OnComm事件数。

CommEvent:

只要由通信错误或事件发生时都会产生Oncomm事件。

2.3下位机设计介绍

下位机是用单片机实现的PID水位调节器。

下位机的主要职责是接收上位机下传的命令设置相应的PID参数,并且实时将水位信息反馈给上位机,以实现水位信息的记录。

下位机除了完成PID,水位数据的传输与处理,同时还应该具有对PID参数的设置功能。

在下位机以单片机为核心的系统里,本设计所要实现的数据传输功能同时也利用了MAX232芯片。

单片自身的RX与TX引脚直接与MX232相连,再通过线缆与上位机连接。

单片机的串口是以全双工异步通信模式通信的。

2.3.1单片机的通信方式

所谓的串行通信方式主要有两种:

即异步通信和同步通信。

异步通信是起止式传输,它是利用起止方法来保持收发双方同步的。

a)每次只能传输一个编码字符,可以连续发送多个字符,可以随即进行单独发送。

b)起始位表示字符传输的开始,长度为1bit;停止位表示字符传输的结束,长度1bit,1.5bit,2bit。

c)发送端数据格式如图2.3所示:

其中空闲位可有可无。

有空闲位时,若空闲位为“1”,线路处于等待状态。

存在空闲位正是异步通信的特征之一。

图2.3发送端数据格式数据格式

在帧格式中,一个字符由4个部分组成:

起始位、数据位、奇偶校验位和停止位。

首先是一个起始位“0”,然后是5~8位的数据(规定低位在前,高位在后),接下来的奇偶校验位(可省略),最后是停止位“1”。

起始位“0”信号只占用一位,用来通知接收设备一个待接收的字符开始到来,线路上在不传送字符时应保持为“1”。

接收端不断检测线路的状态,若连续为“1”以后又侧到一个“0”,就知道发来一个新字符,应马上准备接收。

字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。

起始位后面紧接着就是数据位,它可以是5~8位。

奇偶校验只占一位,但在字符中也可以规定不同奇偶校验位,则这时这一位就可省去。

也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质(地址、数据等)。

停止位用来表征字符的技术,它一定是高电位(逻辑“1”)。

停止位可以是1位,1.5位或2位。

接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一个字符做好准备——只要再收到“0”就是新的字符的起始位。

若停止位以后不是紧接着传送下一个字符,则让线路上保持为“1”。

d)接收端:

通过检测起始位和停止位来判断新近到达的字符,保持收发双方每

传输一个字符就重新校验一次同步关系,不易造成时钟误差。

e)应用:

低速传输系统,因为其传输效率较低,如传输一个ASCⅡ码,数据代码7位,1位起止位,2位停止位,1位校验位,其效率7/(7+1+1+2)≈64%且字符之间还可能有空隙。

 

异步传输是字符内的同步,字符间的异步。

图2.4ASCII码模式

同步传输不是以字符而是以数据块为传输单位,其传输速率较高。

同步通信中,在数据开始传送前用同步字符来指示(常约定1~2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。

a)每次传输多个字符(数据块)且它们之间没间隙以及起始位,停止位。

b)保持收发同步,在数据块之前加上前文,在数据之后加上后文——帧(frame)。

c)接收端:

检测帧中的前文和后文(特定的标志序列)保持与发送端同步。

d)数据格式:

前文和后文的具体格式视传输控制规程而定,有面向字符与面向比特型两种方案。

e)同步传输每次传送的是一个完整的数据帧,发送端无需在字符间加入附加位和间隙,因而同步传输的效率比异步传输的效率高。

但由于收发双方需建立准确的同步关系,所以实现起来比较复杂。

2.4上下位机通信协议

通过RS—232,modbus协议将上下位机连接起来。

下位机

Modbus协议介绍:

Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。

Modbus协议是应用于电子控制器上的一种通用语言。

通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。

当在Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。

如果需要回应,控制器将生成反馈信息并用Modbus协议发出。

在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。

这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

Modbus特点:

(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。

目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。

(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。

(3)Modbus的帧格式简单、紧凑,通俗易懂。

用户使用容易,厂商开发简单。

Modbus传输模式:

Modbus中一般使用两种传输模式:

RTU模式和ASCII模式。

当采用ASCII模式通信时,在消息中的每个字节都作为2个ASCII字符传送。

这种格式的优点是字符发送的时间间隔可达到1s而不产生错误,缺点是通信速率较慢。

当采用RTU模式时,消息发送至少以3.5个字符时间的停顿间隔开始,其优点是数据用二进制表示,通信速度较快。

两种通信模式格式如图2.5所示:

图2.5ASCII模式和RTU模式

 

第3章硬件设计

3.1单片机的选择

本设计采用的是AT89C52单片机,AT89C52是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,俗称单片机。

它是一种高效微控制器,因为它更经济实惠,用起来灵活方便,而且习惯了用这种型号的单片机,所以选择AT89C52单片机。

3.2电平转换器MAX232

本设计采用MAX232芯片进行电平转换,MAX232芯片是美信公司专门为电脑的RS232标准串口设计的接口电路,使用+5V单电源供电,它的作用就是完成TTL电平与RS232电平的转换。

PC机的串行口采用的是标准的RS232接口,单片机的串行口电平是FTL电平,而TTL电平特性与RS232的电气特性不匹配,因此为了使单片机的串行口能与RS232接口通信,必须将串行口的输入/输出电平进行转换。

通常用MAX232芯片来完成电平转换。

3.374LS164LED驱动芯片

74LS164是常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。

当80C52单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS164等总线驱动器。

当片选端

低电平有效时,DIR=“0”,信号由B向A传输;DIR=“1”,信号由A向B传输;当

为高电平时,A、B均为高阻态。

其原理图如图3.1所示。

图3.174ls164原理图

3.4LED显示器

3.4.1LED显示器工作原理

LED显示是用发光二极管显示字段的显示器件,也称数码管,其外形结构如图3.1所示,由图可知它由8个发光二极管构成,通过不同的组合可用来显示0-9、A-F及小数点。

图3.2数码管原理图

 

LED显示器一般分为共阴极和共阳极两种,共阴极是将8个发光二极管的阴极连接在一起作为公共端,而共阳极则是将8个发光二极管的阳极连在一起作为公共端[8],其构成如图3.2所示。

 

3.4.2LED显示器接口

在单片机系统中,LED显示接口一般采用静态驱动和动态扫描两种驱动方式。

静态驱动方式工作原理是每一个LED显示器有一个I/O端口驱动,亮度大,占用I/O端口多,显示位数多时很少采用;动态扫描驱动方式的工作原理是将多个显示器的段码同名端连接在一起,位码分别控制,利用眼睛的余晖暂留效应,分别显示。

动态扫描驱动方式下,只要保证一定的显示频率,看起来的效果和一直显示是一样的。

 

第4章软件设计

软件设计主要分为两大部分:

上位机部分和下位机部分。

上位使用面向对象的C++语言写成,下位机用面向过程的C语言写成。

4.1上位机编程方案选择

本设计采用VC来实现编程,上位机与单片机进行通信的程序编写可用VB、VC等软件。

由于VB作为面向对象的编程工具不够完全,效率比VC低,提供的命令语言环境较弱,通过串口设备一次最多只能交换16B的数据,对较大数据量的传输存在很大的局限性,很难实现较为复杂的数据处理,VC是一种功能强大的面向对象的Windows编程开发平台。

VS2008的优点是界面简洁,占用资源少,操作方便。

所以本设计采用VC作为串口编程工具。

4.1.1上位机软件流程图

上位机软件流程图如图4.1所示

图4.1上位机控制流程图

 

4.1.2上位机程序设计

上位机程序界面图示:

图4.2上位机控制程序界面图

串口参数设定菜单实现程序:

图4.3串口参数设定菜单

串口参数设置代码实现:

由于要设置的串口参数较多,所以设计为在弹出的对话框中完成对串口参数的设置:

图4.4串口参数设置对话框

当在串口参数设置菜单选项鼠标左击后,程序将发出一条处理命令的消息。

添加相应的事件处理程序可以用事件处理程序向导。

调用事件处理程序向导如图4.5所示。

图4.5用事件处理向导添加事件处理程序

将事件处理向导程序添加的消息响应函数添加在CUpperComView这个类中,当鼠标左击后发出系统命令,这样便在CUpperComView这个类中调用OnSetCommDlg这个成员函数。

OnSetCommDlg成员函数的实现代码如下:

voidCUpperComView:

:

OnSetCommDlg()

{

//TODO:

在此添加命令处理程序代码

//m_ComName=ComSetDlg.m_ComName;

if(IDOK==ComSetDlg.DoModal())

{

m_ComName=ComSetDlg.m_ComName+1;

if(0==ComSetDlg.m_ParityBit)

{

m_ParityBit="E";

}

else

{

if(1==ComSetDlg.m_ParityBit)

{

m_ParityBit="O";

}

else

{

m_ParityBit="N";

}

}

if(0==ComSetDlg.m_BaudRate)

{

m_BaudRate="4800";

}

else

{

if(1==ComSetDlg.m_BaudRate)

{

m_BaudRate="9600";

}

else

{

m_BaudRate="19200";

}

}

if(0==ComSetDlg.m_StopBit)

{

m_StopBit="1";

}

else

{

m_StopBit="2";

}

if(0==ComSetDlg.m_DataBit)

{

m_DataBit="7";

}

else

{

m_DataBit="8";

}

}

m_ComVal=m_BaudRate+","+m_ParityBit+","+m_DataBit+","+m_StopBit;

}

同样打开和关闭串口的源程序如下所示:

串口打开程序实现函数:

voidCUpperComView:

:

OnMenuOpenCom()

{

//TODO:

在此添加命令处理程序代码

if(m_cCom.get_PortOpen())//如果发现串口本来是打开的,则关闭串口

m_cCom.put_PortOpen(FALSE);

m_cCom.put_CommPort(m_ComName);//选择COM3端口

m_cCom.put_InputMode

(1);//输入方式为二进制方式

m_cCom.put_InBufferSize(1024);//设置输入缓冲区

m_cCom.put_OutBufferSize(512);//设置输出缓冲区

m_cCom.put_Settings(m_ComVal);//波特率,无校验,数据位,停止位

if(!

m_cCom.get_PortOpen())

{

m_cCom.put_PortOpen(TRUE);//打开串口

m_cCom.put_RThreshold

(1);//每当接收缓冲区有个字符则接收串口数据

m_cCom.put_InputLen(0);//设置当前缓冲区长度为

m_cCom.get_Input();//预读缓冲区以清除残留数据

A

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2