毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc

上传人:文库蛋蛋多 文档编号:3985302 上传时间:2023-03-30 格式:DOC 页数:58 大小:1.08MB
返回 下载 相关 举报
毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc_第1页
第1页 / 共58页
毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc_第2页
第2页 / 共58页
毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc_第3页
第3页 / 共58页
毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc_第4页
第4页 / 共58页
毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)铁路客运安全服务系统基于VC++的上位机控制系统.doc(58页珍藏版)》请在三一办公上搜索。

1、铁路客运安全服务系统 基于VC+的上位机控制系统摘 要 本文介绍了本人应用VC+6.0和Access2000工具开发铁路客运安全服务系统的过程,对开发软件进行了简单介绍,遵从软件开发的一般步骤,涉及到软件开发前期的系统的需求分析,详细设计过程中数据库的设计,包括表的设计等,着重讲述了我在开发过程中所承担的工作,包括上位机整体的构思、设计及实现,串口控件、类的使用,以及在VC+中主框架、弹出项和数据库的设计,程序模块的编程思想、代码实现等,并总结了在开发过程中所遇到的问题及其解决方法。关键词:串口通讯 Access数据库 ODBC CserialPortExABSTRACT目 录第一章 系统的整

2、体研究1.1 本次毕业设计的意义1.2 设计内容概述第二章 技术的考虑和选择2.1 开发的软件环境2.1.1 Visual C+ 6.02.1.2 Access 20002.2 开发的硬件环境2.2.1 RS-232异步串行通讯总线2.2.2 RS-485接口转换器ADS-1062.3 通讯方案的确定2.3.1目前流行的开发技术的比较2.3.2 Mscomm控件的研究2.3.3 CserialPortEx类的分析2.3.4 为什么要选择CserialPortEx类技术第三章 系统分析与设计3.1问题的提出3.2可行性研究3.3需求分析3.4系统各模块间的关系图第四章 数据库的设计与实现4.1

3、开放式数据库连接(ODBC)技术4.1.1 开放式数据库连接简介4.1.2 MFC对ODBC的支持4.1.3 在MFC中应用ODBC编程4.2 数据库中表的设计4.3 创建并配置数据源第五章 程序设计与实现5.1 程序创建与数据库连接5.2 主窗体的设计5.3 数据库显示模块5.4 串口通讯模块5.4.1 通讯协议的确定5.4.2 数据的接收与入库5.4.3 串口设置5.4.4 点名功能的实现5.5 信息查询模块5.5.1 普通查询5.5.2 问题查询第六章 遇到的问题及解决结论谢辞参考文献技术文章翻译附录前 言在通讯技术飞速发展的今天,随着铁路部门的列车提速,车站人员流动量的增大,铁路客运的

4、安全已经越来越受到人们的关注和重视。针对这一问题,我们设计开发了基于VC+环境下的铁路客运安全服务系统。目前,在这方面航空部门已经将互联网技术应用到比较高的水平,实现了在各大机场间的互动联系通讯,在乘客登机前进行刷卡登机,将基本资料进行记录,然后通过乘客登机前的登机记录,实现对每一次航班的所有登机乘客的基本资料的统计,并在各大机场间进行相应的通讯联系,存储每位乘客登机和离机的时间、地点,从而为出事后的调查工作提供可靠的依据、线索。由于铁路部门是一个每日客流量都很大的大型运输部门,在这方面的管理工作尚不完善,这种比较先进的系统在铁路方面尚未得到广泛的应用,所以这次我们所做的“铁路客运安全服务系统

5、”就是本着在铁路客运站点上实现这种机制的原则,来进行开发设计的,用以解决铁路站点出入人员流动量大、人员情况复杂、难于管理的问题,完善了铁路安全保障系统,保证铁路旅客乘车的安全。所以,要在铁路实现这样一个安全机制,不仅有很强的实用价值,而且有广阔的应用前景,其意义也是非常之深远的。本系统预定由一台上位机和若干台下位机组成,各下位机用来模仿全国铁路的各个站点,上位机运用点名式方法接收、管理、存储各下位机所记录的信息,将之汇总存入后台数据库,并可以针对库中的记录进行各种查询操作。我们小组由6人组成,其中5人各负责一台下位机的实现,我则在课题中主要负责上位机的开发任务,并参与了系统最后的调试工作。对于

6、上位机的开发,主要包括三个方面的内容:串口通讯,前台界面和后台数据库。现在,铁路客运安全服务系统作为较新的管理方法,已经逐渐被社会大众所认同,并开始应用于相关的领域中,它有着很大的发展前景。首先,从社会角度讲,实现这样一个安全机制对整个社会的安全稳定是有很大帮助的,一旦列车出现故障、事故,铁路部门可以及时通过该机制辅助对事故发生的原因进行调查,以尽快找出原因,做好防范措施。其次,从经济角度讲,建立这样一套安全机制对铁路企业自身的长远发展也会有不小的益处。它能够使铁路部门在事故发生后的调查工作中,节省人、财、物力,从而节省开支。当然我们也应看到,现在的铁路客运安全服务系统仍面临着几个重大课题:首

7、先,安全性问题。现在的安全系统的安全性并不是很完善。一些高级黑客可以很轻松地进入系统,破坏系统数据。对于这类问题,目前的系统很少有完善的安全性保证。其次,我们所做的系统只是应用于局域网,通过计算机的串口进行通讯传输的,未来是网络的时代,将来的发展趋势是:在任何可以连接到Internet的地方,都可以运行该系统,如何将安全系统搬到Internet上,这也将是一个重要问题。总之,铁路客运安全服务系统在将来将会越来越快地发展和普及,其前景将会是一片光明。通过本次毕业设计,在导师王老师的耐心指导和同学们的热心帮助下,使我对VC+及数据库技术有了更加深入的理解和认识,同时也为团队合作开发规模稍大项目和综

8、合应用本专业所学课程知识创造了实践机会,使我们通过参加小组团队的开发实践,理解真正的开发团队的工作程序,为今后走向社会打下坚实的基础。下面,让我们来具体介绍和分析这种服务系统。第一章 系统的整体研究1.1本次毕业设计的研究意义随着时代的飞速发展, 社会的不断进步,先进的科学技术不断应用于各大行业中。在铁路部门,现行的乘客安全管理制度已逐渐不能适应当前的时代变化,需要更新和完善。对于这方面的应用,航空部门已经做到了比较高的水平,实现了乘客登机前刷卡,将每一班飞机上乘客的基本资料进行存储,记录每位乘客登机和离机的时间、地点等资料,并通过互联网进行记录的传输,从而为出事后的调查工作提供可靠的依据、线

9、索。铁路,是当今全国重要的交通工具之一。它自出现以来就一直占据交通领域的重要地位,是全国经济运行的命脉;虽然现在航空、海运、河运、公路等其他交通工具蓬勃发展起来,但铁路的重要地位依然没有被动摇。像这样一个重要的部门,它的健康成长是极其重要的。所以,针对铁路现行的安全管理制度的改进是事在必行的。由于铁路部门是一个每日客流量都很大的大型运输部门,在这方面的管理工作尚不完善,类似航空部门那种比较先进的系统在铁路方面尚未得到广泛的应用,所以这次我们所做的“铁路客运安全服务系统”就是本着在铁路客运站点上实现这种机制的原则,来进行开发设计的,用以解决铁路站点出入人员流动量大、人员情况复杂、难于管理等问题,

10、从而完善铁路安全保障系统,保证铁路旅客乘车的安全。要在铁路实现这样一个安全机制,不仅有很强的实用价值,而且有广阔的应用前景,其意义也是非常之深远的。1.2 设计内容概述在本次设计中,我主要负责整个系统上位机的整体设计工作,主要是3个方面内容:串口通讯,主界面设计和后台数据库建立。系统的功能模块主要包括:串口通信模块、数据库处理模块、控制模块、显示模块和查询模块共5个。其中串口通信模块包含:串口数据的接收入库与显示、串口设置、循环点名、单一点名;查询模块包括:普通查询、问题查询。第二章 技术的考虑和选择2.1 开发的软件环境在本次设计中我们使用了Windows ME的操作系统,应用Visual

11、C+ 6.0和Access 2000,下面将对这两种软件进行简单的介绍,并对本人在开发过程中所用到的功能进行简单分析。2.1.1 Visual C+ 6.0Visual C+ 6.0是一种高级编程工具软件,它有功能强大的集成开发环境,并提供功能强大的向导工具(MFC AppWizard、ClassWizard、MFC ActiveX ControlWizard等)来简化Win32应用程序的开发,用它可以方便地进行项目的管理、编写C+源程序、编译、改错。更重要的是,Visual C+提供了一套Microsoft Foundation Classes(简称为MFC)的程序类库(classes li

12、brary),现在这套由微软开发的程序类库已经成为设计窗口应用程序的准工业标准。其向导用于帮助生成各种不同类型应用程序的基本框架,并可以使用Class Wizard 来创建新类(class),定义消息处理函数(message handler),覆盖虚拟函数(virtual function)、从对话框(dialog box)、表单视图(form view)、或者记录视图(record view)的控件中获取数据并验证数据的合法性,添加属性(property)、事件(event)和方法(method)到自动化对象(Automation object)中。此外还可以使用WizardBar来定义消息

13、处理函数、覆盖虚拟函数并浏览实现文件(.cpp)。此外,Visual C+ 6.0提供最快的集成数据库访问,向导工具支持DAO和ODBC类,允许用户建立强有力的数据库应用程序。可以使用ODBC类和高性能的32位ODBC驱动程序来访问各种数据库管理系统;可以使用DAO(数据访问对象)类通过编程语言来访问和操纵数据库中的数据并管理数据库、数据库对象与结构。2.1.2 Access 2000Access是Office办公系列软件中自带的一个数据库管理软件,它提供了一个功能强大、使用方便灵活的信息管理环境,是一个受到一致推崇的桌面数据库系统。它在用户和数据库之间架起了一座桥梁,使得用户对数据的存取、分

14、类和查看更为容易。我用Access 2000建立的数据库,建立了表、并定义了主键。使用ODBC动态连接Access数据库,并运用VC+代码来实现对库内记录的查询功能。2.2 开发的硬件环境在本次设计中,我们的项目涉及到串口通讯的问题,软件方面应用VC+来实现,而硬件方面则应用到RS-485接口转换器ADS-106来实现通讯目标。2.2.1 RS-232-C异步串行通讯总线RS-232-C是使用得最早、最多的一种异步串行通信总线。它由美国电子工业协会于1962年公布,它主要用来定义计算机系统的一些数据终端设备(DTE)和数据通信设备(DCE)之间接口的电气特性。RS-232-C标准总线有25条信

15、号线,对其机械特性并未做严格规定。在RS-232-C中包括两个信道:主信道和次信道,它的信号分为两类:一类是DTE与DCE交换的信息:TxD和RxD;另一类是为了正确无误地传输上述信息而设计的联络信号。2.2.2 RS-485接口转换器ADS-106RS-485接口转换器ADS-106可将RS-232-C串行口的数据发送(TD)和数据接收(RD)信号转换成两线平衡的半双工RS-485信号,它是远距离控制设备或点到多点总线通信的最佳选择,该接口转换装置,不需要外接交流直流电源,可直接从RS-485 端口内的数据发送(TD)信号、请求发送(RTS)或数据终端准备好(DTR)获取电源,而且还加上了发

16、送数据自动控制的功能,在发送接收数据时不需要RTS使能控制。如下图所示:这是一般应用RS-485接口转换器的示意图,转换器RS-232口端接上位机中心主站,RS-485口端串行连接各RS-485设备。但在本设计中,接口转换器RS-232口端接上位机中心主站,而RS-485口端则与其他接口转换器的RS-485口端相连,形成一个星型连接。2.3 通讯方案的确定在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。目前,用VC+来实现串口的通讯方法有很多种,下面逐个进行简单的介绍,重点分析MSComm控件和CserialPortEx类,最后说明

17、选择CserialPortEx类的原因。2.3.1目前流行的几种开发技术的比较在Microsoft Windows下开发串口通信程序通常有如下几种方法:1)利用Windows API通信函数。2)利用Windows的读写端口函数_inp、_inpw、_inpd、_outp、_outpw、_outpw(Windows95系列下)或开发驱动程序(Windows NT系列下)直接对串口进行操作。3)利用第三方提供或自己编写的通信类。4)使用串口通信组件,如:ActiveX控件MSComm。 在以上几种方法中第一种(即API函数法)使用面较广,但由于比较复杂,使用比较困难。第二种需要了解硬件电路结构原

18、理,深入驱动层次,专业化程度较高。第三种方法使用面向对象技术封装Win32 API函数,提供一个用于串行通信的类,只要理解这种类的几个成员函数,就能方便地使用。第四种方法较简单,只需要对串口进行简单的配置,唯一比较困难的地方在于令人费解的VARIANT类。2.3.2 Mscomm控件的研究Microsoft Communication Control(简称MSComm)是微软公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法,在Visual C+、Visual Basic、Delphi等语言中均可以使用。MSComm控件提供两种处理

19、通信的方式:事件驱动方式和查询方式。(1)事件驱动方式:事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及

20、时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件(2)查询方式:查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。MSComm 控件有很多重要的属性,但首先必须熟悉几个属性:1)CommPort 设置并返回通讯端口号。2)Settings 以

21、字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。3)PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。4)Input 从接收缓冲区返回和删除字符。5)Output 向传输缓冲区写一个字符串。下面分别描述:CommPort属性 设置并返回通讯端口号,类型为short。语法:object.CommPortvalue (value 一整型值,说明端口号。)说明: 在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。注意:必须在打开端口之前设置 C

22、ommPort 属性。Settings 属性 设置并返回数据波特率、奇偶校验、数据位、停止位参数,类型为Cstring。语法:object.Settings = value说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。Value 由四个设置值组成,有如下的格式:BBBB,P,D,SBBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:9600,N,8,1 PortOpen 属性 设置或返回串口状态,BOOL类型:值为TURE时打开,值为FALSE时关闭。Input属性 从接收缓冲区读取数据,类型为VARI

23、ANT。Output属性 向发送缓冲区写入数据,类型为VARIANT。2.3.3 CserialPortEx类的分析串口通信类CserialPortEx是在Remon Spekreijse设计的CserialPort类基础上设计的,并增加了对二进制数据传输和块读写方式的支持和其他功能函数。CserialPortEx类主要使用异步方式操作串口,但为了能适用于不同的需求,也提供了使用其他方式操作串口的公共成员函数。CserialPortEx类的设计目标是提供封装串口通信细节、健壮高效的串口通信类,能支持多串口、多线程,并能在所有主流Windows系统下使用。CserialPortEx类的用户只需熟

24、悉少数几个公共成员函数,就能轻易在自己的程序中加入串口支持。但值得注意的是,CserialPortEx类并不支持串口通信协议,因为不同应用场合下可能需要使用不同的协议,而使用串口所需的基本功能在各种应用场合都是将近相同。下面简单分析CserialPortEx类的基本功能:(1)建立Event:本步骤在串口初始化函数CserialPortEx:InitPort内实现,用异步方式操作串口必须要定义OVERLAPPER结构m_ov,其中的hEvent成员必须自己创建,它通常必须负责EV_RXCHAR(有字符到达串口)和EV_BREAK、EV_CTS、EV_DSR、EV_ERR、EV_RING、EV_

25、RLSD、EV_RXFLAG、EV_TXEMPTY等串口通信状态事件;此外CserialPortEx建立了m_hShutdownEvent(关闭串口,最高优先级)和m_hWriteEvent(写串口)事件。关键代码如下所示:if (m_ov.hEvent != NULL)ResetEvent(m_ov.hEvent);m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hWriteEvent != NULL)ResetEvent(m_hWriteEvent);m_hWriteEvent = CreateEvent(NULL, TRU

26、E, FALSE, NULL);if (m_hShutdownEvent != NULL)ResetEvent(m_hShutdownEvent);m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);/ initialize the event objectsm_hEventArray0 = m_hShutdownEvent;/ highest prioritym_hEventArray1 = m_ov.hEvent;m_hEventArray2 = m_hWriteEvent;(2)打开串口:本步骤在串口初始化函数CserialPo

27、rtEx:InitPort函数内实现。应用异步方式必须指定FILE_FLAG_OVERLAPPED,而文件方式必须OPEN_EXISTING,同时读写必须是GENERIC_READ|GENERIC_WRITE。关键代码如下:m_hComm = CreateFile(szPort,/串口名称字符串,如:COM1GENERIC_READ | GENERIC_WRITE,/读写0, /以独占方式打开NULL, /未设置安全属性 OPEN_EXISTING, /串口设备必须设置此值FILE_FLAG_OVERLAPPED,/使用异步I/O0); /串口设备该参数必须设为0(3)设置串口参数:本步骤仍在

28、CserialPortEx:InitPort函数内实现。主要对串口的DCB 结构、超时时间和串口状态事件进行配置。(4)创建串口主线程:本步骤中线程创建在CserialPortEX:StartMonitoring内实现,线程实现函数为:CserialPortEX:CommThread。 串口主线程监视写(m_hWriteEvent)、关闭(m_hShutdownEvent)和串口通信状态事件(m_ov.hEvent,包括数据到达串口事件),并调用相应函数处理这些事件。在串口主线程内将使用WaitCommEvent检测线路状态,使用WaitForMultipleObjects监视上述3类事件。(

29、5)读写数据:CserialPortEX提供了两种读数据的方式,隐式调用的ReceiveChar(默认方式)和显式调用的ReadBlock。ReceiveChar不需用户调用,串口主线程在有数据到达串口时自动调用该函数,它将读取到的数据通过自定义消息WM_COMM_RXCHAR发送给窗口m_pOwner,调用者只需在该窗口内处理WM_COMM_RXCHAR消息即可。ReadBlock由用户显式调用,调用形式如下:BYTE* CserialPortEX:ReadBlock(CserialPortEX*Port,int&readLen)当调用ReadBlock时,将屏蔽CommThread对Rec

30、eiveChar的调用。在串口主线程中CserialPortEX使用WriteChar(CserialPortEX*port)成员函数写串口,此外CserialPortEX提供了两个公共函数作为接口以供调用写串口,如下所示:void CserialPortEX:WriteToPort(BYTE*string,int nLength);void CserialPortEX:WriteToPort(Cstring str);(6)关闭串口:本步骤在CserialPortEX:StopMonitoring中实现。2.3.4为什么要选择CserialPortEx类技术在本次毕业设计中,我最终选择了Cs

31、erialPortEX类来进行串口通信的设计工作,放弃了在开始时决定使用的MSComm 控件。其原因主要是从以下几个方面来考虑的:首先, 从功能方面考虑,MSComm 控件对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂处理的时候, MSComm通讯控件就不是那么好用了。 它毕竟是一个VC+中自带的控件,在功能方面还是有限的,不如CserialPortEX类的功能强大。其次,从程序健壮性方面考虑,我们设计中的通信传输属性默认设置是“9600,8,1,N”,若应用MSComm 控件的话,如果需要对这一数据进行变动,只能到源程序中手动修改Settings的参数值,而Cse

32、rialPortEX类则提供了BOOL CserialPortEx:InitPort函数支持动态设定串口参数,可以随时在生成的系统上进行更改,这就大大的扩展了所开发程序的应用范围。再次,我设计的上位机是基于VC+中的单文档应用程序,而MSComm 控件在基于对话框的程序中十分好用,但要让它基于单文档就不是那么简单了,按常规在对话框中的方法添加根本行不通,如要应用还需做相应的更改工作,且与最终实现的某些功能有冲突。最后,在今后这方面的实际应用中,随着程序开发的具体要求不同,对通信要求的功能也就不同。从长远来看,使用CserialPortEX类比用MSComm 控件更有发展前途。第三章 系统分析与

33、设计3.1问题的提出在科技飞速发展的今天,铁路部门现有的乘车管理机制已不能完全适应时代的发展,存在着出入人员流动量大、人员情况复杂、难于管理等问题,所以急需开发一个新的系统,实现有效的管理。3.2可行性研究可行性研究是指在当前组织内外的具体条件下,系统开发工作必须具备资源和条件,看是否满足系统目标的要求。在系统开发过程中进行可行性研究,对于保证资源的合理使用,避免浪费和一些不必要的失败,都是十分重要的。1.目标方案的可行性目标和方案的可行性是指目标是否明确,方案是否切实可行,是否满足组织进一步发展的要求。2.技术方面的可行性技术方面的可行性就是根据现有的技术条件,考虑所提出的要求是否能达到。关

34、系到下面几个方面: 人员和技术力量的可行性 基础管理的可行性 组织系统开发方案的可行性 计算机硬件的可行性 计算机软件的可行性 环境条件以及运行方面的可行性3.经济方面的可行性经济方面的可行性主要是从组织的人力、财力、物力三方面来考察系统开发的可行性。我们经过了解和分析,确定本次设计的目标十分明确,方案切实可行,且能够较好的适应铁路现行的情况;目前我们掌握的技术(VC+6.0高级编程语言和Access数据库)已经能够实现所提出的要求,计算机系统的软、硬件开发环境也是允许的;从经济方面看,我们6人小组足以胜任这项开发工作,在财力、物力方面也没有什么问题。因此我们开发的这个“铁路客运安全服务系统”

35、项目是可行的。3.3需求分析本次设计的具体计划为:模拟当前铁路部门的几个站点,在每个站点建立一个出入站旅客信息登记制度,将每个站的出入旅客基本资料进行存储入库,另建立一台上位机对这些下位机的记录进行汇集存储,并通过串口相互连接的方式来实现通信传输。针对上位机,要求应用点名式的方法,正确接收各台下位机所发送的数据,正确记录后存入后台数据库,能够对库中的记录进行不同条件的查询,并能够查找出提前或置后下车的旅客信息。对于整个系统,我主要负责其中上位机的整体设计及实现工作。对于上位机的设计,主要是3个方面内容:串口通讯,主界面设计和后台数据库建立。系统的功能模块主要包括:串口通信模块、数据库处理模块、

36、控制模块、显示模块和查询模块共5个。其中串口通信模块包含:串口数据的接收入库、串口设置、循环点名、单一点名;信息查询模块包括:普通查询、问题查询。串口数据的接收入库与显示主要是将从串口缓冲区读取的数据正确的存入数据库中相应的位置并将当前信息显示在主界面上;串口设置是可以根据提供的相关选项来进行对串口的波特率、数据位、停止位、校验位的设定;循环点名和单一点名则是根据具体的要求对各下位机轮流或单一发送消息,与之建立通讯连接;查询功能可以分为两种方法:普通查询能依据旅客号查找出想了解的旅客的基本信息,而问题查询则可通过该旅客的上下车地点来判定他是否是按目的地正常下车的。3.4系统各模块间的关系图我们

37、设计的安全系统在串口通信方面采用前面提到过的CserialPortEx类来进行实现,接收串口数据时使用隐式调用,CserialPortEx在串口数据到达时将数据发送到程序主窗口。控制模块每隔一段时间察看一次主窗口串口数据接收缓冲区,并对符合要求的数据进行处理后通过数据库处理模块存储到数据库中,同时请求显示模块更新记录。在需求分析的基础上,考虑Visual C+程序编制特点,得到如下所示的系统各模块间关系图:(其中宽箭头表示数据流向)第四章 数据库的设计与实现4.1 开放式数据库连接(ODBC)技术开放式数据库连接ODBC为各种类型的数据库管理系统提供了统一的使用 SQL语言的程序设计接口,本次

38、设计的系统就是使用ODBC接口将数据保存到数据库中的。4.1.1 开放式数据库连接简介ODBC(Open DataBase Connectivity),即开放式数据库连接,是基于SQL(结构化查询语言)而设计的,它提供了一组对数据库访问的标准API(应用程序编程接口)。一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,所有数据库的操作由对应的DBMS的ODBC驱动程序完成。在默认情况下,VC6.0只会安装SQL Server、Access、FoxPro和dBase的驱动程序。由于ODBC通过使用驱动程序来提供数据库的独立性,因此,对于不同的数据库就要求使用不同的数据库驱动程序,驱动程

39、序实际上是一个支持ODBC函数调用的模块,通常就是一个动态链接库DLL,应用程序就是通过调用动态链接库上的驱动程序所支持的函数来操作数据库的,它让应用程序的编写者避免了与数据源相连的复杂性。4.1.2 MFC对ODBC的支持MFC的ODBC数据库类对较复杂的ODBC API进行了封装,提供了简化的调用接口,从而大大的方便了数据库应用程序的开发。MFC的数据库类包括CDatabase类、CRecordset类、CRecordView类和CFieldExchange类。CDatabase类针对某个数据库,负责连接数据源;CRecordset类针对数据源中的记录集,负责对记录的操作;CRecordV

40、iew类负责记录集的用户界面;而CFieldExchange类负责CRecordset与数据源的数据交换。1.CDatabase类: CDatabase类主要功能是建立与ODBC数据源的连接,连接的句柄存放在其数据成员m_hdbc中,并提供一个获取连接字符串的成员函数GetConnect。可以创建一个CDatabase类的对象,然后调用OpenEx成员函数来建立与数据源的连接(通过ODBC驱动程序),函数原型为:Virtual BOOL OpenEx(LPCTSTR,DWORD dwOptions=0);其中,参数lpszConnectString用于指定一个ODBC连接字符串,该字符串包含数

41、据源名称和其他选项信息。若该值为NULL,则将弹出一个数据源对话框提示用户选择数据源,参数dwOptions用于指定打开的数据库是否为独占方式和只读方式等选项。2.CRecordset类: CRecordset类代表从数据源选择的一组记录(记录集),程序可以选择数据源中的某个表作为一个记录集,也可以通过对表的查询得到记录集,还可以合并同一数据源中多个表的列到一个记录集中。通过该类可以构造一个记录集,可以打开一个记录集,可以对记录集中的记录进行滚动、修改、增加和删除等操作。CRecordset类与数据源记录的交换是利用记录字段交换RFX机制。从数据库中导出的记录集有两种类型:快照(Snapsho

42、t)和动态集(Dynaset)。快照是一次性地从数据库中下载整个记录集内容,由固定成员组成一个静态集合。动态集是创建指向所请求的每个记录的实际指针,当连接的数据库是共享方式时,动态集的记录内容将动态显示你和其他应用程序所做的修改,因此其记录集内容不是一次性给定的,而是动态变化的。默认的记录集类型是快照。CRecordset类主要的成员函数:(1)记录浏览操作函数:包括Move、MoveFirst、MoveLast、MoveNext、MovePrev和SetAbsolutePosition六个函数。Move函数将光标从当前位置往前或往后相对移动若干个记录,移动的记录数由参数指定,正值往前移(尾部

43、方向),负值往后移(头部方向)。SetAbsolutePosition函数将当前记录移到由参数指定的记录号上。其他四个函数分别将光标移到记录集中的第一个记录、最后一个记录、下一个记录和前一个记录。(2)记录更新操作函数:包括AddNew、Delete、Edit、Update、CancelUpate和Requery六个成员函数。AddNew函数用于添加新记录,Delete函数用于删除当前记录,Edit函数用于修改当前记录各字段数据的值。Update函数用于完成前三个函数所做的修改在数据源上的最后保存,CancelUpdate函数取消任何由Edit和AddNew操作导致的待处理的更新。Requer

44、y函数用于重新执行对记录集的查询,更新所选记录。通过给成员数据m_strFilter和m_strSort赋新值,然后调用Requery函数,可实现对记录的筛选和排序。(3)构造函数:构造函数CRecordset用于创建一个记录集对象,并把一个CDatabase对象的指针作为参数传递给CRecordset函数,以便获得已由CDatabase对象建立起来的与数据源的连接。如果传给它一个NULl值,则CDatabase对象被自动创建,并自动连接到数据源。CRecordset或其派生类对象通过一个虚函数GetDefaultConnect获得默认的连接字符串。必须在CRecordset派生类中定义该构造

45、函数的内容。(4)记录字段数据交换函数:包括DoFieldExchange和DoBulkFieldExchange两个函数,前者用于一般情况(少量记录行)的字段数据交换,后者用于大量记录行时的字段数据交换。记录字段数据交换是指在记录集上字段数据成员与数据源上当前记录对应列之间自动交换数据。(5)其他重要的成员函数:GetDefaultSQL函数用于获得默认的SQL语句。CanUpdate函数用于确认记录集是否可以更新。GetRecordCount函数用于获取记录集中的记录个数。IsDeleted函数用于确认当前记录是否被打上删除标记。IsBOF和IsEOF函数分别用于确认记录指针是否位于第一个

46、记录之前或最后一个记录之后。GetFieldValue函数用于获取当前记录中指定字段的值。3.CRecordView类: CRecordView类称之为记录视图,是在控件中显示数据库记录的视图。该视图是直接与一个记录集对象相连接的对话视图,从一个对话模板资源创建,在对话模板控件中显示记录集对象的字段数据。记录视图对象利用对话数据交换DDX机制和记录字段交换RFX机制自动实现窗体的控件与记录集的字段之间的数据移动。CRecordset也提供了移动记录(移动到第一个、下一个、前一个和最后一个)的默认实现,以及在视图中根据当前记录更新用户界面的默认实现。用AppWizard生成数据库应用程序框架时,

47、AppWizard自动生成一个“记录”菜单,下面带有上述的移动记录的四个菜单项,并在工具栏上生成相应的四个工具按钮。CRecordsetView跟踪用户在记录集中的定位情况,以便记录视图能更新用户界面。CRecordView类是从CFormView类派生而来的,CFormView与一般CView派生类的区别是在应用程序中会有一个对话框资源与该视图对应,在程序运行时,该对话框显示在当前视图中。CRecordView类从基类继承的成员函数中最重要的是对话数据交换函数DoDataExchange和数据更新函数UpdateData,前者用于实现记录集的字段与对话框的控件之间进行数据交换,后者用于更新对话框中控件的数据。CRecordView类的特有成员函数为:(1)OnGetRecordset函数:调用OnGetRecordset函数以获得指向CRecordset派生类对象的指针。ClassWizard已为你重载了该函数,如果必要的话,ClassWizard将创建记录对象。(2)OnMove函数:如果当前记录已改变,OnMove函数更新对当前记录所做的修改,移动当前记录到指定的记录上(下一个、前一个、第一个或

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号