基于6818的电子抽奖系统_第1页
基于6818的电子抽奖系统_第2页
基于6818的电子抽奖系统_第3页
基于6818的电子抽奖系统_第4页
基于6818的电子抽奖系统_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京理工大学珠海学院2020届本科生毕业设计基于6818的电子抽奖系统摘要本电子抽奖系统,是一款可以在ARM(cortex-A53)平台和LINUX操作系统上,以QT为框架,C/C++为语言基础实现的抽奖平台的程序。本课题设计一种,用户可安全进行注册登录,密码加密,现状及发展趋势简易可靠的电子抽奖系统。用户数据用数据库保存,方便下次登录。使用QT中的ui界面设计师实现界面跳转。管理员可以更改中奖概率。它可代替传统抽奖方式,公平性、实用性、可靠性、成本等因素都十分可观,推广应用前景广阔,可以使用于各种各样的需要抽奖的活动中。关键词:ARM;LINUX;QT;C/C数据库;交叉编译Electroniclotterysystembasedon6818AbstractThiselectroniclotterysystemisalotteryplatformprogramthatcanbeimplementedonARM(cortex-A53)platformandLINUXoperatingsystem,usingQTastheframeworkandC/C++asthelanguagefoundation.Thistopicdesignsasimpleandreliableelectroniclotterysysteminwhichuserscansafelyregisterandlogin,passwordencryption,currentstatusanddevelopmenttrend.Userdataisstoredinadatabasetofacilitatethenextlogin.UseuiinterfacedesignerinQTtorealizeinterfacejump.Theadministratorcanchangetheprobabilityofwinning.Itcanreplacethetraditionalwayoflottery.Ithasconsiderablefactorssuchasfairness,practicability,reliability,costandsoon.Itcanbewidelyusedinallkindsofactivitiesthatneedlottery.Keywords:ARM;LINUX;QT;C/C++;crosscompilation目录1前言 51.1本设计的目的、意义及应达到的技术要求 51.2本设计在国内外的发展概况及存在的问题 51.3本设计应解决的主要问题 52本设计 62.1程序框架选择 62.2课题设计中的ui设计 72.3SQL数据库使用户登录注册信息的保存实现 82.4多界面跳转 102.5电子抽奖中的随机数 122.6电子抽奖中的消息盒子 132.7交叉编译QT程序到开发板上运行 152.8基于ARM的cortex-A53的6818平台 163结论 18参考文献 18致谢 19附录 201前言电子抽奖系统,可以代替传统的纸面抽奖或道具抽奖,在这个节奏加快的时代下,可以推广应用与多种活动场景、游戏应用或商业用途。本次课程设计的电子抽奖系统,公平性、实用性、可靠性、成本等因素都十分可观,推广应用前景广阔,可以使用于各种各样的需要抽奖的活动中。操作简单快捷,不论长幼,也不论文化水平高低,即使是完全不会电脑操作的人,也能轻松上手驾驭使用电子抽奖系统。1.1本设计的目的、意义及应达到的技术要求通过此课题,既可以进一步了解抽奖系统的工作原理,还可以巩固学习ARM平台上的各种知识点。随着现代化趋势的发展,设计一种简单易操作还稳定可靠的电子抽奖系统,可以广泛应用于各种需要抽奖的活动中,推广应用前景广阔。使用的软硬件及技术支持:linux(unbuntu镜像)、qtcreator、交叉编译器、sqi数据库、C/C++语言、基于ARM的cortex-A53的6818开发板。1.2本设计在国内外的发展概况及存在的问题国内外还未普及研究电子抽奖系统,市面上还没有方便快捷简单的电子抽奖系统,人们活动或游戏或商业中需要抽奖的时候,大部分还是使用传统的纸面或道具抽奖,然而在使用结束后往往因为不常使用而丢弃,这会导致资源的浪费和成本的提高。现代社会中许多操作往往还离不开网络的支持,在许多情况下在使用电子抽奖系统的时候会往往会受网络的限制,这也凸显我们需要一款操作简易方便易上手,可以单机使用的电子抽奖系统。1.3本设计应解决的主要问题本设计主要解决的问题分为以下三个:a.sql数据库的使用,保证数据读取、写入的正确性,用以保存用户信息,秘密加密安全,方便下次直接登录;b.QT的ui界面设计师设计多个注册登录与主窗口界面,再由代码注意好界面跳转的细节;c.中奖概率的设置及使用,ui界面设计师设计对应的更改概率按钮;2本设计2.1程序框架选择本设计采用的是以C++为基础的ui设计师应用程序开发框架,完整的跨平台软件开发框架——QT。QT是一款1991年由QtCompany开发的跨平台C++图形界面设计师应用程序开发框架,至08年,Qt被诺基亚公司从Trolltech公司收购,而Qt也就成为了诺基亚旗下的程序开发工具。后又在三四年间几经辗转,被芬兰的IT服务公司Digia所收购,又经过Digia公司几年间的开发,直到2019年,Digia公司正式发布了Qt5.13版本。Qt的基础语言是C++,故而属于面向对象的框架,由特殊的代码扩展生成而被使用,还有一部分宏,QT允许我们工程师组件编程,并且很容易扩展。其实在根本上,Qt的类型与Windows平台上的OWL,MFC,VCL,ATL以及X_Window上的GTK,Motif,Openwin等图形ui界面设计库都十分相近。由于QT是以C++为基础的程序开发框架,故而沿袭了C++中的一些重要特性,其中最主要的就是包含了封装、继承、多态、抽象的四大面向对象的基本特征,例如QT中的QWidgetclass(界面窗口类)就是继承于QObjectclass(控件类),以及QPushButton(按钮控件类)继承于QAbstractButtonclass(抽象按钮类),而AbstractButtonclass又是继承QWidgetclass,经过这样一整条继承链,这样就可以通过继承父类获得多态化的各个窗口、空间、函数接口,而且可以实现子类内存由父类进行自动回收。并且QT有着几大特点,可以在很大程度上对代码编程进行简化、优化:1.QT具有极其优良的跨平台性,它能够实现跨越多个平台程序兼容部署,不仅限于windos以及linux,乃至大多主流平台、操作系统:Android、ios、OS、FreeBSD、QNX、AIX等等(兼容内容不包括操作系统中特定的函数api接口),交叉编译后也可以完美兼容于开发板、移动设备等,通过QT的这一特性,能够实现一份代码完全不用经过任何的修饰加工就可以完美移植并运行于其他的平台/操作系统(不包含硬件本身问题的情况下,后文列举相关内容作为反例)。2.QT能够更加便利的设计GUI(GraphicalUserInterface,又称图形用户接口),通过QT中的设计师界面配合着信号与槽函数以及QT中多达500多个类,丰富的API,能够便捷的设计出功能更加复杂应用层窗口及控件。诸如YY语音、AdobePhotoShop、Googleearth都是通过Qt这一多功能的程序开发框架开发出来的应用产品。3.QT框架能够完全兼容C语言及C++,并且加入了涵盖了包括C语言、C++、以及QT中所特有的API接口的帮助手册,该帮助手册不仅涵盖了各类函数接口的相关头文件、返回值,以及所需的各项参数,还标注出了该函数的父类(基类)和子类(派生类),以及与该函数的类相关联的其他函数接口。2.2课题设计中的ui设计在本设计中,所有的窗口界面、按钮都是由Qt中的函数接口以及设计师界面进行配合设计,以及运用到了Qt中所特有的槽函数,将信号和槽组合在一起使用能够实现控件与控件之间或者是控件与窗窗口之间的联动。设计师窗口生成的对象在头文件中进行声明后,于想要设置ui界面的对象的构造函数中,通过调用setupUi函数即可设置ui界面。在Qt中,信号分为很多种,我们不仅可以在头文件的signals关键字下对信号进行声明,我们还可以使用控件本身自带的相关接口。图2.SEQ图表2.2.\*ARABIC1信号于槽函数链接在这个窗口中显示了该控件包含的信号接口以及接口的基类。在本次课程设计中,我们主要使用的按钮信号有clicked()信号,选中后即可在设计师窗口对应对象的.cpp文件中生成槽函数,并且在对应的.h头文件中生成对应的函数声明。当我们按下按钮时,按钮就会立即发出相关的clicked()点击信号,当信号被对象接收到的时候,对象就会调用该槽函数中的算法函数进行操作。本课程设计的“登录”、“注册”还有“开始抽奖”以及“更改概率”都是使用这种方法来进行设计实现的。利用信号与槽的机制,实现点击按钮触发事件,从而进行多界面跳转和电子抽奖。2.3SQL数据库使用户登录注册信息的保存实现SQL(StructuredQueryLanguage)是一种数据库语言,交互性是这种语言的一大特点,具有数据的操纵和定义等多种功能。这种语言能十分方便地为用户提供许多简易操作,我们可以完善利用SQL语言来提高本次课程设计中的计算机系统的工作质量与效率。这种语言不仅能独立应用于终端,还可以作为子语言为其他程序设计提供有效助力,该程序应用中,SQL可与其他程序语言一起优化程序功能,进而为用户提供更多更全面的信息。在现代数据发展越来越快的趋势下,数据库系统的规模与数据类型还仍然在一直发展壮大,这使得数据库管理带来机遇的同时也带来了一定的挑战。在现代大数据的发展趋势下,数据库的应用也在不断地发展壮大,是否能够提升数据库开发以及使用的效率,成为保障我国经济生产以及生活质量保障关键的一个问题。SQL作为一种操作命令集,以其丰富的功能受到业内人士的广泛欢迎,成为提升数据库操作效率的保障。SQLServer数据库的应用,能够有效提升数据请求与返回的速度,有效应对复杂任务的处理,是提升工作效率的关键。由于SQLServers数据库管理系统具有较高的数据管理性能,因其优越的性能,应用范围非常广,大量应用于服务器和客户体系结构中。SQLServers数据库的性质主要由以下几个方面体现:系统的吞吐量、响应时间以及并行处理能力,发出请求服务器回应的速度、还有不同屏幕之间切换的速度等等。SQLServer数据库包括MicrosoftSQLServer以及SybaseSQLServer两个子数据库,该数据库能否正常运行直接关系着整个计算机系统的运行安全。QtSql类封装完善,使用之前需要我们检查是否包含<QtSql>库。而本次课程设计在使用数据库前,也在.pro文件底部加上QT+=sql一句。QT中的数据库包含以下类:图2.2QT数据库包含的类QSqlDatabase类用于新建数据库,如本课程设计中使用的://创建数据库QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("password.db");QSqlQuery用来来执行sql语句,如本课程设计中使用的://创建表格QSqlQueryquery;if(!query.exec("createtableifnotexistsuserpass(idintegerNOTNULLPRIMARYKEYAUTOINCREMENT,usernamevarchar(128)unique,passwordvarchar(256))")){qDebug()<<query.lastError().text();return-1;}其中,用if语句来判断QT语句是否执行创建成功,如果执行失败就返回-1。我们可以通过对界面中的输入框输入信息,使用QString类型的“QStringusername=ui->lineEdit->text();”语句来获得界面中用户所输入的信息,在程序编写的时候,如果想要加强数据库使用的安全性,我们可以使用到Qt中已经给我们包装好的的一些可提供安全加密的方法,例如:Md4,Md5,Sha1,Sha224,Sha256,Sha384,Sha512,Sha3_224,Sha3_256,Sha3_384,Sha3_512,当课程设计中需要使用到QT里面所拥有的加密方法时,可以直接使用Qt中的QCryptographicHash类来帮助我们进行加密。其中,本次课程设计使用到了这些加密方法中的MD5。首先需要创建语句“QCryptographicHashmdHash(QCryptographicHash::Md5);”然后将我们的密码放进去进行加密“mdHash.addData(password.toUtf8());”,注意,这里需要将密码转化成utf8模式,不然会出现错误。然后将密码进行加密,“QByteArraymd5password=mdHash.result();”“QStringpwd=md5password.toHex();”需要转化成16进制数的字符串语句,才能完整实现密码加密行为。图2.3数据库中密码加密加密后我们可以发现,密码变成了一串由数字和字母组成的乱码。这是因为我们使用的是MD5信息摘要算法(MD5Message-DigestAlgorithm),这种算法是一种可以产生出一个16字节的128位的散列值(hashvalue),被大多数人推广使用的密码散列函数,传输完整一致的信息一般就是用这种方法来确保。输入的信息被处理为512位分组,在一些内部处理进行前,需要先把每一个大分组划分成为16个32位子分组,有四个32位分组来组成算法的输出,一个128位的散列值将在级联这四个32位分组后被生成。为什么要对数据库中的一些信息进行必要的加密呢?这是为了增加数据库信息的安全性。如果没有采用任何的保密措施,直接把密码的信息,以明码的方式放置在数据库中,这样密码的信息就可以轻易的被系统的管理员所拿到,如果这一系列信息被泄露,破译这些密码也会变得十分简单。在选择了密码加密后,如果没有相对应的解密算法,就算是整个数据库被别人拿到了,原来的密码信息也不会轻易被泄露出去。MD5算法解决了密码安全这个问题,它独特的工作方式,任意长度的输入串会在被计算过之后,被它得到固定长度的输出,就算相同的密文被得到,如果是明文不相同的话,而且不可逆是这个算法的特点,加密过后的密文即使被得到了,也不会被通过解密的算法,从而使得明文被反算出。如此便得以使用MD5值的方法把用户的信息保护起来,在用户想注册信息的时候,系统在要去和系统中保存的MD5值获取比较之前,要先去把用户所输入的信息改换成MD5值,只有在密文相同后,才可以将信息判定是正确的,反之则判定信息是错误的。在进行这些步骤之后,用户登录系统的行为是否合法,系统管理员在不知道用户的信息明码的情况下,就能够进行判定。这样不但可以在一定程度上使信息被破解的可能性降低,而且还不会让用户的信息被具有系统管理员权限的用户知道这种情况出现。所以最后,使用数据库语句将前面准备打包好的信息添加进入到数据库当中,“QSqlQueryquery;query.exec(QString("select*fromuserpasswhereusername='%1'andpassword='%2'.arg(username).arg(pwd));”这样一来,用户的基本信息就完整的保存在数据库当中,并且密码已经加密。后面及时用户退出登录,想要再次进入系统,不需要重复进行注册,可以直接使用账号密码登录,数据库会比对信息后,发现匹配的值,实现登录。2.4多界面跳转在实现电子抽奖系统的交互之前,还应准备好实现平台的多界面跳转。程序存在着多个界面,如注册界面,登录界面和主界面,就需要使用到多界面跳转进行处理。QT程序中可以添加新窗口,其中本此课程设计使用到的有MianWindow模板。首先点击右键工程文件,选择AddNew;图2.4QT创建新界面然后选择Qt设计师界面类;图2.5QT新界面中的类型选择MianWindow界面模块,然后点击下一步,为新界面命名regg,Qt就会为用户自动生成相对应的regg.cpp类型源文件以及regg.h类型的头文件。这样就创建了一个新的界面,新界面中所需要操作的代码可直接在自己界面中完善。值得注意的是:主窗口QMainWindow是独立的窗口,可以嵌套包含widgetWidget往往用来嵌入到某个主窗口。具有窗口属性的类与正常流程一样,在构造对象的过程中,会调用构造函数,而在正常退出时也会调用析构函数。所以一般将各类的参数对象初始化的过程放在构造函数中进行。新界面与原界面之间的跳转,使用到show()函数。为了使程序正确运行,需要在新旧界面中包含对方的头文件。在原界面中,为了跳转到另外一个新的界面,需要先申请一片新的空间,如:regg*newwin=newregg(this);这样就申请了一个新newwin界面,接着使用语句“newwin->show();this->hide();”将新界面显示出来,而将旧界面隐藏起来。在这里使用的是隐藏,不是删除,这个界面是等一下还需要使用的,数据也不需要清楚,所以使用隐藏。跳转到新界面后,处理完该界面的事宜后,需要跳转回到原来的登录界面进行下一步。在这里我们可以进行一些简易方便的操作:this->parentWidget()->show();先显示上一级窗口,也就是父窗口,不需要像跳转到新界面一样麻烦,可直接调用parentWidget来达到目的。因为接下来不需要使用这个新界面了,又或者说这个界面的数据已经不需要使用了,所以接下来直接使用语句“deletethis;”将这个界面杀死,也就是删除这个界面。在后面的各个界面跳转中,也是如此,只要注意好界面跳转时候我们是否需要删除界面,又或者是跳转到界面的上一级,都可以进行这些简易操作,从而减少代码量,减少程序运行的时间。2.5电子抽奖中的随机数在编写本次课程设计的时候,我们会需要一个随机数的生成器——rand(),来帮助我们的电脑来生成一个随机的整数。这个rand()函数会帮助生成一个随机整数,位于0~RAND_MAX之间。什么是RAND_MAX?它是一个用来指明rand()所能返回的随机数的最大值的宏,存在于

<stdlib.h>头文件中的。C语言标准仅仅规定它的值至少为32767,并无具体规定RAND_MAX的数值。在本次课程设计编程中,我们只是把它当做一个很大的数来看待就行,并不需要知道RAND_MAX所代表的具体数。系统会自动调用srand()函数,就在调用rand()函数的之前。srand()也是<stdlib.h>中的一个函数,它会为rand()函数提供一个随机数种子。系统会使用srand()函数来产生一个随机数种子,就在我们调用rand()函数的之前。如果系统使用的是相同的随机数种子的话,会导致使用rand()函数的时候,会产生一样的随机数队列。一般系统会给提供一个默认的参数,在用到rand()之前,我们需要自己为srand()函数初始另外一个参数。假设这个参数是一个常量的话,得到的随机数是伪随机数,例如srand(0)。因为我们需实现产生不一样的随机数,要提供的是不一样的随机数,所以要让srand()函数的参数为不同的数。因为时间是不断更新改变的,因此就借助系统内部来获取不同的时间,从而得到不同的种子。所以我们使用函数time(NULL),借以返回来一个单位为秒的计算机的时间。在调用srand()函数时,使用系统定时/计数器的值time(NULL)作为随机种子参数给srand(),时间是连续不间断,生成的种子也会是一直变化的。通过这种方法,rand()函数就能一直生成不同的随机数了。如果还是认为种子的间隔太小,可以让(unsigned)time(NULL)参数的后面再乘以任意的值。就比如(unsigned)time(NULL)*10。另外本次课程设计还要求规范好随机数的取值大小的范围。规范随机数的取值范围,需要取模也就是取余。例如k=rand()%(Y-X+1);其中,rand()%Y-X+1是产生Y-X+1的随机数。这样,我们就能自己设计出程序中所需要的随机数的任何范围了。本次课程设计中只需要取0~100的数即可,所以在rand()后面%100。因为C++与C语言是可以兼容的,所以在注意添加随机数与时间函数的头文件后,我们可以得到系统所给的随机数后,就可以对这个随机数进行判断,与抽奖所需要的概率进行对比,就可以判定本次抽奖是否中奖。中奖概率可以由界面上的输入框获得,商家可以登录系统进行概率的修改。获得概率后,可以让系统给出一个随机数,与获得的概率进行对比,如果给出的随机数大于概率的值,就默认为该名用户本次抽奖成功中奖的概率大于本次中奖的概率,因此判定本次抽奖该名用户成功中奖。如果概率获得大小比对结果相反,则判定本次抽奖未能中奖。因为使用的是时间获取的随机数,每一次都是不一样的,能保证获得的数值是随机生成无规律的,所以并不需要怀疑本次随机数的稳定性与正确性,间接的保证了抽奖系统的稳定可靠性。

2.6电子抽奖中的消息盒子Qt中自带准备有一些继承QDialog类的对话框类型,关系图如下所示:

图2.6QT中的对话框类其中,我们使用的是MessageBox类中的消息对话框,也可以叫做消息盒子。消息对话框(MessageBox),继承于QDialog类,为我们准备了一个模态对话框,被用来给提出用户一个问题,然后取到一个答复;或者被用来通知用户某些信息。被使用最多的消息对话框,一般是用来提供给用户执行一些能够进行选择的操作或者是用来提示一些无需选择的信息。消息盒子有几种类型:图2.7消息盒子类型其中主要就是这四种:问题消息盒子、信息消息盒子、警告消息盒子和危险消息盒子。消息盒子在弹出来后可以设置选项,提供给用户点击确认。不同的选项有不同的参数。例如以下几种常见的参数:图2.8消息盒子参数类型在本次课程设计中使用到的是,Ok确认选项。因为本次课程设计中的消息盒子仅仅提供最后的消息确认,不需要用户进行多余的操作,所以只需要点击确认即可退出消息盒子,进行下一步操作。首先需要创建消息盒子,使用QMessageBox类。QMessageBox::QMessageBox(QMessageBox::Iconicon,constQString&title,constQString&text,QMessageBox::StandardButtonsbuttons,QWidget*parent=nullptr,Qt::WindowFlagsf=Qt::Dialog|Qt::MSWindowsFixedSizeDialogHint)创建一个完整的消息盒子我们需要使用到几个参数。首先是四个需要我们定义好的参数。第一个是QMessageBox::Iconicon我们配的是this参数,因为我们是在此界面使用消息盒子,因此this就可以。第二个是constQString&title,我们需要创建一个QString类型的字符串,const修饰的是我们不能修改这个字符串的值,需要我们初始化这个字符串后不能修改。这个字符串存放的是这个消息盒子的主题,也就是消息盒子的标题,本次课程设计基本上都是使用“温馨提示”来作为消息盒子的主题。第三个参数是constQString&text,与第二个一样const修饰,创建一个字符串,这个存放的是消息盒子的内容,也就是消息盒子的正文内容。第四个参数是QMessageBox::StandardButtonsbuttons,就是前面所描述的,消息盒弹出来后,提供给用户点击确认的按键类型。本次课程设计基本都是使用“Ok”类型,用户点击确认即可。后面的几个参数都是带默认参数的,我们可以不需要对其进行修改或填写,因此创建一个消息盒子就需要填写好这四个参数,在需要的时候消息盒子就会跳出,完成项目需要。2.7交叉编译QT程序到开发板上运行随着现代嵌入式越来越广泛发展,交叉编译这个概念也伴随着嵌入式一起出现并流行。一般的计算机软件,都需要先经预处理、编译和汇编这三个过程,把使用高级计算机语言编写的代码先预处理,这时候文件还是计算机文件。再经过编译,检查程序中语法是否正确,将文件变成汇编文件。接着进行汇编,将程序地址重新排列。最后编译成可供计算机执行的二进制代码。举个例子,编写一个在Windows平台上编译的简单程序,这样子的话,我们使用PC平台上的Windows开发工具来编译这些的可执行程序,这种编译过程被称为本机编译(nativecompilation)。在嵌入式系统的开发时,会出现一些不理想的情况,就是运行程序的目标平台,一般都是拥有的运算能力和存储空间能力十分有限。一般的编译工具链对CPU的运算能力有一定的要求,并且需要很大的存储空间。因为有这种情况出现,想单纯在ARM平台上自我进行本机编译的话,条件就不是很好了。因此交叉编译工具就是为了解决这种情况而应运而生。所以只要我们想编译出运行于其他平台的可执行二进制程序,就可以借助交叉编译工具,在存储空间够大、CPU运算能力不低的主机上进行操作。在进行交叉编译之前,需要提前把对应的交叉编译工具链在主机平台上下载安装好。Windows上QT编译程序的原理是:点击编译运行按钮,然后到QTcreator自动调用qmake命令去执行Makefile文件自动编译程序。而如果想要把QT程序编译运行到6818开发板,就需要使用交叉编译器来进行。有一种直接的方法可以不需要交叉编译器帮忙,就是使用安装linux版本的QT程序(.run结尾就是)。不过linux版本的QT默认使用的gcc和g++这两个编译器(而且编译用到的库文件也是X86架构),而我们开发板上的QT程序必须是ARM架构。所以需要我们自己从QT官网中下载QT库的源码,交叉编译成ARM版本的库文件才可以使用。然而QT库的源码以及编译步骤比较复杂,且编译时间有点长,而且需要依赖第三方库,十分不方便我们学生使用,所以我们还是需要在ubuntu上搭建ARM版本QT的库。具体的操作步骤有以下几点:第一步:把编译好的ARM版的QT库压缩包拷贝到ubuntu的/usr/local中然后解压执行linux语句:tar-xfQt-Embedded-5.7.0.tar.xz第二步:安装新版本的arm编译工具,最好是5.4.0这个版本的ARM工具。第三步:使用刚才搭建好的QT库编译你的QT程序,执行linux语句:/usr/local/Qt-Embedded-5.7.0/bin/qmake来帮助我们生成Makefile,接着make即可自动编译QT程序。2.8基于ARM的cortex-A53的6818平台ARM公司在经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。Cortex系列属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。(2011年,ARMv8架构在TechCon上推出)ARMv7架构定义了三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用;“R”系列针对实时系统;“M”系列对微控制器。简单来说,Cortex就是ARM公司一个系列处理器的名称。ARM在Cortex-A系列处理器大体上可以排序为:Cortex-A57处理器、Cortex-A53处理器、Cortex-A15处理器、Cortex-A9处理器、Cortex-A8处理器、Cortex-A7处理器、Cortex-A5处理器、ARM11处理器、ARM9处理器、ARM7处理器,再往低的部分手机产品中基本已经不再使用,这里就不再介绍。[3]

需要指出的是,单从命名数字来看Cortex-A7似乎比A8和A9低端,但是从ARM的官方数据看,A7的架构和工艺都是仿照A15来做的,单个性能超过A8并且能耗控制很好。另外A57和A53属于ARMv8架构。而在本次课程设计中,所使用到的是cortex-A53的6818开发板。该开发板名称:GEC6818,在板子中央的核心板,有S5P6818(八核)的处理器CPU。内核即为Cortex-A53。底板资源有电源口:限制电压5V;串口:里面遵循串口协议,主要用于开发板与电脑之间数据通信。;音频输出输入:耳机/麦克风;USB口(2个):外接USB设备,例如:摄像头、WIFI模块、U盘,这方便我们可以使用鼠标键盘进行板子的交互。要实现与cortex-A53的6818开发板进行串口交互,需要我们另外准备使用一个工具:SecureCRT。这个工具可以实现串口通信,在此之前还需要做以下几种配置:1.协议:serial->代表串口协议。2.端口:COMX->3.波特率:115200->如果不是115200,数据就会出现乱码。4.数据位:85.奇偶校验位:None6.停止位:17.流控:将全部的选项都去掉->如果不打掉,键盘控制不了开发板。在完成这些配置后,重启开发板,在SecureCRT的对话框中,“[root@GEC6818/]#”按"回车"有反应即可进行通信,如果没有反应,证明流控没有去掉打钩。确定可以通信后,使用板子自带的一个串口工具:rx。rx工具存在于跟目录下的bin目录中,由于/bin在环境变量PATH,所以可以在任何的路径下使用rx。使用格式:rx路径。;例如:[root@GEC6818/]#rxhello.c,接着要点击SecureCRT界面中的"传输"选项,找到我们需要发送下载的程序,选择后发送。在确定文件已经成功下载到板子后,需要进行修改文件的权限,只有为最高修改权限后才能对文件进行我们想要的所有操作。在对话框中输入chmod777/bin/+文件名字,例如:[root@GEC6818/bin]#chmod777/bin/hello.c。最后就可以执行程序,输入./文件名字即可。3.结论在本次课程设计之中使用到了QT的工程创建编写、ui界面的设计、SQL数据库的应用以跨平台的交叉编译。得益于QT中的成熟的各种函数与C++类的封装,在编写工程代码的时候减少了许多繁琐的工作。QT的ui界面设计师中的各种控件,使ui界面的设计变得简易许多,尽管我的个人能力有限,也能做出系统的各个界面,虽然还是感觉有点简陋。本次课程设计大大加深了我对数据库的理解和应用。不仅认识到数据库的编写操作,还认识到QT中特有的数据库操作,添加数据库模块后,有许多类与函数提供给我使用,大大简化了对数据库的操作,方便数据库语句的编写。同时,QT是基于C++语言的,这次课程设计也让我对C++的应用有了更深刻的理解认知。C++的博大精深让我为之震撼,也让我深深着迷,使我忍不住想继续深入学习这门充满魅力的计算机语言。我相信,这次课程设计只会是一个开始,让我继续深入学习软件编程的开始,QT和C++的使用让我学习到了许多知识,尤其在克服一个个难题后的成就感,让我坚定这些知识值得我不断去探究。参考文献[1]李继胜.基于ARM芯片的嵌入式语音处理系统[D].陕西师范大学,2006.[2]姜仲秋等主编,C语言程序设计,南京大学出版社,1998.[3]孙娟红.基于C语言的计算机软件编程技术[J].科技风,2019(27):74.[4]谢川.嵌入式Liunx开发基础[M].北京:中国铁道出版社,2011.[5]《C程序设计(第二版)》,谭浩强编,清华大学出版社,1999年12月。[6]《C语言编程常见问题解答》,[美]PaulChishohm等著,张芳妮吕波译,清华大学出版社,1996年[7]苻玲美.C语言的溢出错误分析与防范[J]2019(09):42-43+46.[8]陈心灵,钱宁博,胡佳辉,王战中.基于STM32单片机的嵌入式语音识别系统设计[J].机电工程技术,2019,48(06):135-137.[9]李勇,蔡利强,谭国炎,陈豪,寸超.基于STM32单片机的家居设备语音控制系统设计[J].科技与创新,2018(05):130-131.[10]吴伟坚,陈世国.基于ARM-LINUX的多网物联网关的设计与实现[J].电子世界,2018(10):119-120+123.谢辞在本次课程设计中,我要感谢我毕业设计指导老师——陈景国,老师对我们毕业的事宜相当上心,给了我们相当多的指导以及帮助。还要感谢我的老师张杰英以及蒋亮,他们教导我们进行了C语言、C++、以及Qt的学习,并且也为我解答了一些相关的问题,给了我非常多的帮助。附录附录一:#ifndefDRL_H#defineDRL_H#include<QMainWindow>namespaceUi{classdrl;}classdrl:publicQMainWindow{Q_OBJECTpublic:explicitdrl(QWidget*parent=nullptr);~drl();privateslots:voidon_pushButton_clicked();voidon_pushButton_2_clicked();voidon_pushButton_6_clicked();voidon_pushButton_3_clicked();voidon_pushButton_4_clicked();private:Ui::drl*ui;intget1=0,get2=0,get3=0;inta1=0,a2=0;};#endif//DRL_H附录二:#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QSqlDatabase>#include<QSqlQuery>#include<QSqlError>#include<QDebug>#include<QSqlRecord>namespaceUi{classMainWindow;}classMainWindow:publicQMainWindow{Q_OBJECTpublic:explicitMainWindow(QWidget*parent=nullptr);~MainWindow();privateslots:voidon_pushButton_clicked();voidon_pushButton_2_clicked();private:Ui::MainWindow*ui;};#endif//MAINWINDOW_H附录三:#ifndefREGG_H#defineREGG_H#include<QMainWindow>namespaceUi{classregg;}classregg:publicQMainWindow{Q_OBJECTpublic:explicitregg(QWidget*parent=nullptr);~regg();privateslots:voidon_regbt_clicked();voidon_retbt_clicked();private:Ui::regg*ui;};#endif//REGG_H附录四:#include"drl.h"#include"ui_drl.h"#include"mainwindow.h"#include<stdlib.h>#include<time.h>#include<QMessageBox>#include<QDebug>drl::drl(QWidget*parent):QMainWindow(parent),ui(newUi::drl){ui->setupUi(this);}drl::~drl(){deleteui;}voiddrl::on_pushButton_clicked(){//先显示上一级窗口(登录窗口)this->parentWidget()->show();//把当前主界面关闭deletethis;}voiddrl::on_pushButton_2_clicked(){get1=ui->lineEdit1->text().toInt();}voiddrl::on_pushButton_3_clicked(){get2=ui->lineEdit1_2->text().toInt();}voiddrl::on_pushButton_4_clicked(){get3=ui->lineEdit1_3->text().toInt();}voiddrl::on_pushButton_6_clicked(){srand((unsignedint)time(0)*10);inta=rand()%100;//qDebug()<<a;if(a<get1){QMessageBox::warning(this,"温馨提示","恭喜中一等奖!",QMessageBox::Ok);}if(get1<=a<get2){QMessageBox::warning(this,"温馨提示","恭喜中二等奖!",QMessageBox::Ok);}if(get2<=a<get3){QMessageBox::warning(this,"温馨提示","恭喜中三等奖!",QMessageBox::Ok);}if(get3<=a){QMessageBox::warning(this,"温馨提示","再接再厉",QMessageBox::Ok);}}附录五:#include"mainwindow.h"#include<QApplication>#include<QSqlDatabase>#include<QSqlQuery>#include<QSqlError>#include<QDebug>intmain(intargc,char*argv[]){QApplicationa(argc,argv);//创建数据库QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("password.db");if(!db.open()){qDebug()<<db.lastError().text();return-1;}//创建表格QSqlQueryquery;if(!query.exec("createtableifnotexistsuserpass(idintegerNOTNULLPRIMARYKEYAUTOINCREMENT,""usernamevarchar(128)unique,passwordvarchar(256))")){qDebug()<<query.lastError().text();return-1;}MainWindoww;w.show();returna.exec();}附录六:#include"mainwindow.h"#include"ui_mainwindow.h"#include<QCryptographicHash>#include"regg.h"#include<QMessageBox>#include<drl.h>MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){deleteui;}//跳转注册界面voidMainWindow::on_pushButton_clicked(){regg*newwin=newregg(this);newwin->show();this->hide();}voidMainWindow::on_pushButton_2_clicked(){QStringusername=ui->lineEdit->text();QStringpassword=ui->lineEdit_2->text();//对密码进行加密QCryptographicHashmdHash(QCryptographicHash::Md5);mdHash.addData(password.toUtf8());QByteArraymd5password=mdHash.result();QStringpwd=md5password.toHex();QSqlQueryquery;query.exec(QString("select*fromuserpasswhereusername='%1'andpassword='%2'").arg(username).arg(pwd));if(query.next()){drl*newmain=newdrl(this);newmain->show();this->hide();//qDebug()<<"登录成功";}else{QMessageBox::warning(this,"温馨提示","密码错误",QMessageBox::Ok);//qDebug()<<"登录失败";}}附录七:#include"regg.h"#include"ui_regg.h"#include"mainwindow.h"#include"QDebug"#include<QCryptographicHash>#include<QMessageBox>regg::regg(QWidget*parent):QMainWindow(parent),ui(newUi::regg){ui->setupUi(this);}regg::~regg(){deleteui;}voidregg::on_regbt_clicked(){QStringusername=ui->lineEdit->text();QStringpassword=ui->lineEdit_2->text();//对密码进行加密QCryptographicHashmdHash(QCryptographicHash::Md5);mdHash.addData(password.toUtf8());QByteArraymd5password=mdHash.result();QStringpwd=md5password.toHex();//qDebug()<<md5password.size();//qDebug()<<password<<QString(md5password.toHex());QSqlQueryquery;query.prepare("insertintouserpass(username,password)values(?,?)");query.bindValue(0,username);query.bindValue(1,pwd);if(!query.exec()){qDebug()<<query.lastError().text();return;}QMessageBox::warning(this,"温馨提示","注册成功!",QMessageBox::Ok);}voidregg::on_retbt_clicked(){//先显示上一级窗口(登录窗口)this->parentWidget()->show();//把当前主界面关闭deletethis;}

电脑无法识别U盘该怎么办HYPERLINK电脑无法识别U盘怎么办?打开我的电脑上单击右键,在快捷菜单里,选择“管理”,打开“计算机管理”窗口。在计算机管理窗口里,选择“存储”下面的“磁盘管理”,如果看得到没有盘符的U盘,那么在这个U盘上按鼠标右键,选择“更改驱动器名称和路径”选项,就打开了“更改……的驱动器号和路径”对话框。再点击“更改”按钮,打开“更改驱动器号和路径”的对话框,在“指定以下驱动器号”的右边下拉列表里,选择你希望分配给U盘的驱动器号,尽可能靠后选择,比如X、Y、Z,选择好后,单击确定按钮,回到上一次“更改……的驱动器号和路径”对话框窗口,再一次单击确定,就回到“计算机管理”窗口。至此,如果一切正常,就给U盘单独设置了一个长久使用的驱动器号,并却,不受虚拟驱动器的影响了。建议将U盘插到电脑上,看任务栏中是否显示图标,如果显示,在我的电脑点右键查看属性——高级——硬件——设备管理器——查看里面是否有问号的设备,在问号设备上点右键——更新驱动程序然后下一步——否暂时不连接到网络——下一步自动安装软件(推荐)就可以了另外:系统不认U盘的几种处理方法1.禁用主板usb设备。管理员在CMOS设置里将USB设备禁用,并且设置BIOS密码,这样U盘插到电脑上以后,电脑也不会识别。这种方法有它的局限性,就是不仅禁用了U盘,同时也禁用了其他的usb设备,比如usb鼠标,usb光驱等。所以这种方法管理员一般不会用,除非这台电脑非常重要,值得他舍弃掉整个usb总线的功能。但是这种屏蔽也可以破解,即便设置了密码。整个BIOS设置都存放在CMOS芯片里,而COMS的记忆作用是靠主板上的一个电容供电的。电容的电来源于主板电池,所以,只要把主板电池卸下来,用一根导线将原来装电池的地方正负极短接,瞬间就能清空整个CMOS设置,包括BIOS的密码。随后只需安回电池,自己重新设置一下CMOS,就可以使用usb设备了。(当然,这需要打开机箱,一般众目睽睽之下不大适用~~)2.修改注册表项,禁用usb移动存储设备。打开注册表文件,依次展开"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbehci”双击右面的“Start”键,把编辑窗口中的“数值数据”改为“4”,把基数选择为“十六进制”就可以了。改好后注销一下就可以看见效果了。为了防止别人用相同的方法来破解,我们可以删除或者改名注册表编辑器程序。提示:“Start”这个键是USB设备的工作开关,默认设置为“3”表示手动,“2”是表示自动,“4”是表示停用。3.在computermanagement里将removablestorage的使用权限禁止。computermanagement是一个windows管理组件,可以在控制面板——管理工具——计算机管理打开。在该工具窗口中storage——removablestorage——property中,general项,可以控制系统托盘是否显示security则可以管理移动存储设备的使用权限。在security中将普通用户的使用权限降低,就可以达到禁用u盘的目的。破解的方法也很简单,管理员降低普通用户移动存储设备的使用权限,但未必禁用computermanagement的使用权限。普通用户可以通过这个工具解除usb移动存储设备的使用权限限制。另外,值得一提的是,如果u盘插到电脑上后可以驱动,但是我的电脑里却没有盘符,很有可能是管理员改动了u盘的默认盘符,使得我的电脑不能识别。这种情况,可以在movablestorage中看到u盘驱动器。可以在u盘驱动器属性设置里为u盘重新分配一个盘符,再重新插拔一次u盘,就可以在我的电脑里看到u盘的盘符了。一、首先可以将该U盘换到别的机器上,看使用是否正常。如果排除了硬件损坏的可能,一般就是软件方面有问题。在WindowsXP+SP1操作系统下,有些USB2.0设备的确常常出现工作不稳定的问题,可以试试安装设备自带的USB2.0驱动程序。另外最好不要使用USB延长线,防止因为供电不足而造成不稳定现象。如果仍无效,可以在主板BIOS设定中,将USB接口强行设置为USB1.1传输速率。二、(适用于WIN98)启动计算机,进入主板BIOS设置,检查BIOS中USB的相关选项是否已经打开:OnChipUSB设定为Enabled;USBController设定为Enabled;PNPOSInstalled设定为Yes;AssignIRQForUSB设成Enabled。要正常使用USB设备首先要开启USB接口,在主板BIOS里可以进行此项工作,一般来说只需在BIOS中进入ChipsetFeatures设置,并将USBKeyborad/MouseLegacy选项设定为Enable,就能够保证在操作系统下使用USB键盘了。这些选项的作用是打开主板芯片组对USB设备的完全支持,为系统识别USB设备做准备工作。三、USB口接触不好处理办法:拔下,等十秒钟再插上USB口,使接触完好;五、闪存盘驱动程序没有安装完成(WIN98系统下)处理办法:鼠标点“我的电脑”,选择属性找到“通用串行总线”,删除其中的USBMASSSTORAGE项,再点击“刷新”,然后按照提示重新安装一次驱动程序。六、接其它USB设备(如扫描仪、打印机、数码相机)时可以正常使用,接优盘时闪指示灯不亮,不能够使用。1、检查优盘与电脑的联接是否正常,并换用其它USB接口测试。2、检查设备管理器,看是否出现”通用总线设备控制器”条目,如果没有,请将电脑主板BIOS中USB接口条目*激活(ENABLE)。3、如果电脑安装过其它类型USB设备,卸载该设备驱动程序,并首先安装优盘驱动程序。4、到其它电脑试用此优盘,确认是否优盘不良。七、启动型优盘在的电脑上无法实现启动,可能是主板型号不支持。如何判断一块主板是否支持闪存盘启动系统启动型优盘是采用模拟USB软驱和USB硬盘的方式启动电脑的。只要电脑主板支持USB设备启动,即BIOS的启动选项中有USB-FDD、USB-HDD或是其它类似的选项,就可以使用启动型优盘启动电脑。八、第一次在电脑上使用优盘,未出现提示发现新硬件的窗口,驱动程序无法安装的原因可能是:1、主板usbcontroller未启用解决办法:在电脑主板BIOS中启用此功能。2、usbcontroller已经启用但运行不正常解决办法:在设备管理器中删除”通用串行控制器”下的相关设备并刷新。3、优盘被电脑识别异常,在设备管理器中表现为带有黄色?或!的”其它设备”或“未知设备”。解决办法:删除此设备并刷新。九、大容量的U盘(例如兼具MP3播放器或录音功能的U盘)或移动硬盘在电脑上无法正常使用,虽然系统提示找到了未知的USB设备,但无法正确识别U盘或移动硬盘。原因可能是:1.USB接口供电不足:系统为每个USB接口分配了500mA的最大输出电流,一般的U盘只需要100mA的工作电流,因此在使用过程中不会出现什么问题。大多数移动硬盘所使用的是普通的2.5英寸硬盘,其工作电流介于500mA~1000mA之间,此时假如仅仅通过USB接口供电,当系统中并无其他USB设备时,那么还是可以勉强使用的,但如果电压不稳的话,就随时可能出现供电不足的问题。特别是使用支持USB2.0的移动硬盘时,情况最为严重。另外,如果你的笔记本电脑使用电池供电,那么USB接口所分配的电量就更小了。2.使用了外接的USB扩展卡:在笔记本电脑中使用USB2.0的U盘或移动硬盘时,如果笔记本电脑不支持USB2.0技术,一般必须通过PCMCIA卡转USB2.0的扩展卡来间接实现支持,这些扩展卡基本上都采用NEC公司的D720100AGMUSB控制芯片,少则提供两个USB2.0接口,多则提供五个USB2.0接口,对一般用户而言足够使用了。由于PCMICA接口提供的电源功率比板载USB接口要小,这样就会由于供电不足而导致移动硬盘工作的出现问题。解决方案:1.它从USB连接线上接移动硬盘的一端引出一根转接线,可以插入电脑背后的PS/2接口取电,这里可以比USB接口提供更大的电流输出。2.利用电源补偿线(也称“键盘取电线”),如果U盘或移动硬盘的包装盒中提供了选配的电源适配器,你就可以直接使用外接电源,这样就可以从根本上避免供电不足的情况发生了前置USB线接错。当主板上的USB线和机箱上的前置USB接口对应相接时把正负接反就会发生这类故障,这也是相当危险的,因为正负接反很可能会使得USB设备烧毁。所以尽量采用机箱后置的USB接口,也少用延长线.也可能是断口有问题,换个USB端口看下.USB接口电压不足。当把<ahref="mobileharddisk">移动硬盘</a>接在前置USB口上时就有可能发生系统无法识别出设备的故障。原因是<ahref="">移动硬盘</a>功率比较大要求电压相对比较严格,前置接口可能无法提供足够的电压,当然劣质的电源也可能会造成这个问题。解决方法是<ahref="">移动硬盘</a>不要接在前置USB接口上,更换劣质低功率的电源或尽量使用外接电源的硬盘盒,假如有条件的话。主板和系统的兼容性问题。呵呵这类故障中最著名的就是NF2主板与USB的兼容性问题。假如你是在NF2的主板上碰到这个问题的话,则可以先安装最新的nForce2专用USB2.0驱动和补丁、最新的主板补丁和操作系统补丁,还是不行的话尝试着刷新一下主板的BIOS一般都能解决。系统或BIOS问题。当你在BIOS或操作系统中禁用了USB时就会发生USB设备无法在系统中识别。解决方法是开启与USB设备相关的选项。就是开机按F2或DEL键,进入BIOS,把enableusbdevice选择enable。拔插要小心,读写时千万不可拔出,不然有可能烧毁芯片。XP中任务栏中多出USB设备的图标,打开该图标就会在列表中显示U盘设备,选择将该设备停用,然后你再拔出设备,这样会比较安全。

其实判断软件硬件问题很简单,在别的机器或换个系统试试就可以了.有些小的问题不妨先用专门软件格式化下.还有提醒大家WINDOWS下格式化时要选择FAT,不要选FAT32。

提示无法识别的USB设备维修

故障提示如图:

无法识别的USB设备:UnknownUSBDevice.很多人都遇到过的一个问题,所谓“无法识别”对于操

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论