本科停车场管理系统毕业论文.docx
《本科停车场管理系统毕业论文.docx》由会员分享,可在线阅读,更多相关《本科停车场管理系统毕业论文.docx(46页珍藏版)》请在冰豆网上搜索。
本科停车场管理系统毕业论文
摘要
本论文以停车场的管理为主题,该系统软件是使用WINDOWS操作平台和SQLServer2000开发的。
本系统是一个功能比较完备的停车场系统,通过实现串口通信,使用SQLServer数据库处理图像等技术,使之具有Checkin、Checkout和计费等主要功能,并在这些功能支持下,停车场管理人员可以监视出门的车辆是否和进门的车辆是同一辆,收款人员可以通过电子显示屏、语音等多种方式告诉顾客应付的金额,停车场的管理人员可以通过后台的数据库,得知收益状况和对历史交易记录进行查询。
关键字:
串口通信,捕捉图像,动画播放,视频
ABSTRACT
ThisthesissetthetopicofParkSystem,andthesystembasesonWINDOWSoperatingsystemandSQLServer2000database.Thisparksystemhasmaturefunctions,itcommunicatestheinterfaceandusesSQLServermanagingtheimagewhichgetfromthevidicon,sothissystemhasthefunctionsofCheckin,Checkout,chargingandsoon.
Havingthisfunctions,themanagercancheckifthecarwasthesamecarwhenitputtingoff,andtellthechauffeurhowmuchmustpayforwhichviatheLED,voiceandsoon.Themangercanknowtheincomeandinquireaboutthehistoricalbusinessrecordfromthebackgrounddatabase.
KEYWORDS:
communicationport,catchimage,cartoonplay,
videofrequency
第一章引言······················································3
1.1本课题研究的目的与意义·································3
1.2本课题的研究目标与预期达到的结果··················3
第二章串口通信概述与其实现······································3
2.1串口通信概述···········································3
2.2串口通信实现···········································4
2.2.1用控件的方法实现串口通信···························4
2.2.2文件的方法实现串口通信·····························6
第三章主要功能简述··············································9
3.1打印凭据···············································9
3.2抓拍图像···············································9
3.3扫描条码···············································10
3.4收费···················································10
第四章系统分析与设计············································10
4.1数据库设计·············································10
4.2系统配置信息···········································11
4.3实现功能的主界面·······································13
第五章重点功能实现与其代码······································13
5.1串口通信···············································13
5.1.1初始化串口·········································16
5.1.2发送数据···········································20
5.1.3接收数据···········································23
5.1.4工作现程函数·······································26
5.2视频功能的实现··········································31
第六章自定义动画播放·············································36
致······························································38
参考文献··························································38
第一章引言
1.1本课题研究的目的与意义
随着社会经济的发展,汽车越来越多走进家庭,开发一个具有凭票泊车、车辆拍照、语音报价、电子屏显示费用、交费等一套完整的停车场的业务逻辑功能的停车场管理系统也就越来越有价值,因此,停车场的管理显得越来越重要。
:
进入21世纪,信息处理技术有着突飞猛进的发展,各类数据、信息急剧增长,大家对信息处理技术的利用已渗透到各行各业的各个环节中,而此同时我国汽车的产量和销量也逐年增长,故对停车场的需求也逐年增加,而对停车场更需要有较好的管理,主要是实现对停车场的智能管理,实现给人们一个安全合理的服务,为人们省去很多麻烦,让人们更关注其他重要的事。
1.2本课题的研究目标与预期达到的结果
本课题的研究目标是建立一个功能比较完备的停车场系统。
通过实现串口通信,使用SQLServer数据库处理图像等技术,使之具有Checkin、Checkout和计费等主要功能,并在这些功能支持下,停车场管理人员可以监视出门的车辆是否和进门的车辆是同一辆,收款人员可以通过电子显示屏、语音等多种方式告诉顾客应付的金额,停车场的管理人员可以通过后台的数据库,得知收益状况和对历史交易记录进行查询。
第二章串口通信概述与其实现
2.1串口通信概述
计算机进行数据传送的方式通常有两种:
一种是并行,一种是串行。
并行数据传送是指数据在多条并行、1位宽的传输线上,同时由发送方传送到接收方的数据传送方式。
串行数据传送则是指数据在单条1位宽的传输线上,一位接一位地按顺序分时传送的数据传送方式。
并行数据通信的距离通常很短,串行数据通信的距离可以很长,从几百米到几千公里均可;并行数据通信的速度比串行数据通信快。
(1)串口通信的连接方式
按照数据在传输线上的传输方向的不同,可以将串口通信分为:
单工方式、半双工方式和全双工方式。
(2)串口通信协议
为了使通信双方顺利地进行通信,那么发送方和接收方必须共同遵守一些基本的通信规则,比如双方的同步方式、差错校验方式、数据传输的速度、通信报文的格式与控制字符的定义与含义。
这些通信规则也可以称为通信协议,通常用到的协议有异步通信和同步通信两种。
2.2串口通信的实现
使用VisualC++实现串口通信的方法有三种:
一种是使用微软提供的MsComm控件的方法;一种是使用VisualC++提供的标准通信函数的方法;一种是使用API的方法,也就是使用文件的方法,串口也是文件。
2.2.1用控件的方法实现串口通信:
微软公司提供了MSComm32控件,这个组件专门用于串口通信,因此,我们可以使用该组件进行串口通信程序的编写。
(1)属性
MSComm32控件提供了许多属性,不过常用的并不是很多,下面是几个常用的属性:
CommPort:
设置/取得串口号;
Settings:
设置/取得串口通信的波特率、奇偶校验、数据位、停止位4个通信特征,这是一个字符串;
PortOpen:
打开/关闭串口,TRUE为串口打开,FALSE为串口关闭。
Input:
从串口接收缓冲区中读取数据。
Output:
向串口发送缓冲区写入数据。
(2)方法
当这个控件加入到VisualC++的工程后,会产生针对于这个控件的类,默认情况下类的名称为CMSComm。
当然,我们可以进行修改,这个类中提供了大量的方法,其中针对于上面提到的属性操作的方法有:
voidSetCommPort(shortnNewValue);
这个函数用来设置串口号,即CommPort属性。
shortGetCommPort()
这个函数用来获取当前操作的串口号。
voidSetInBufferSize(shortnNewValue);
这个函数用来设置输入缓冲区的大小。
shortGetInBufferSize();
这个函数用来获取输入缓冲区的大小。
voidSetOutBufferSize(shortnNewValue);
这个函数用来设置输出缓冲区的大小。
shortGetOutBufferSize();
这个函数用来获取输出缓冲区的大小。
VoidSetPortOpen(BOOLbNewValue);
这个函数通过bNewValue的值来打开/关闭串口,TRUE表示打开串口,FALSE表示关闭串口。
BOOLGetPortOpen();
这个函数用来取得当前串口的状态,是打开还是关闭。
VoidSetOutput(constVARIANT&newValue);
这个函数用来向串口中写入数据,或者称为发送数据。
VARIANTGetInput();
这个函数用来从串口读取数据,或者称为接收数据。
VoidSetSetting(LPCTSTRlpszNewValue);
这个函数用来设置Setting属性,参数lpszNewValue是一个包含波特率、奇偶校验、数据位、停止位信息的字符串。
CStringGetSettings();
这个函数用来获取串口的属性,并返回到一个字符串中。
voidSetCommEvent(shortnNewValue);
这个函数用来设置串口事件,对于这些已经设置了的事件发生后,系统将会自动进行响应,响应函数为OnComm。
在VisualC++中可以对这个函数进行重载,然后再在这个事件响应函数中,使用下面的shortGetCommEvent()函数对发生的事件进行分析,作出不同的动作。
voidSetRThreshold(shortnNewValue);
这个函数用来设置接收数据事件发生的时间,当接收缓冲区中有大于或等于参数nNewValue时,将发生接收数据事件,从而导致事件响应函数OnComm的执行。
(3)响应串口事件介绍
MSComm32控件提供了两种响应串口事件的方式:
①事件驱动方式:
当串口事件(接收缓冲区中有数据、串口状态发生了改变、串口操作发生错误等)发生后,会导致OnComm事件响应函数的运行,因此可以在应用程序中获取发生的事件,并经过分析,针对不同的事件采取不同的操作。
这种方法有程序响应与时,可靠性比较高的优点。
②查询方式:
通过不断地查看CommEvent属性来得知当前串口事件的发生情况。
这种方法显然没有事件驱动方式对串口事件的响应与时,比如当查看程序的一次查看刚刚结束,事件就发生了,可是响应事件要等到下一次查看发现后,才能进行响应。
(4)使用
VisualC++中,使用MSComm控件方法进行串口通信程序的编写时,一般情况是将MSComm控件放入某个对话框中,然后在对话框类中定义这个控件对应的控件类型的数据成员,之后再使用这个数据成员对串口进行操作即可。
对话框资源编辑环境中,默认情况下是没有MSComm控件的,我们可以首先将控件加入到工程中,这时会产生一个默认名称为CMsComm的类,而且,对话框资源编辑环境中将会出现该控件的小图标,只要将这个控件拖到对话框中即可。
2.2.2文件的方法实现串口通信
在16位的Windows中,有提供了一些关于串口通信的函数,有OpenComm、WriteComm、ReadComm、CloseComm等,还提供了WM_COMMNOTIFY消息。
在Win32系统中,除了一般意义上的文件外,还有许多设备也被当作文件进行操作。
下面介绍在32位Windows平台下,使用VisualC++中的文件方法实现串口通信:
(1)打开串口
串口在Win32中作为文件处理,它的打开函数是CreateFile。
函数原型
HANDLECreateFile(
LPCTSTRlpFileName,
DWORDdwDesiredAccess,
DWORDdwShareMode,
LPSECURITY_ATTRIBUTESlpSecurityAttributes,
DWORDdwCreationDisposition,
DWORDdwFlagsAndAttributes,
HANDLEhTemplateFile
);
第一个参数lpFileName:
指定要打开的文件的文件名。
第二个参数dwDesiredAccess:
访问模式。
第三个参数dwShareMode:
共享模式,对于串口来说,这个参数必须给定为0,也就是说,串口不能象一般的文件那样共享,它属于独占设备。
第四个参数lpSecurityAttributes:
安全属性,指向一个SECURITY_ATTRIBUTES结构体,可以通过它来设定设备文件的关联核对象的安全属性,以与设备文件句柄能否被继承,一般给值为NULL,表示创建的文件句柄不能被继承。
第五个参数dwCreationDisposition:
创建方式,对于串口来说,此参数必须设定为OPEN_EXISTING属性,表示打开的是已经存在的文件,如果文件(串口)不存在,则CreateFile函数失败。
因此不能设定为CREATE_NEW、CREATE_ALWAYS、OPEN_ALWAY、STRUNCATE_EXISTING值。
第六个参数dwFlagsAndAttributes:
表示新创建文件的属性和标志,对于串口来说,如果设定了FILE_FLAG_OVERLAPPED,则表示串口通信方式是重叠式的也就是异步的,并且对串口进行读写时必须定义OVERLAPPED结构体。
如果没有设定FILE_FLAG_OVERLAPPED,也就是缺省情况,表示串口通信是非重叠式的也就是说是同步的。
在MS_DOS和16位的Windows下,许多程序员习惯使用同步方式,比如对文件进行读操作时,程序会处于等待状态,一直等到文件的读操作结束返回后,程序才继续执行,用网络的话来说就是阻塞。
第七个参数hTemplateFile:
临时文件的句柄,必须给NULL值。
其返回值:
成功:
返回文件或设备的句柄,表示函数成功地创建或打开了一个文件或设备。
失败:
返回INVALID_HANDLE_VALUE。
(2)设置串口状态
打开串口后,接下来的事情应该是进行串口通信,也就是进行数据的读写。
可是,我们发现串口通信程序出现问题的原因,往往是没有对串口的属性进行正确的设置。
因此,在进行串口数据读写之前,应该进行串口属性的设置,这些属性包括波特率、是否允许奇偶校验、奇偶校验的方式、每个字符的数据位数、接收发送缓冲区情况和停止位数等,在Windows中,把这些属性包装在一个称为DCB的结构体中。
(3)串口的读写
Win32中使用ReadFile()和 WriteFile()函数代替ReadComm()、WriteComm()函数来进行串口的读写。
(4)异步串口通信
对于异步操作方式的串口通信来说,当调用了ReadFile函数或者WriteFile函数后,调用者会立刻返回继续做别的事情。
Win32中使用线程同步核对象得知读写是否返回,可以通过SetCommMask函数来设置串口的事件掩码,然后使用WaitCommEvent函数等待已经设置的某个或某些串口事件的发生。
SetCommMask函数:
BOOLSetCommMask(HANDLEhFile,DWORDdwEvtMaskevent);
hFile参数:
表示文件句柄。
Events:
事件掩码
事件掩码可以是如下值的组合:
EV_BREAK:
检测到一个输入中断;
EV_CTS:
CTS信号改变状态;
EV_DSR:
DSR(数据设置就绪)信号改变状态;
EV_ERR:
发生了线路状态错误;
EV_RING:
检测到振铃信号;
EV_RXCHAR:
输入缓冲区接收到新字符,并把这个字符放入输入缓冲区;
EV_RXFLAG:
输入缓冲区接收到事件字符(属于DCB结构体的EvtChar数据成员);
EV_TXEMPTY:
出缓冲区的最后一个字符被发送出去;
(5)串口的超时设置
对于串口通信来说,可以通过设置它的超时值来影响读写操作函数的返回,简单地说,就是当读写操作超过设置的时间段时返回。
设置时,首先定义一个COMMTIMEOUTS结构体变量,然后通过SetCommmTimeouts函数进行设置即可。
COMMTIMEOUTS结构体定义如下:
Typedefstruct_COMMTIMEOUTS{
DWORDReadIntervalTimeout;
DWORDReadTotalTimeoutMultiplier;
DWORDReadTotalTimeoutConstant;
DWORDWriteTotalTimeoutMultiplier;
DWORDWriteTotalTimeoutConstant;
}COMMTIMEOUTS,*LPCOMMTIMEOUTS;
ReadIntervalTimeout:
指的是读取两个字符的间隔超时指标,当一个字符读取结束后,开始计时,如果已经超过了这个间隔,那么ReadFile函数将返回。
ReadTotalTimeoutMultiplier,WriteTotalTimeoutMultiplier:
用来计算总超时的乘法器。
ReadTotalTimeoutConstant,WriteTotalTimeoutConstant:
这个值加上ReadTotalTimeoutMultiplier与需要读取的字符数的乘积就是总超时。
具体计算公式就是(其中的bytes指的是要读取或写入的字节数):
读总超时值=(ReadTotalTimeoutMultiplier*bytes)+ReadTotalTimeoutConstant
写总超时值=(WriteTotalTimeoutMultiplier*bytes)+WriteTotalTimeoutConstant
(6)关闭串口
当不再使用串口后,应该使用CloseHandle函数将串口句柄关闭,CloseHandle函数原型;
BOOLCloseHandle(HANDLEhobject);
hObject:
对于串口来说,指的是使用CreatFile函数打开串口时得到的句柄。
其返回值:
TRUE:
表示成功关闭;
FALSE:
表示关闭失败;
第三章主要功能简述
3.1打印凭据
汽车到达停车场入口时,入口处的挡车器处于关闭状态。
管理员点击“出票”按钮后,系统打印一印有当前时间和凭据号的纸票。
司机拿到此票据后,管理员打开挡车器,汽车进入停车场。
在系统部要保存这个票号和它相关的数据,为随后汽车从出口驶出做准备。
3.2抓拍图像
在打印凭据的时候,系统同时要抓拍一在进口处的汽车的图像,目的是为了在汽车驶出的时候进行校验。
由于有上述的用法,所以要求本图像一定要保存在数据库中,在日后可以对停车场曾经服务过的车辆进行跟踪。
图像格式要求采用JPEG方式,大小270像素×200像素左右。
3.3扫描条码
在汽车驶出前司机要进行交费,交费的时候司机要提供纸票。
纸票上的通过条形码识别仪读入到系统中。
3.4收费
在本系统中使用统一的费率标准:
2元/小时。
计费的准确性至少精确到秒。
当司机开车要离开停车场,在出口处出示凭据进行扫描或者是人工输入,系统读出车辆的停泊时间,根据费率计算司机应付的钱款。
司机交费后,管理员打开挡车器对车辆放行。
汽车在数据库中的记录要备份下来,其中包括使用的凭据的、进入时间、离开时间、进入时候的图像和交费。
第四章系统分析与设计
4.1数据库设计
本系统使用SQLServer数据库VicAly,程序使用ODBC操作数据。
下面介绍在VicAly数据库中的各个数据表。
在正式工作之前,管理员或者是收款员要输入系统的和口令才能进入。
因此要设计操作员表,如图所示:
SQL语句为:
CREATETABLE[dbo].[TAB_OPERATER](
[OPERATER][varchar](50)NOTNULL,
[PASSWORD][varchar](50)NULL
)ON[PRIMARY]
汽车进入停车场,系统立刻记录下当时的时间和司机所持的卡号还有当时的汽车的图像,所以TAB_COUNTTIME数据表的设计如图所示:
CARD_ID条形码的,也就是司机所持的凭据上的条形码的含义。
IN_TIME是汽车进入时间。
CARD_IMAGE是在汽车进入停车场之前,由系统拍摄得到的照片。
SQL语句为:
CREATETABLE[dbo].[TAB_COUNTTIME](
[CARD_ID][varchar](50)NOTNULL,
[IN_TIME][datetime]NULL,
[CAR_IMAGE][image]NULL
)
系统的需求中要保存每个车辆进入车场的历史记录,包括进入时所持卡的、进入时间、出门时间、收费情况和当时进门时的图像。
根据上面的要求设计表TAB_HISTORY_CARD,字段说明如图所示:
CARD_ID表示纸卡的卡号,也就是打印到凭据上的条形码。
IN_TIME汽车进入的时间
OUT_TIME汽车驶出的时间
PAY_AMOUNT司机所交的费用
CAR_IMAGE汽车进入时的图片
SQL语句为:
CREATETABLE[dbo].[TAB_HISTORY_CARD](
[CARD_ID][varchar](50)NULL,
[IN_TIME][datetime]NULL,
[OUT_TIME][datetime]NULL,
[PAY_AMOUNT][money]NULL,
[CAR_IMAGE][image]NULL
)ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]
4.2系统配置