计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc

上传人:哈尼dd 文档编号:3970429 上传时间:2019-10-11 格式:DOC 页数:30 大小:581.02KB
返回 下载 相关 举报
计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc_第1页
第1页 / 共30页
计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc_第2页
第2页 / 共30页
计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc_第3页
第3页 / 共30页
计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc_第4页
第4页 / 共30页
计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc》由会员分享,可在线阅读,更多相关《计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现 毕业论文.doc(30页珍藏版)》请在三一文库上搜索。

1、目录摘要: 计算机组成原理是大学计算机教学一门重要的课程,它的工程性、技术性和实践性这些特点决定了我们在进行课堂教学的同时必须对于实验教学予以重视。这是一门抽象的实验课程,从而决定了教学的难度,如果能够像看动画一样直观的看到实验系统内部的数据流动,那么就能更好的理解实验更好的促进教学。随着高级程序设计语言的出现,方便的工具的问世,计算机图形学的发展,图形程序的开发变得越来越容易。有了这些,设计一个和硬件系统配合的软件平台变得可行。本文将要讨论一下如何设计一个可配合教学的动画。本文给出了使用工具VC+ 6.0开发一个计算机组成原理实验系统的图形界面控制系统的总体设计方案与实现。首先进行系统的概要

2、设计,论证了可行性,接着简单介绍开发工具,然后叙述了开发过程中用到的重要知识,最后分析整个软件系统的结构、功能设计与实现。关键字:计算机组成原理,动画,VC+ 6.0第一章 前言1.1 研究的背景和目的随着计算机的普及,计算机成为人们生活中不可缺少的部分,如今各个高校都开设了计算机课程。计算机组成原理课程作为计算机课程的基础专业课,它的工程性、技术性和实践性决定了这门课程仅仅依靠课堂教学是远远不够的,于是计算机硬件实验成为计算机教学的一个重要教学环节。但是,目前的计算机组成原理实验主要依靠实验箱,通过开关进行输入,信号灯观察输出。这种方法很抽象,对教学的效果和进度都有很大影响,如果能够以图形的

3、方式显示出计算机内部的数据流动情况就会方便学生的理解,友好的界面让操作简单,让同学们在轻松的环境下做好实验,同时能够增加同学们的学习兴趣。另外,市场上虽然有很多类似的产品出售,但是价格一般在几千元,对于一般的学校很难承担的起。在这种情况下,一方面实验老师的教学任务繁重,不仅要做好实验教学前的备课,还要提前熟悉所用设备及其维护工作,而且根据设备的不同,其维护和管理的工作量也大不一样,这样让老师不能把精力有效的放到教学上;另一方面学生要提前熟悉所用设备的设计,浪费了大量的时间,影响实验进度,限制了学生发挥主观能动性的灵活性,实践能力也得不到有效的提高。在程序设计语言和设计工具的发展下,随着大规模集

4、成电路工艺的提高,设计一个友好实用的实验系统有了基础并且成为必然要求。1.2本论文的研究目标和任务本论文主要介绍应用VC+6.0开发实现友好的实验系统的界面,并可以通过串口与模型机联机通信,以控制模型机运行,采集模型机数据在绘图界面上动态显示。论文需要分析系统功能,以及详细阐述系统的设计与实现。1.3本论文的工作和内容本论文的主要工作是介绍开发界面系统的过程,工作完成了对实验系统的程序载入执行和CPU运行过程的动态演示。论文共分为六章:第一章为前言部分,介绍了论文的背景,研究目的和工作内容。第二章为系统概述,介绍了实验系统的主体设计。第三章是对本论文中用到的工具的简介。第四章是串口通信的介绍,

5、是系统的重要组成部分。第五章重点介绍了系统的设计实现方法。第六章是对本论文的设计进行的概括总结。PC机串行接口单片机FPGAFPGARAMROM接口单元CPU微控器第二章 系统概述2.1 系统整体概述实验系统由硬件实验平台和软件显示平台两大部分组成。实验的功能操作主要由硬件实验平台完成。软件显示平台以图形加数据的方式动态显示实验中各部件内部的工作状态和数据流向。系统整体结构如图2.1所示。图 2.1 系统整体结构图2.2 硬件设计部分概述系统硬件部分主要是提供计算机系统设计实现的载体FPGA,并由通信接口部件对硬件电路部分进行管理。主要实现的设计功能是:通信接口部件是主要控制部件,接收单片机的

6、命令完成管理外存RAM的读写、实验板总线控制及与单片机数据通信等功能;RAM部分是实验板的主要存储部件,同时也是计算机系统的外存,它受通信接口部件控制写入读出数据,这些数据包括由单片机传来的指令和数据、CPU系统内计算机系统的过程数据和结果,其中,单片机传来的指令和数据是用来控制计算机系统工作,计算机系统的过程数据和结果是用来反馈给PC机以完成图形模拟。2.3 软件设计部分概述2.3.1 软件系统功能需求用VC6.0制作系统显示界面,界面作为用户与系统对话的窗口,为用户提供系统的操作接口,包括载入程序,执行程序,可以控制程序的运行,系统内部的运行情况以动画的方式显示出来供用户分析实验。界面如图

7、2.2所示。图 2.2 软件界面2.3.2 软件系统概要设计分析软件平台划分为视图部分、控制部分、模拟部分和通信部分。这四个部分之间的关系请参看图 2.3 。图 2.3 软件系统结构图视图部分:视图部分要求能够显示微指令、指令,以及以图形的形式显示接口部分收到的信息,主要是寄存器和总线的状态信息。根据这几项功能现在将界面安排如下。模块划分 窗口下部分占四分之一,命名为OutPut模块,用于以后扩展附加功能。可以用对话框动态加载实现。窗口上部右方占四分之三,命名为Draw模块,用于绘图。窗口上部左边四分之一,在把这四分之一等分为上下两部分,上一部分命名为ShowIns模块, 用于显示程序。下一部

8、分命名为ShowMIns模块,用于显示微程序。功能定义OutPut 暂时不作定义。Draw 定义为用Windows的用户图形接口绘制出框图表示对应于模型机的部件,并绘制出各个部件之间的连线。同时为每一个部件模型和连线模型定义标志位,并根据标志位将图形绘制出不同的颜色。这一组标志位是图形部分和控制部分的接口。ShowIns和ShowMIns 的功能大致相似,要求以表格的形式显示地址和保存在地址中的数据。控制部分控制部分的控制划分为两部分,一部分是控制视图模块,包括控制ShowIns和ShowMIns的对程序和微程序的显示以及通过Draw模块的接口控制绘图。另一部分是通过串口通信控制模型机的运行状

9、态并且采集模型机信息。有两部分可以影响到绘图,一部分是串口信号,另一部分是可以采用模拟的方法发送信号供显示模块绘图。本程序中使用分散控制的方式,控制模块分别分散在视图部分、模拟部分和通信部分中。如图 2.4 所示。图 2.4 控制部分结构图模拟部分为了在没有连接模型机的情况下也能够看到实验程序运行的方式,增加一个模拟部分,模拟部分负责产生显示图形所需要的信息通过绘图模块的接口设置状态信息控制绘图。模拟部分分为两个模块,实体模块和驱动模块。实体模块模拟寄存器、ALU等功能实体。可以用C+中的基本数据类型定义。驱动模块定义了实体模块中的操作。这个模块可以改变实体模块中的数据和状态,可以读取实体模块

10、的状态,并负责与绘图模块通信。具有控制模块的功能。请参看图 2.5。图 2.5 模拟部分结构图通信部分通信部分负责通过串口与单片机相连,可以发送控制命令和接受来自单片机采集到的模型机的状态信息。这些状态信息对于绘图是有用的,通过绘图模块的接口控制绘图,并且需要根据绘图完成情况对模型机发送控制信号。通信部分划分为采集模块和外部控制模块。采集模块负责分析采集到的信息控制绘图,外部控制模块负责控制模型机的运行状态,其中控制模块控制信息的发出需要根据由显示模块反馈的信息。请参看图 2.6。图 2.6 通信部分结构图第三章 工具介绍3.1 Windows 程序设计简介3.1.1 窗口窗口是Windows

11、应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。一个基本的Windows应用程序窗口的组成如图 3.1 所示。编写一个Windows应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。图 3.1 窗口的组成3.1.2 事件驱动、句柄与消息Windows程序设计围绕时间或消息的产生驱动运行处理函数。所谓消息就是描述事件发生的信息。Windows程序的执行顺序取决于事件发生的顺序。一个句柄是指Windows使用的一个唯一的整数值,用于标识应用程序中不同的对象和同类对象的不同实例

12、。消息的定义是用结构体来表示的,Windows常用的消息有:窗口管理消息、初始化消息、输入消息、系统消息、剪贴板消息等。3.2 图形设备接口及windows绘图3.2.1 图形设备接口Windows图形设备接口是为与设备无关的图形设计的。对于开发人员,所要做的工作仅仅是在系统的帮助下建立一个与实际输出设备的关联,以要求系统加载相应的设备驱动程序,其他的具体输出操作由系统实现。图形的刷新是绘图过程中必须考虑的问题,Windows中是通过发出刷新请求,系统相应请求来完成刷新的,系统通常通过发送WM_PAINT消息来发送刷新请求。系统对刷新请求的响应分为窗口移动后的刷新,被覆盖区域的刷新和鼠标穿越后

13、的刷新。应用程序输出图形首先需要获取设备环境,通过调用BeginPaint和GetDC函数来获取设备环境。3.2.2 绘图工具和颜色的设计绘图工具有画笔、画刷。在使用画笔之前必须创建画笔,系统定义了四种画笔分别是WHITE_PEN, BLACK_PEN, DC_PEN, 和NULL_PEN. 通过调用CreatePen函数来创建,在创建了画笔之后用SelectObject函数将画笔选入设备环境,用完之后调用DelectObject删除画笔。画刷的使用和画笔相同。3.3 MFC简介3.3.1 MFC概述MFC( Microsoft Foundation Class) 用来编写Windows应用程

14、序的C+类集,该类集以层次结构组织起来,其中封装了大部分Windows API函数和Windows控件,它所包含的功能涉及到整个Windows操作系统。3.3.2 MFC中类的组织结构MFC 类库中类是以层次结构的方式组织起来的,几乎每个层次结构都与一具体的Windows实体相对应,一些主要的接口类管理了难以掌握的Windows接口,这些接口包括:窗口类,GDI类,对象链接和嵌入类(OLE),文件类,对象I/O类,异常处理类以及集合类等。MFC库中的类按层次关系划分可分为如下若干类:根类:CObject应用程序体系结构类窗口、对话框和控件类绘图和打印类简单数据类型类数组、列表和映像类文件和数据

15、库类Internet 和网络工作类OLE类调试和异常类3.3.3 文档-视图结构文档-视图结构是在Visual C+ 中使用MFC开发基于文档的应用程序的基本框架。在这个框架中,数据的维护及显示分别由两个不同但又彼此紧密相关的类文档类和视图类负责。文档-视图结构在很多场合与传统的编程方式相比要更有利于应用程序的编写。在文档-视图结构中,文档的任务是对数据进行管理和维护。数据通常被保存在文档类的成员变量中。在Visual C+ 中,文档类通过一个称为串行化(serial)的过程将数据保存到磁盘文件或数据库中。MFC类库为数据的串行化提供了默认的支持,我们只需要在此基础上稍加修改,就可以为自定义的

16、文档类提供串行化的支持。文档类还可以处理命令消息,这里所谓的命令消息是指来自如菜单、工具栏按钮和加速键的WM_COMMAND 通知消息。除了WM_COMMAND 外,文档不能处理其他的Windows 消息。由此可以看出,命令消息可以被多种对象处理,这些对象除了窗口和视图外,还可以是文档、文档模板或应用程序本身。这一点与Windows 消息和控件通知消息不同,因为Windows 消息和控件通知消息只能被窗口和视图处理。视图类在文档和用户之间起中介作用。视图可以直接或间接的访问文档类中的这些成员变量,它从文档类中(而不是从存储介质中)将文档中的数据取出来,然后在屏幕上显示文档的数据。同时,它可以接

17、受用户的输入,并接受用户的修改,通过调用文档和视图的接口将修改的信息反馈给文档类,实际的数据更新仍然由文档类来完成。每一个文档可以有多个视图,但每个视图只能对应于一个确定的文档。也就是说,视图是文档的不同表现形式。比如,一个*.html文件,在浏览器里和在记事本中打开的表现形式是不同的,但是它们操作的是同一个文件。这就是一个文档对应两个视图的例子。总之,文档-视图结构的工作机制是:在通常情况下,视图功过GetDocument 成员函数获得指向相关联的文档对象的指针,并通过该指针调用文档类的成员函数来从文档中读取数据。视图把数据显示于计算机屏幕上,用户通过与视图的交互来查看数据并对数据进行修改。

18、然后,视图通过相关联的文档类的成员函数将经过修改的数据传递给文档对象。文档对象获得修改过的数据之后,对其进行必要的修改,然后保存到永久介质(如磁盘文件)中。3.4 VC+6.0 开发环境3.4.1 VC+6.0 开发环境概述Visual C+ 6.0 采用可视化编程,所谓可视化技术,一般是指软件开发阶段的可视化和对计算机图形技术和方法的应用。使用Visual C+ 环境来开发Windows 应用程序大大缩短了开发时间,而且界面更友好,便于程序员操作。开发环境的由菜单栏、工具栏、项目工作区、资源编辑器等组成。3.4.2 菜单栏File 菜单:New 选项,通过New 选项打开New 对话框,使用

19、此对话框可以创建新的文件、项目、工作区或其他文档。Edit 菜单:1)Breakpoints 选项选中该选项将弹出Breakpoints 对话框,用于设置、删除和查看断点。断点实际上告诉调试器应该在何时何地中断应用程序的执行过程,以便检查程序代码、变量和寄存器值,必要的话可以修改、继续执行和中断执行。2)List Members 选项该选项可以用来适当减轻程序员输入源程序代码的负担。输入代码时,如果在变量名之后键入 “ . ” ,或 “-” ,那么系统会自动列表显示所有有效的成员名,这时只要键入成员的前几个字母就可从列表中选中该成员,按Tab 键即可完成输入;也可用滚动条找到待键入的成员名,然

20、后用鼠标双击成员名来完成。3)Type Info 选项如果将鼠标指针停在源代码中某一变量或函数上,那么系统将显示所指变量或函数等的语法。4)Parameter Info 选项输入代码时,如果在输入函数名之后键入左括号,那么系统将显示该函数的完整原形,并用黑体显示其第一个参数。输入第一个参数值之后,接着就会出现第二个参数,以此类推。5)Complete Word 选项系统自动完成当前语句其余部分的输入。如果不能自动完成,则给出适当的提示辅助用户完成。View 菜单1)ClassWizard 选项选中该选项将弹出MFC ClassWizard 对话框。2)Resource Symbols 选项该选

21、项将打开资源符号浏览器,从中可以浏览和编辑资源符号。资源编辑符号是映像到整数值上的一串字符,相当于资源的一个代号,因此可以在源代码或资源编辑器中通过资源符号引用资源。3)Resource Includes 选项选中该选项将弹出Resource Includes 对话框。对话框中显示资源符号文件名和预处理指令。4)Workspace 选项如果工作区没有显示或者不是处于当前状态,选择该项将显示工作区窗口。5)Output 选项在输出窗口(Output)中显示程序建立过程(如编译、链接等)的有关信息,并且显示调试运行市的输出结果。6)Debug Windows 选项选择该选项将弹出级联子菜单,子菜单

22、中的命令只有在调试运行状态才可用。Insert 菜单1)New Class 选项选中该选项将打开New Class 对话框。2)New Form 选项选中该选项将打开New Form 对话框,以便创建新的表单并添加到项目中,该对话框的形式与New Class 对话框非常相似。3)Resource 选项创建新的资源或插入到资源文件中。4)Resource Copy 选项要选中该选项必须先选中某个资源。该选项用于复制选定的资源。5)New ATL Object 选项添加新的ATL 对象到项目中。3.4.3 工具栏工具栏是一种图形化的操作界面,具有直观和快捷的特点,熟练掌握工具栏的使用对提高编程效率

23、非常有帮助。工具栏由某些操作按钮组成,分别对应着某些菜单选项和命令的功能。用户可以直接用鼠标单击这些按钮来完成指定的功能。用户可以根据自己的需要添加新的工具栏,或者对已有工具栏进行修改,如添加新按钮、删除已有按钮等。若需要添加工具栏,只需选择 Tools | New 选项,然后输入相应的名字即可。3.4.4 项目与项目工作区Visual C+ 6.0 以项目工作区的形式来组织文件、项目和项目配置。每个项目工作区由工作区目录中的项目工作区文件组成。项目工作区文件(.DSW)含有工作区的定义和项目中所包含文件的所有信息。项目工作区由ClassView(类显示)面板、ResourceView (资源

24、显示) 面板及FileView(文件显示)面板等组成。第四章 串口通信介绍4.1 串口通信简介4.1.1 串口概念所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。传送方式如图 4.1 所示。图4.1 串口传送方式由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器”(串并)和“发送移位寄存器”(并串)。典型的串口接口结构如图4.2

25、所示。图 4.2 典型串口结构图在数据输入过程中,数据一位一位地从外设进入接口的“接收移位寄存器”,当“接收移位寄存器”中已接收完1个字符的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU从“数据输入寄存器”中读取接收到的字符。(并行读取,即D7D0同时被读至累加器中)。“接收移位寄存器”的移位速度由“接收时钟”确定。接口中的“控制寄存器”用来容纳CPU送给此接口的各种控制信息,这些控制信息决定接口的工作方式。“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。例如,用状态寄存器的D5位为“1”表示“数据输出寄存器”空,用D0位表示“数

26、据输入寄存器满”,用D2位表示“奇偶检验错”等。能够完成上述“串并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal Asynchronous Receiver and Transmitter),典型的芯片有:Intel 8250/8251,16550。串口的针脚如图4.3所示。图 4.3 串口针脚图各个针脚的连接如图4.4所示。图 4.4 串口针脚连接图串口器件的连接如图4.5所示。图 4.5 串口器件连接图4.1.2 串口通信基本原理基本原理:串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接

27、收数据时,串行的位被转换为字节数据。在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。串口信号线的接线方法:主要信号线定义2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR; 8脚:数据载波检测DCD;1脚:保护地;7脚:信号地。电气特性数据传输速率最大可到20K bps,最大距离仅15m接口的典型应用大多数计算机应用系统与智

28、能单元之间只需使用3到5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。(当然,在程序中也需要对相应的信号线进行设置。)以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要对信号线的状态进行判断或设置。(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。)4.2 用MFC实现串口通信的基本方法4.2.1 使用ActiveX控件VC+ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便。使用MFC进行串口通信的步骤如下:在当前的Workspace中插入MSCo

29、mm控件。Project菜单 -Add to Project-Components and Controls-RegisteredActiveX Controls- 选择Components: Microsoft Communications Control version 6.0 插入到当前的Workspace中。结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。在MainFrm.h中加入MSComm控件。protected:CMSComm m_ComPort;在Mainfrm.cpp:OnCreare()中:DWORD style=WS_VISIBLE|W

30、S_CHILD;if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)TRACE0(Failed to create OLE Communications Controln);return -1; / fail to create初始化串口m_ComPort.SetCommPort(1);/选择COM1m_ComPort. SetInBufferSize(1024); /设置输入缓冲区的大小,Bytesm_ComPort. SetOutBufferSize(512); /设置输入缓冲区的大小,Bytes/if(!m_C

31、omPort.GetPortOpen() /打开串口m_ComPort.SetPortOpen(TRUE);m_ComPort.SetInputMode(1); /设置输入方式为二进制方式m_ComPort.SetSettings(9600,n,8,1); /设置波特率等参数m_ComPort.SetRThreshold(1); /为1表示有一个字符引发一个事件m_ComPort.SetInputLen(0);捕捉串口事项。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。在Main

32、Frm.h中:protected:afx_msg void OnCommMscomm();DECLARE_EVENTSINK_MAP()在MainFrm.cpp中:BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)/映射ActiveX控件事件END_EVENTSINK_MAP()串口读写.完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型是:VARIANT GetInput();及 void SetOutput

33、(const VARIANT& newValue);都要使用VARIANT类型(所有Idispatch:Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:void CMainFrame:OnC

34、ommMscomm()VARIANT vResponse;int k;if(m_commCtrl.GetCommEvent()=2) k=m_commCtrl.GetInBufferCount(); /接收到的字符数目if(k0) vResponse=m_commCtrl.GetInput(); /readSaveData(k,(unsigned char*) vResponse.parray-pvData); / 接收到字符,MSComm控件发送事件。 / 处理其他MSComm控件void CMainFrame:OnCommSend()。 / 准备需要发送的命令,放在TxData中CByte

35、Array array;array.RemoveAll();array.SetSize(Count);for(i=0;iCount;i+)array.SetAt(i, TxDatai);m_ComPort.SetOutput(COleVariant(array); / 发送数据4.2.2 使用32位API通信函数控件简单易用,但由于必须拿到对话框中使用,在一些需要在线程中实现通信的应用场合,控件的使用显得捉襟见肘。此时,若能够按不同需要定制灵活的串口通信类将弥补控件的不足,以下将介绍如何在单线程中建立自定义的通信类。该通信类CSimpleComm需手动加入头文件与源文件,其基类为CObject

36、,大致建立步骤如下:打开串口,获取串口资源句柄通信程序从CreateFile处指定串口设备及相关的操作属性。再返回一个句柄,该句柄将被用于后续的通信操作,并贯穿整个通信过程。CreateFile()函数中有几个值得注意的参数设置:串口共享方式应设为0,串口为不可共享设备;创建方式必须为OPEN_EXISTING,即打开已有的串口。对于dwFlagAndAttribute参数,对串口有意义的值是FILE_FLAG_OVERLAPPED,该标志表明串口采用异步通信模式,可进行重叠操作;若值为NULL,则为同步通信方式,在同步方式下,应用程序将始终控制程序流,直到程序结束,若遭遇通信故障等因素,将导

37、致应用程序的永久等待,所以一般多采用异步通信。串口设置串口打开后,其属性被设置为默认值,根据具体需要,通过调用GetCommState(hComm,&dcb)读取当前串口设备控制块DCB(Device Control Block)设置,修改后通过SetCommState(hComm,&dcb)将其写入。再需注意异步读写的超时控制设置, 通过COMMTIMEOUTS结构设置超时,调用SetCommTimeouts(hComm,&timeouts)将结果写入。以下是温度监控程序中串口初始化成员函数:BOOL CSimpleComm:Open( )DCB dcb;m_hIDComDev=Create

38、File( COM2, GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPE,NULL);/ 打开串口,异步操作if( m_hIDComDev = NULL ) return( FALSE );dcb.DCBlength = sizeof( DCB );GetCommState( m_hIDComDev, &dcb ); / 获得端口默认设置dcb.BaudRate=CBR_4800;dcb.ByteSize=8;dcb.Parity= NOPARITY;dcb.

39、StopBits=(BYTE) ONESTOPBIT;串口读写操作主要运用ReadFile()与WriteFile()API函数,若为异步通信方式,两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,调用GetLastError()函数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。此时,可以用WaitForSingleObject()来等待结束信号并设置最长等待时间,举例如下:BOOL bReadStatus;bReadStatus = ReadFile( m_hIDComDev, buffer, dwB

40、ytesRead, &dwBytesRead, &m_OverlappedRead );if(!bReadStatus)if(GetLastError()=ERROR_IO_PENDING)WaitForSingleObject(m_OverlappedRead.hEvent,1000);return (int)dwBytesRead);return(0);return (int)dwBytesRead);定义全局变量m_Serial作为新建通信类CSimpleComm的对象,通过调用类的成员函数即可实现所需串行通信功能。与方法一相比,方法二赋予串行通信程序设计较大的灵活性,端口的读写可选择较

41、简单的查询式,或通过设置与外设数据发送时间间隔TimeCycle相同的定时器:SetTimer(1,TimeCycle,NULL),进行定时读取或发送。CSampleView: OnTimer(UINT nIDEvent)char InputData30;m_Serial.ReadData(InputData,30);/ 数据处理若对端口数据的响应时间要求较严格,可采用事件驱动I/O读写,Windows定义了9种串口通信事件,较常用的有:EV_RXCHAR: 接收到一个字节,并放入输入缓冲区。EV_TXEMPTY: 输出缓冲区中的最后一个字符发送出去。EV_RXFLAG: 接收到事件字符(DC

42、B结构中EvtChar成员),放入输入缓冲区。在用SetCommMask()指定了有用的事件后,应用程序可调用WaitCommEvent()来等待事件的发生。SetCommMask(hComm,0)可使WaitCommEvent()中止。第五章 界面部分设计实现5.1界面部分结构分析5.1.1 程序结构整体分析程序中的文件:程序采用文档-视图结构,其中一个文档对应多个视图。工程文件中包含的文件有:MainFrm, Experiment, ExperimentView, ControlView, InputView, Output, CtrlComm, SCC, ThreadControl,Th

43、readAssit, LoadFile, CPU, CpuThread, GridCtrl.程序中主要的类:CExperimentDoc 文档类,用于和视图之间的通信,以及作为视图之间通信的介质。CExperimentView 视图类,用于图形的显示,可以动态演示数据流动。CControlView Dialog类,用于显示实验系统内存中的程序和数据。CInputView Dialog类,用于显示实验系统内存中的微程序。COutput Dialog类,用于显示系统信息。CCtrlComm 普通C+ 类,用于控制串口通信。CSCC 普通C+ 类,用于创建一个静态串口控制实例,以控制串口。CThre

44、adControl 线程类,用于串口的操作,主要控制串口的打开、读写、关闭以及指令的发送。CThreadAssit 线程类,用于接收指令,并把指令传递给CExperimentDoc 类。CLoadFile Dialog 类,用于选择实验系统需要载入的文件和选择系统运行方式,比如选择COM口或者选择模拟运行。CCPU 普通C+ 类,模拟CPU中的寄存器和机器的内存。CCpuThread 线程类,用于模拟CPU对机器指令的执行过程。CGridCtrl 普通C+ 类,用于表格操作,可以在CControlView 类和CInputView 类中创建实例,以实现表格的操作,显示文档的内容。5.1.2 界

45、面显示部分结构分析显示部分的框架分为四个部分,如图5.1所示。图 5.1 界面显示分块图左侧为两个表格,上面的表格由CControlView 类动态运行一个实例,这个实例中包含CGridCtrl 类的一个实例,由CGridCtrl类的实例来管理表格中的数据。下面的表格由CInputView 类动态运行一个实例,同样包含一个CGridCtrl 类的一个实例。右侧为绘图区,绘制实验系统的结构图,并且根据运行情况动态显示数据流向。下侧是消息输出区,由COutput 类动态运行一个实例。5.1.3 通信部分结构分析类CCtrlComm 提供了包括打开串口、发送数据、接收数据和关闭串口的方法;类 CSC

46、C 能够创建一个静态的串口控制的实例,用来真正的对串口进行操作;类 CThreadControl 是一个线程类,这个线程和其他线程并行执行,它可以随时向串口发送数据,控制系统的运行、暂停以及要求系统回送数据;类 CThreadAssit 是一个线程类,用于辅助CThreadControl 类的运行,功能是接收串口传来的数据并进行分析然后用来驱动绘图。通过这四个类实现串口的通信。5.1.4 模拟CPU部分结构分析由两个类实现,分别是CCpu,CCpuThread。CCpu定义了一个虚拟的cpu,包括零标志Z,程序计数器PC,地址寄存器AR,指令寄存器IR,寄存器R和TR,程序的运行还需要存储器,

47、同时添加了存储器Memory(用一个数组来定义的)。CCpuThread是一个线程类,用来驱动这个cpu工作,包括取指令和执行指令等操作。在cpu运行的同时还需要将正在执行的操作、相关的寄存器状态和总线的状态作为信号发送给绘图部分。5.1.5 界面部分整体功能设计设计思想:图形的动态显示可以由两部分独立驱动,一部分是模拟CPU,另一部分是来自串口的通信信号。用户进入程序后,可以选择使用模拟CPU或者使用实验板联机操作。模拟CPU可以单独执行用户的程序,在执行过程中将寄存器和总线上的数据信号发送给绘图部分,通过分析信号动态的显示在界面上,具体实现将在后面小节中介绍。串口信号驱动图形显示的过程和模拟CPU类似,模拟CPU采用分析指令的方法的驱动信号,而串口信号主要是微指令信号

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1