《智能家居应用基础》教案 邢敏 -项目4-6 基于LTE技术的新风系统控制- 基于RFID的电子钱包设计_第1页
《智能家居应用基础》教案 邢敏 -项目4-6 基于LTE技术的新风系统控制- 基于RFID的电子钱包设计_第2页
《智能家居应用基础》教案 邢敏 -项目4-6 基于LTE技术的新风系统控制- 基于RFID的电子钱包设计_第3页
《智能家居应用基础》教案 邢敏 -项目4-6 基于LTE技术的新风系统控制- 基于RFID的电子钱包设计_第4页
《智能家居应用基础》教案 邢敏 -项目4-6 基于LTE技术的新风系统控制- 基于RFID的电子钱包设计_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

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

文档简介

.1.1RFID概述RFID(RadioFrequencyIdentification)也称为射频识别,是一种无线通信技术。RFID技术无需在识别系统与特定目标之间建立机械或光学接触,就可通过无线射频信号自动识别特定目标并读取和写入相关数据,识别操作无需人工干预,可在多种恶劣环境下工作。RFID技术具备高速识别能力,能够同时识别移动物体和多个标签,操作快捷方便。RFID系统主要由阅读器(Reader)和标签(Tag)两部分组成。阅读器发射特定频率的无线电波能量给标签,用以驱动标签电路将内部的代码送出,此时阅读器便接收此代码。RFID标签分为有源标签(ActiveTag)和无源标签(PassiveTag)。有源标签能主动发送某一频率的信号,而无源标签则是接收阅读器发出的射频信号,凭借感应电流所获得的能量发送出存储在芯片中的产品信息。RFID系统中的通信主要通过无线射频信号进行。标签和读写器之间的通信方式主要有两种:电感耦合和电磁反向散射耦合。电感耦合方式主要适用于低频和高频RFID系统,而电磁反向散射耦合方式则主要适用于超高频RFID系统。RFID技术具有多种优点,如快速扫描、小型化和形状多样化、信息的读取不受限制、大存储容量以及安全性等。这些特点使得RFID技术在许多领域得到了广泛应用,如物流、零售、制造业、医疗领域等。6.1.2RFID发展历程RFID技术从产生到普及经历了多个阶段的发展,并在不断的技术创新和应用拓展中展现出其强大的生命力和广泛的应用前景。RFID技术的发展历程可以大致分为以下几个阶段:1.RFID技术的产生与实验阶段(1941-1960年)RFID技术的起源与雷达技术有着密切的联系。雷达技术的改进和应用催生了RFID技术。RFID的诞生源于战争的需要,二战期间,英国空军首先在飞机上使用RFID技术,是用来分辨敌方飞机和我方飞机。1948年,哈里·斯托克曼发表的“利用反射功率的通讯”的科学论文,奠定了射频识别RFID的理论基础。在这一阶段,RFID技术处于探索当中,主要在研究机构的实验室中进行实验研究。2.RFID技术的理论发展与初步应用阶段(1961-1980年)这一时期,RFID技术的理论得到了进一步的发展,出现了一系列RFID技术的研究成果。人们开始尝试一些新的应用,RFID产品研发也投入到商用实践中。例如,一些公司引入RFID技术开发电子监控设备来保护财产、预防偷盗。挪威公路交通首次使用了RFID电子收费系统,美国铁路部门使用RFID系统识别机车车辆,欧洲在野生动物研究中使用RFID电子标签对野生动物进行跟踪。3.RFID技术及产品进入商业应用阶段(1981-2000年)这一阶段,RFID技术及产品进入商业应用阶段,大规模应用开始出现,RFID产品逐渐成为人们生活中的一部分。发达国家配置了大量的RFID电子收费系统,并将RFID用于安全和控制系统。美国的公路自动收费系统广泛使用了RFID技术,沃尔玛及其主要供应商应用RFID电子标签提高了商品物流仓储的管理效率,降低了运输、存储过程中的丢失、破损率。4.RFID技术的普及与标准化阶段(2001年至今)该阶段RFID产品种类愈加丰富,在各个领域,如物流、交通、身份识别、资产管理、食品、数据信息、安全控制等,都得到了普遍使用。随着RFID技术的普及,RFID标准化问题在全球范围内越来越受到重视。发达国家和大型公司企业投入大量人力物力纷纷制定相关RFID产品的标准和协议,以便自身在市场中占据有利地位。目前国际上有多种RFID标准,其中ISO/IEC、EPCGlobal和UID是三种主要RFID标准。近年来,RFID技术与传感技术、工业物联网、大数据分析、AI等技术的结合,为RFID技术带来了新的应用场景和商机。例如,新型RFID传感标签在标签原有的功能特性中融入了传感能力,使标签在功能和应用灵活性方面都有了更大提升;AI与RFID技术的结合可以提高效率和准确性,推动零售、物流和制造等行业的数字化转型。5.RFID技术的未来发展趋势未来,RFID标签设备将实现更远的读取距离、更快的识别速度,并具备更强的抗干扰能力。RFID技术将在物流、供应链管理、零售和医疗保健等多个领域得到进一步应用。全球RFID市场规模在未来几年预计将继续增长,显示出RFID技术的巨大潜力和市场价值。6.1.3RFID技术特点RFID技术以其独特的优势在物流、制造业、医疗、军事、酒店管理等众多领域得到了广泛应用,并随着技术的不断进步和发展,其应用前景将更加广阔。RFID技术的特点主要包括以下几个方面:1.读取方便快捷RFID技术无需光源,甚至可以透过外包装来进行数据的读取,这使得它在各种环境下都能保持高效的识别能力。有效识别距离大,当采用自带电池的主动标签时,有效识别距离可达到30米以上,远超过传统的条形码或二维码技术。2.识别速度快标签一进入磁场,解读器就可以即时读取其中的信息,而且能够同时处理多个标签,实现批量识别,大大提高了识别效率。3.数据容量大RFID标签的数据容量相比传统条形码有显著提升,可以根据用户的需要扩充到几十KB,甚至更大,这对于需要存储大量信息的场景尤为重要。4.使用寿命长,应用范围广RFID技术采用无线电通信方式,使其可以应用于粉尘、油污等高污染环境和放射性环境,而且其封闭式包装使得其寿命大大超过印刷的条形码。5.标签数据可动态更改利用编程器可以向RFID标签写入数据,从而赋予其交互式便携数据文件的功能,且写入时间相比打印条形码更少,便于信息的更新和管理。6.安全性高RFID技术不仅可以嵌入或附着在不同形状、类型的产品上,而且可以为标签数据的读写设置密码保护,从而具有更高的安全性。此外,RFID技术还具备多重加密措施,确保数据传输过程中的安全性。7.动态实时通信RFID标签以50~100次/秒的频率与解读器进行通信,只要RFID标签所附着的物体出现在解读器的有效识别范围内,就可以对其位置进行动态追踪和监控。8.体积小、形状多样RFID标签体积小,可以任意张贴在物品适当位置,或者挂在某个位置,外观形状多样,便于在不同场景下使用。9.抗污染、持久耐用RFID标签对水、油和化学药品等物质具有很强抵抗性,且不易受到折损,这使得它在各种恶劣环境下都能保持稳定的识别能力。10.可重复使用RFID标签可以重复使用,并且标签与RFID读写器之间可以进行远程编程,这降低了使用成本,提高了资源利用率。6.1.4RFID系统构成RFID系统由RFID电子标签、读写器、天线和应用系统四个主要部分组成,它们共同协作实现非接触式的自动识别和数据交换功能。1.RFID电子标签(Tag)RFID电子标签由耦合元件及芯片组成,部分标签还包含天线。每个标签具有唯一的电子编码,附着在物体上用于标识目标对象,供阅读器识别。根据是否内置电源,标签可以分为被动式标签(无源标签,依靠阅读器的电磁场供电)、主动式标签(有源标签,内置电池,能主动发射信号)和半主动式标签(兼有两种标签的特点,内部携带电池,但通信能量仍通过阅读器发射的电磁波获取)。2.读写器(Reader)读写器通常由天线、射频模块、处理器和接口模块组成。读写器通过发送无线电信号激活标签并读取标签上存储的数据,同时还可以向标签写入数据,实现数据的更新。根据设计,读写器可以是手持式或固定式。3.天线(Antenna)天线在标签和读写器之间传递射频信号,是实现无线通信的关键组件。读写器可以连接一个或多个天线,但每次使用时只能激活一个天线。4.应用系统(ApplicationSystem)应用系统是RFID技术应用中的关键环节,用于处理和管理从RFID标签和读写器获取的数据。通过读取电子标签上的信息,可以实时监测货物的位置、状态和运输过程,避免货物丢失和错误发货。应用系统通常包括数据交换与管理系统,负责完成电子标签数据信息的存储、管理和控制。此外,还可能包括中间件、企业应用接口和应用软件等组成部分,以实现所采集信息的传递与分发、以及与企业前端和后端软件的集成。6.1.5RFID工作原理1.RFID系统的工作原理RFID系统的工作原理可以描述为:读写器通过天线发送特定频率的射频信号,当电子标签进入有效工作区域时,标签内部的感应电流被激活,使得标签将自身编码信息通过内置天线发射出去;读写器的接收天线接收到从标签发送来的调制信号后,经过解调和解码处理,将有效信息传送到后台主机系统进行相关处理;主机系统根据逻辑运算识别标签的身份,并作出相应的处理和控制指令,最终通过读写器完成数据的读写操作。2.通信与能量感应方式从电子标签到读写器之间的通信和能量感应方式来看,RFID系统一般可以分为电感耦合(磁耦合)和电磁反向散射耦合(电磁场耦合)两种类型。电感耦合系统是通过空间高频交变磁场实现耦合,依据电磁感应定律;这种方式一般适合中、低频率工作的近距离RFID系统。电磁反向散射耦合系统即雷达原理模型,发射出去的电磁波碰到目标后反射,同时携带回目标信息,依据电磁波的空间传播规律;这种方式一般适合高频、微波工作频率的远距离RFID系统。3.RFID的工作流程(1)信号发射读写器通过发射天线发送特定频率的射频信号,形成电磁场。这个电磁场覆盖了一定的工作区域,即读写器的有效工作范围。(2)标签激活与数据发送当电子标签进入读写器的有效工作区域时,其天线产生足够的感应电流,从而激活电子标签。激活后的电子标签利用感应电流获得的能量,将自身编码信息通过内置天线发送出去。对于无源标签来说,这一过程是依靠读写器发射的电磁场能量完成的;而有源标签则可以通过内置电池主动发送信号。(3)读写器识别与解码读写器的接收天线接收到从电子标签发送来的调制信号后,经过天线调节器传送到读写器信号处理模块。信号处理模块对接收到的信号进行解调和解码处理,提取出有效信息。(4)数据处理与应用解码后的有效信息被传送到后台主机系统(即应用系统)进行进一步的处理。应用系统根据逻辑运算识别电子标签的身份,并根据设定的规则做出相应的处理和控制操作。这些操作可能包括数据记录、状态更新、指令发送等。(5)指令执行与反馈最终,应用系统可能发出指令信号控制读写器完成相应的读写操作。这些操作的结果可以通过读写器反馈给应用系统或用户界面进行显示或进一步处理。6.1.6RFID应用领域RFID技术以其独特的优势在多个领域得到了广泛应用,并随着技术的不断进步和发展,RFID技术在多个领域都有广泛的应用,以下是一些主要的应用领域:1.物流领域(1)货物追踪与信息管理通过在货物上粘贴RFID标签,企业可以实时跟踪货物的位置和状态,实现实时监控和定位。这有助于提高库存可见性、减少丢失或滞留,提高整体供应链的效率。(2)仓储管理RFID技术可以自动化地管理仓库库存,实现库存的实时更新和精确盘点,降低人工成本和错误率。2.零售领域(1)商品管理商场、超市等零售场所可以采用RFID技术管理商品,实现商品的实时监控、定位、管理和追溯。(2)自助结算RFID技术可以实现自助结算和积分管理,提高消费者的购物体验。(3)防盗管理RFID标签的防盗功能有助于减少零售业的盗窃问题。3.制造业(1)生产流程跟踪与管理通过在生产线上嵌入RFID标签,可以实时监控每个生产环节,提高生产效率、减少错误,并追踪产品的质量和合规性。(2)自动化生产RFID技术可以实现生产线的自动化控制,提高生产效率和灵活性。4.服装业(1)自动化生产RFID技术助力服装业实现自动化生产流程,提高生产效率。(2)仓储管理与单品管理通过RFID标签,服装企业可以实现对库存的精确管理和单品的追踪。5.医疗领域(1)医疗设备与药品管理RFID技术可以追踪和管理医疗设备、药品,确保医疗资源的优化分配和使用。(2)患者信息管理通过RFID技术,医院可以实现患者信息的快速识别和记录,提高医疗服务效率。6.身份识别电子证件:RFID技术被广泛应用于电子护照、身份证、学生证等各种电子证件中,实现快速的身份识别和验证。7.防伪领域贵重物品防伪:RFID技术可以用于烟、酒、药品等贵重物品的防伪,确保商品的真实性和合法性。8.资产管理资产盘点与监控:RFID技术可以实现资产的快速盘点和实时监控,提高资产管理的效率和精确度。9.交通领域(1)车辆识别与管理RFID技术可以实现对车辆的自动识别和跟踪管理,实时了解车辆的运行情况。(2)不停车收费系统RFID技术在高速公路收费系统中得到应用,实现车辆的快速通行和自动扣费。10.其他领域(1)图书馆管理RFID技术用于图书借阅、归还、库存管理以及防盗管理,实现全自动的管理。(2)智慧布草在酒店、洗涤厂、医院等场所,RFID技术用于布草的自动盘点、车间生产管理、布草全生命周期跟踪等。(3)环境监测RFID技术被用于追踪和监控动植物的迁徙、森林火灾风险、海洋污染等。

基于C#的上位机设计任务基于C#的上位机设计任务2引导案例 引导案例基于C#的工业自动化控制上位机某企业生产线包含多个传感器和执行器,因业务需求,现需要实时采集传感器数据,并根据数据调整执行器的状态;因此需要开发一个的上位机应用,用于监控和控制该工业自动化生产线。根据业务需求或用户输入,向下位机发送控制命令,控制命令需要根据下位机的协议进行定义和封装。控制逻辑可能还包括一些复杂的算法或策略,用于实现特定的控制功能。该上位机应用通过C#语言编写,其系统架构包含以下几个部分:界面层:负责与用户交互,显示数据和控制按钮。可以使用WindowsForms或WPF来创建界面。业务逻辑层:处理具体的业务逻辑,如数据处理、算法计算等。数据访问层:负责与下位机通信,包括数据的读取和写入。可以使用串口通信或网络通信(如TCP/IP)来实现。6.2.1开发环境准备VisualStudio是微软公司提供的一款集成开发环境,支持多种编程语言,包括C#。它提供了丰富的功能,如代码编辑、调试、版本控制、GUI设计等,是开发C#应用程序的首选IDE。VisualStudio有多个版本,包括社区版(Community)、专业版(Professional)和企业版(Enterprise)等。社区版是免费的,适合个人开发者、开源项目、学术研究、小型团队和创业公司等。VisualStudio具有强大的调试器、代码编辑器、代码补全、重构工具等,能够显著提高开发效率。接下来完成VisualStudio安装及开发环境配置。1.Windows安装VisualStudio2022(1)下载地址首先登陆VisualStudio官网“/zh-hans/”,点击“免费VisualStudio”,进入免费版下载界面,如图6-1所示,然后选择社区版(VisualStudioCommunity),点击免费下载。图6-1VisualStudio社区版下载界面(2)开始安装点击下载社区版之后,会自动弹出一个窗口,选择存放下载文件的位置。下载结束后,双击安装程序开始安装,如图6-2所示。图6-2双击运行安装程序在弹出的“VisualStudioInstaller”对话框中点击继续,如图6-3所示。然后开始下载VisualStudio安装程序,如图6-4所示。图6-3双击运行安装程序图6-4开始下载VisualStudio安装程序安装完成后会自动弹出VisualStudioCommunity安装选项窗口,根据要使用VisualStudio所做的事情选择不同的功能集和工作负载,这里我们选择“.NET桌面开发”。在窗口的上方有单个组件、语言包、安装位置等选项,窗口右方有安装组件选项,这些选项均为默认值即可。同时在窗口左下方选择安装路径(建议使用默认安装路径)。最后点击右下角“安装”,如图6-5所示。图6-5选择工作负载及安装路径并点击安装等待安装完成后会自动弹出“安装完毕”对话框,如图6-6所示。点击“确定”,弹出VisualStudioInstaller已安装窗口,点击“启动”,如图6-7所示。图6-6安装完毕点击“确定”图6-7点击“启动”打开VisualStudio重启VisualStudio之后,可以在搜索栏输入“VisualStudio2022”的前几个字母,就会出现已安装的VisualStudio2022,单击就可以进入。为了方便使用,可以右键点击搜索栏的“VisualStudio2022”,选择打开文件位置,右键点击“VisualStudio2022”快捷方式,将其发送到桌面快捷方式。桌面上就会出现VisualStudio2022快捷方式,可以直接双击进入。2.VisualStudio创建一个新的项目(1)准备工作打开VisualStudio2022,提示需要登陆,如果有账户可以直接登录,没有账户选择跳过。在弹出的窗口中选择开发设计及颜色主题,然后单击“启动VisualStudio”,如图6-8所示。图6-8点击“启动”打开VisualStudio(2)创建一个新的项目在弹出的“开始使用”窗口中选择“创建新项目”,如图6-9所示。在创建新项目窗口中选择“Windows窗体应用”,并点击“下一步”,如图6-10所示。图6-9点击“创建新项目”图6-10选择“Windows窗体应用”并点击“下一步”在弹出的“配置新项目”窗口中,设置项目名称和保存位置,并点击“下一步”,如图6-11所示。图6-11设置项目名称和保存位置并点击“下一步”然后,在弹出的“其他信息”窗口中,选择Windows窗体应用框架(选择默认框架),并点击“创建”,如图6-12所示。图6-12选择Windows窗体应用框架并点击“创建”创建成功后进入窗体应用设计界面,如图6-13所示,项目中有一个默认的源文件,可以点击“调试执行”按钮,显示运行成功。图6-13窗体应用设计界面6.2.2C#基础知识1.C#简介C#是一种简洁、类型安全的面向对象的语言,开发人员可以使用它来构建在.NETFramework上运行的各种安全、可靠的应用程序。使用C#,可以创建传统的Windows客户端应用程序、XMLWebservices、分布式组件、客户端/服务器应用程序、数据库应用程序等等。作为一种面向对象的语言,C#支持封装、继承和多态性的概念。所有的变量和方法,包括Main方法(应用程序的入口点),都封装在类定义中。类只能直接从一个父类继承,但它可以实现任意数量的接口。重写父类中的虚方法的各种方法要求override关键字作为一种避免意外重定义的方式。在C#中,结构类似于一个轻量类;它是一种堆栈分配的类型,可以实现接口,但不支持继承。C#的生成过程比C和C++简单,比Java更为灵活。没有单独的头文件,也不要求按照特定顺序声明方法和类型。C#源文件可以定义任意数量的类、结构、接口和事件。2.C#的基本语法(1)标识符标识符是用户定义的一种字符序列。在程序中会用到各种对象,如符号常量、变量、数组、类、方法和类型等,为了识别这些对象,必须给每个对象一个名称,即标识符。C#语言的标识符名称必须遵守以下规则:所有的标识符只能由字母、数字和下划线这三类字符组成,而且第一个字符必须为字母或下划线(不能以数字开头)。标识符中不能包含空格、标点符号、运算符等其他符号。标识符区分大小写。标识符不能与C#关键字名相同。标识符不能与C#中的类库名相同。关键字(Keyword)也称为保留字,它是由系统预先定义好的标识符,在C#语言中有特定的含义。(2)常量和变量变量是计算机内存中被命名的数据存储单元,其中存储的值是可以改变的。变量名实际上是一个符号地址,在对程序进行编译时由系统给每个变量分配一个真正的内存地址。在程序中通过变量取值,实际上就是通过变量名找到相应的内存地址,再从中读取数据或存入数据。变量命名规则如下:①变量名最好以小写字母开头。②变量名应具有描述性质:选取有意义的字符序列作为变量名,以便在程序中能从变量名中理解所标识的对象,从而便于阅读和记忆。③在包含多个单词的变量名中,从第二个单词开始,每个单词都采取首字母大写的形式。常量(Constant)是指在程序执行过程中其值不能被改变的量。同变量一样,常量也用来存储数据。它们的区别在于,常量一旦初始化就不再发生变化,可以理解为符号化的常数。(3)数据类型数据类型定义了数据的性质、表示、存储空间的结构。C#的数据类型可分为值类型和引用类型。C#的值类型可以分为简单数据类型、结构类型(Struct)和枚举类型(Enumeration),其中包括:有符号整型:sbyte,short,int,long无符号整型:byte,ushort,uint,ulong字符型:char浮点型:float,double十进制型:decimal布尔型:bool枚举类型:enumE{...}结构体类型:structS{...}类类型:classStudent{…}C#的引用类型包括类(class)、接口(interface)、数组(array)、字符串(string)和委托(delegate)等(4)运算符C#具有丰富的运算符,按运算类型可分为赋值运算符、算术运算符、逻辑运算符、关系运算符、位运算符、指针运算符和取成员运算符等;按运算对象(又称为操作数)的个数又可分为一元运算符、二元运算符和三元运算符。①算术运算符C#算术运算符描述如表6-1所示。表6-1算数运算符描述运算符描述+将两个操作数相加-用第一个操作数减去第二个操作数*将两个操作数相乘/分子除分母%取模运算符,整除后的余数++自增运算符,整数值増加1--自减运算符,整数值减少1注意:“/”运算符,当参与相除运算的两个操作数均为整型时,其计算结果应是除法运算后所得商的整数部分。例如,5/2的结果是2。如果两个操作数中有一个是浮点型,则结果为双精度浮点型。例如,5.0/2的结果是2.5。单目运算符自增(++)和自减(--)的作用是以一种紧凑格式使整型变量的值增1或减1。这两个运算符都有前置和后置两种使用形式。前置形式是指运算符在操作数的前面,后置是指运算符在操作数的后面。例如:i++;//++后置--j;//--前置无论是前置还是后置,这两个运算符的作用都是使操作数的值增1或减1。例如:++i与i++的作用相当于i=i+1;--i与i--的作用相当于i=i-1。②赋值运算符赋值就是给一个变量赋一个新值。赋值运算用于改变变量的值,即为变量赋值。“=”运算符用于将等号右边的操作数(第二个操作数)的值赋给左边的操作数(第一个操作数)。表达式的结果是右边操作数的值,所以赋值操作可以串联在一起。例如:intx,y,n;x=6;n=y=x;上述代码中,先将数值6赋给变量x,再将x的值6赋给变量y。然后将变量y的值赋给变量n。赋值运算的结果:x、y、n的值均为6。C#中除了提供了一个简单赋值运算符“=”外,还提供了多个复合赋值运算符,包括:+=、-=、*=、/=、%=、<<=、>>=、&=、^=和|=。复合赋值运算符是将一个其他运算符加上简单赋值运算符而得到,其含义为:将左操作数和右操作数按运算符进行运算,将结果的值赋给左操作数。例如:x+=10;//等价于x=x+10;y*=n;//等价于y=y*n;如果赋值操作符两边的操作数类型不一样,那就先要进行类型转换。③关系运算符关系运算符用于比较两个操作数的大小,其比较的结果是一个布尔型的值。当两个操作数满足关系运算符指定的关系时,表达式的值为true,否则为false。需要主要的是,“等于”关系运算符是两个等号“==”,不要误用为赋值运算符“=”;关系运算符的优先级,低于算术运算符,但高于赋值运算符。C#关系运算符描述如表6-2所示。表6-2关系运算符描述运算符描述==检查两个操作数的值是否相等,如果相等则条件为真。!=检查两个操作数的值是否相等,如果不相等则条件为真。>检查左操作数的值是否大于右操作数的值,如果是则条件为真。<检查左操作数的值是否小于右操作数的值,如果是则条件为真。>=检查左操作数的值是否大于感等于右操作数的值,如果是则条件为真。<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。④位运算符位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整型或者是可以转换为整型的任何其他类型。位运算符是对操作数按其在计算机内表示的二进制数逐位地进行逻辑运算。C#常用的几种位运算如表6-3所示。表6-3位运算符描述运算符描述&如果同时存在于两个操作数中,二进制AND运算符复制一位到结果中。|如果存在于任一操作数中,二进制OR运算符复制一位到结果中。^如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。~二进制补码运算符是一元运算符,具有"翻转"位效果。<<二进制左移运算符。左操作数的值向左移动右操作数指定的位数。>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。⑤逻辑运算符逻辑运算符用于将多个关系表达式或逻辑量(“真”或“假”)组成一个逻辑表达式。逻辑表达式的结果是一个布尔值,结果为真则为true,结果为假则为false。C#的逻辑运算符描述如表6-4所示。表6-4逻辑运算符描述运算符描述&&当且仅当两个操作数的值都为“真”时,运算结果为“真”,否则为“假”。||当且仅当两个操作数的值都为“假”时,运算结果为“假”,否则为“真”。!当操作数的值为“真”时,运算结果为“假”,否则为“真”。例如,设x=5,则(x>=0)&&(x<25)的值为“真”,(x<-5)||(x>5)的值为“假”。⑥条件运算符条件运算符是唯一有3个操作数的运算符,所以有时又称为三元运算符。它由?和:两个符号组成,它的3个对象都是表达式。其语法格式如下:<表达式1>?<表达式2>:<表达式3>“表达式1”是C#中可以产生“true”和“false”结果的任何表达式,如果表达式1的值为true,则执行表达式2,条件表达式的运算结果为表达式2的值;否则执行表达式3,其运算结果为表达式3的值。3.流程控制语句程序的三种常用结果分别是:顺序结构、分支结构和循环结构。在C#中,分支结构采用条件语句实现,循环结构使用循环语句实现。(1)顺序结构顺序结构是最基本、最简单的程序结构。顺序结构是指程序执行过程中程序流程按语句顺序依次执行、不发生转移的程序结构。(2)分支结构分支结构体现了程序的判断能力,在程序执行中能根据某些条件是否成立,从若干条语句或语句组中选择一条或一组来执行。分支结构有两路分支结构和多路分支结构,两路分支结构可用if语句实现,多路分支结构可用嵌套的if语句和switch语句实现。①用if语句实现单分支选择结构在C#语言中,用if语句实现单分支选择结构的语句格式及功能如下:语句格式:if(布尔表达式){语句块;}执行过程:首先计算表达式的值,当表达式的值为true时,执行后面的语句,否则不执行语句。②用if语句实现双分支选择结构在C#语言中,用if语句实现双分支选择结构的语句格式及功能如下:语句格式:if(布尔表达式) {语句块1;} else {语句块2;}执行过程:当表达式的值为true时,执行语句1,否则执行语句2。在C#语言中,用if语句实现多分支选择结构的语句格式及功能如下:语句格式为:if(布尔表达式1) {语句块1;} elseif(布尔表达式2) {语句块2;} elseif(布尔表达式n-1) {语句块n-1;} else {语句块n;}执行过程:首先判断表达式1的值是否为true,如果为true,就执行语句1,如果为false,则继续判断表达式2的值是否为true;如果表达式2的值为true,就执行语句2;否则继续判断表达式3的值,……依次类推,直到找到一个表达式的值为true并执行后面的语句;如果所有表达式的值为false,则执行else后面的语句n。③switch语句在C#语言中要实现多分支,还可以通过switch语句来实现。switch语句的格式与执行过程如下:语句格式为:switch(表达式){case常量表达式1:语句1;[break;]case常量表达式2:语句2;[break;]case常量表达式n:语句n;[break;][default:语句n+1;[break;]]}执行过程:首先计算表达式的值,然后依次将表达式的值与case后常量表达式1、常量表达式2、……常量表达式n比较,若与某个case后面的常量表达式值相等,就执行此case后面的语句,直到碰上break或者switch语句结束。break语句的作用就是中断当前的匹配过程跳出switch语句;如果没有break语句,则匹配的过程会一直持续到整个switch语句结束。若表达式的值与所有case后面的常量表达式的值都不相同,则执行default后面的“语句n+1”,执行后退出switch语句。(3)循环结构在程序设计中,通常某些程序段需要重复执行若干次,这样的程序结构称为循环结构。C#中控制循环结构语句包括:while、do-while、for和foreach语句。循环结构有两种形式,即当型循环结构和直到型循环结构。①while语句while语句实现的循环是当型循环,该类循环先测试循环条件再执行循环体。while语句的格式及功能如下:语句格式:while(布尔表达式){语句块;}执行过程:首先计算while后面括号内表达式的值,当表达式的值为true时则执行循环体中的语句;然后再检查表达式的值,再执行循环,直到表达式值为false时结束循环,执行循环后面的语句。其特点是“先判断,后执行”。②do…while语句do…while语句实现的循环式直到型循环,该类循环先执行循环体再测试循环条件。do…while语句的格式和执行过程如下:语句格式:do{语句块}while(布尔表达式);执行过程:首先执行循环体内的语句,再对while后面的表达式进行判断,如果表达式的值为true,就再执行循环体内的语句……如此循环,直到表达式的值为false时结束循环,执行循环后面的语句。其特点是“先执行,后判断”。③for语句在循环次数已知的情况下,用for语句来实现循环比较容易,故for语句有时也称计数循环语句。for语句能将循环变量初始化、循环条件以及循环变量的改变都放在同一行语句中。for循环语句的格式和功能如下:语句格式:for(表达式1;表达式2;表达式3){语句块;}执行过程:计算表达式1的值;计算表达式2的值,若表达式2的值为true时,则执行语句块;若表达式2的值为false时,则结束循环;执行循环体语句;计算表达式3的值,返回表达式2继续判断执行。④break语句break语句在前面学习switch时已经用过,它还可以用来从程序的循环语句中跳出。在执行循环时,有时可能希望在循环体执行到一半时就退出循环,而不是整个循环体执行完毕,等循环条件判断完毕才退出,此时可以使用流程转向语句break。break语句的格式和功能如下:语句格式:break;执行过程:当在循环体中遇到这一语句后就终止对循环的执行,流程直接跳转到当前循环语句的下一语句执行。⑤continue语句continue语句称为接续语句,它专用于循环结构中,表示本次循环结束,开始下一次循环。continue语句的格式和功能如下:语句格式:continue;执行过程:当在循环体中遇到这一语句后停止当前进行的这次循环,即跳过当前循环的剩余语句块,并把控制返回到当前循环的顶部,接着再一次进行循环条件判断,以便于进行下一次循环。4.数组、集合和泛型数组(array)是一种数据结构,是一个包含相同数据类型的数据的集合,可以通过数值索引来访问其中的所有数据成员(数组元素)。C#中的数组一般分为:一维数组、多维数组和交错数组,此外还有特殊隐式类型数组。(1)数组的属性数组具有以下属性:数组可以是一维、多维或交错的。数值数组元素的默认值设置为零,而引用元素的默认值设置为null。交错数组是数组的数组,因此,它的元素是引用类型,初始化为null。数组的索引(序号)从零开始:具有n个元素的数组的索引是从0到n-1。数组元素可以是任何类型,包括数组类型。(2)数组的声明和其他数据类型一样,数组对象在使用前必须先声明和创建。数组是使用类型声明的,一维数组、多维数组和交错数组的声明和创建方式稍有不同。一维数组的声明格式为:数据类型[]数组对象名称;多维数组的声明格式为:数据类型[,]数组对象名称;交错数组的声明格式为:数据类型[][]数组对象名称;其中的数据类型可以是任何C#的合法数据类型。需要声明一个用于记录多名学生姓名的数组变量,由于所有学生姓名都可以分别用一个字符串变量来记录,那么记录多名学生姓名的数组变量声明如下:string[]studentsName;(3)初始化数组变量数组变量在创建后,还必须先初始化才能被访问。数组变量在初始化时需要注意,数组变量自身是一个变量,数组中所包含的所有元素也是变量,数组变量和数组元素所对应的变量可分别进行初始化。创建了一个能保存35个学生姓名的数组变量,同时完成了数组变量自身的初始化如下:string[]studentsName=newstring[35];(4)遍历数组元素数组的遍历一般通过循环实现,利用元素序号的有规律变化,访问到数组中的每一个元素。数组的遍历除了可以用for形式的循环实现外,还可以通过while或dowhile形式的循环完成。此外,也可以使用foreach形式完成,foreach语句提供一种简单、明了的方法来循环访问数组的元素。与for相比,foreach只能顺序访问数组元素,并且只能访问不能赋值。foreach的通用语法格式为:foreach(数据类型当前变量in集合对象){//处理代码}其中的集合对象在数组的应用中就是数组对象,如果需要提交结束遍历而不处理其余部分元素时,可以通过break语句跳出foreach代码块,其用法与循环中的break相同。(5)集合与集合接口集合就如同数组,用来存储和管理一组特定类型的数据对象,除了基本的数据处理功能,集合直接提供了各种数据结构及算法的实现,如队列、链表、排序等,可以让你轻易地完成复杂的数据操作。在使用数组和集合时要先加入System.Collections命名空间,它提供了支持各种类型集合的接口及类。集合本身上也是一种类型,基本上可以将其作为用来存储一组数据对象的容器,由C#面向对象的特性,管理数据对象的集合同样被实现成为对象,而存储在集合中的数据对象则被称为集合元素。①ArrayList集合C#ArrayList又被称为动态数组,它的存储空间可以被动态改变,同时还拥有添加、删除元素的功能。ArrayList类派生自System.Collections,在使用时需要事先声明并引用该命名空间。②哈希表Hashtable在.NETFramework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。Hashtable的主要操作包括:在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);通过键获得值:HashtableObject[key]判断哈希表是否包含特定键key:HashtableObject.Contains(key);(6)泛型集合①泛型List集合任何类型的对象要存储在集合类中都必须强制转化为Object类型,当从集合类中获得元素时又要转化成先前的类型。为了让编译提供更强的编译时类型检查,减少数据类型之间的显示转换,以及装箱操作和运行时类型检查,C#引入了泛型的概念。简单的说,泛型可以让类、结构、接口、委托和方法按照自己存储的操作的数据类型进行参数化。②泛型Stack集合Stack又称为堆栈或栈,它是一种重要的线性数据结构,栈只能在一端进行数据输入和输出操作,且遵循“后进先出”的原则,它有一个固定的栈底和浮动的栈顶。向栈中输入数据的操作称为“入栈”,被压入的数据保存在栈顶,同时栈顶指针上浮一个;同样从栈中输出数据的操作称为“出栈”,只有栈顶元素才能出栈,如果栈顶指针指向了栈底,说明当前的栈是空的。③泛型Queue集合Queue类(队列)也是非常重要的线性数据结构,它在按接收顺序存储消息方面非常有用。与栈不同,队列在一端输入数据(也叫入队),另一端输出数据(也叫出队)。队列中数据的插入和删除都只能在队列的头尾处进行,而不能直接在任意位置插入或删除数据,它的操作遵循“先进先出”原则。每个队列都有一个容量,如果存储的元素数达到了它的容量,这个容量还会自动增加以满足需要,队列有一个增长系数,它表示了当队列满了容量的增加值,用户也可以直接在Queue类的构造函数中设定增长系数,或者使用其默认值2.0。5.面向对象C#语言中微软提供了大量的类以方便完成程序开发。面向对象程序设计中的核心概念包括:类和对象。简单地说,类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。对象则是以类为数据类型声明或创建的变量。(1)类的定义类作为复杂的数据类型,内部可以包括:属性、字段、方法以及内部类。类在使用前,必须先声明,声明类使用关键字class,语法格式为:属性访问控制符class类名{//类的属性、字段、方法、内部类}(2)对象的声明及创建设计类的目的就是为了根据需要创建一种新的数据类型,最终将用于声明和创建对应满足要求的变量,类创建的变量又称为对象。创建对象的关键字是new,语法格式为:new类名();(3)类的字段和属性在类的内部常常需要定义类的成员,类的成员包括字段、属性、常量、方法、事件、索引器、构造函数、析构函数以及内部类等。①字段声明字段是在类范围声明的变量。字段是其包含类型的成员,字段可以是内置数值类型或其他类的实例。例如,日历类可能具有一个包含当前日期的字段。字段的声明语法格式为:访问控制符数据类型字段名字段声明在类的直接内部。②类的字段访问对象创建后,可以通过对象名和对应的字段名实现对相应对象的字段进行访问,以设置字段的值或读取字段的值。访问对象的属性时,通过“.”运算符实现,语法格式为:对象名.字段名。③类的属性声明C#一般把字段设计为非public类型,提供“属性”来访问字段。属性是提供灵活的机制来读取、编写或计算私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。属性声明的基本语法格式为:访问控制符属性数据类型属性名{get{return字段名;}set{字段名=value;}}注意,set中的value变量名不能变。其中的get又称为get属性访问器,set又称为set属性访问器。④类的属性访问由于字段不再能直接进行访问,但程序仍需要读取和保存相关信息,此时属性的访问将替代原有字段的访问内容。访问对象的属性方法和访问对象的字段方法一样,通过“.”运算符实现,语法格式为:对象名.属性名。(4)索引器①定义索引器当对象中包括多个同类型的成员时,需要快捷方便的方式访问指定序号对应的成员,此时可以使用索引器。索引器允许类的实例就像数组一样进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。通过集合来管理多个同类对象的情况一般都可以设计索引器以访问集合中的对象。②索引器的特点索引器具有以下特点:使用索引器可以用类似于数组的方式为对象建立索引。get访问器返回值。set访问器分配值。this关键字用于定义索引器。value关键字用于定义由set索引器分配的值。索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。索引器可被重载。索引器可以有多个形参,例如当访问二维数组时。③应用索引器索引器与属性类似,通过get和set访问器来访问对应的对象,但写法不同,索引器的使用一般是通过包含有索引器的对象名称和索引对象的序号组成,如:对象名[索引序号],即是对应的对象,当它处于赋值符号左侧时,即调用set访问器,把赋值符号右侧的值保存到索引器中,而当它处于赋值符号右侧时,即调用get访问器,获得索引到的对象。(5)方法定义及调用①定义方法方法是通过指定访问控制符、返回值、方法名称和参数在类中声明的。这些统称为方法的“签名”。方法参数括在括号中,每个参数需要指明参数对应的数据类型,并用逗号隔开,参数名必须符合标识符规定。类中定义方法的基本语法格式为:方法的访问控制符返回值类型方法名(参数列表){//方法体,即方法中处理数据的实现过程;//如果需要还可以有返回值;}②调用方法C#中,应用已有代码是通过调用对象的方法来实现,其语法格式为:对象.方法名(参数列表)其中参数列表根据方法定义要求,传递对应数量和数据类型的参数值,此参数称为“实参”,实参可以是数值,也可以是对象。实参与形参的结合不是按参数名称传递,而是按参数列表从左到右一一结合,所有对应实参和形参必须是对应数据类型。(6)构造函数每个类都有显示或隐式地包含一个构造函数。构造函数是一种特殊的方法,该方法用来实现对象的初始化。构造函数需要通过使用与其所属类相同的名称来定义。构造函数在类实例化时由CLR自动调用。构造函数的一般语法格式为:访问控制符构造函数名(参数列表){//构造函数的方法体}(7)静态成员类中字段、属性、索引器及方法的调用都必须通过“对象名”来实现,类的这样成员又被称为实例成员,即它们都属于某个具体的对象(即类的实例)。在某些情况下,同一类的所有对象需要共享数据,此时实例成员不能满足要求,为此设计了类的静态成员。静态成员属于类,而不属于实例,静态构造函数还可以初始化类。静态成员是与类相联系的概念,当需要初始化或提供由类的所有实例共享的数值时,使用静态成员很有用。(8)内部类和匿名类①内部类publicclassOuterClass{InnerClassinnerField;publicclassOuterClass{InnerClassinnerField;publicOuterClass(){//初始化innerField=newInnerClass();}publicvoidShowMessage(){Console.WriteLine("这是在外部类中显示提示信息");

innerField.ShowMessage();}classInnerClass//声明内部类{publicvoidShowMessage(){Console.WriteLine("这是在内部类中显示提示信息");}}}②匿名类varv=new{Amount=108,Message="Hello"};Console.WriteLine("v.Amount={0},v.Message={1}",v.Amount,v.Message);匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。这些属性的类型由编译器推断。以下示例展示一个用两个分别名为Amount和Message的属性初始化的匿名类varv=new{Amount=108,Message="Hello"};Console.WriteLine("v.Amount={0},v.Message={1}",v.Amount,v.Message);程序执行结果为:v.Amount=108,v.Message=Hello6.面向对象的高级应用(1)类的继承继承是面向对象程序设计中的一种重要机制,该机制自动的将一个类中的操作和数据结构提供给另一个类,这使得程序员可以使用已有类的成分来建立新类。理解面向对象程序设计的关键就是要理解继承。继承(inheritance)是指一个新类可以从现有的类派生而来。这个新类称为派生类(也叫子类),继承了现有类的特性,包括其域、属性、方法和接口等,并且子类也可以声明新的域、属性和方法等,使之适合具体的需要。继承是面向对象技术能够提高软件开发效率的重要原因之一,很好地解决了软件的可重用性问题。在C#语言平台中,创建出来的任何类都可以作为基类,派生其他的类。因此,如果没有明确的在代码中指明这个类不能作为基类,就可以从这个类中派生子类。首先,用如下代码创建一个Employee(职员)类:publicclassEmployee{}publicclassEmployee{}publicclassEmployee{publicclassEmployee{privatestringname;privateDateTimebirthDate;publicstringName{get{returnname;}set{name=value;}}publicDateTimeBirthDate{get{returnbirthDate;}set{birthDate=value;}}}(2)创建子类为了实现继承,需要添加一个新类。例如,创建一个SalesForce(销售人员)类,代码如下:publicclassSalesForce{publicclassSalesForce{privatedecimalsalesVolume;privateintsalesManagerID;//销售额publicdecimalSalesVolume{…}//所属销售经理IDpublicintSalesManagerID{…}}publicclassSalesForce:Employee(3)重载方法SalesForce类通过继承自动获得了Name和BirthDate属性,它还拥有自己的SalesVolume和SalesManagerID属性。这就说明了可以给SalesForce子类添加方法和属性来扩展基本的Employee接口。可以给SalesForce类添加新的属性、方法和事件,它们将成为任何基于SalesForce类型创建的对象的一部分。这对Employee类没有任何影响,仅影响SalesForce类和SalesForce对象。甚至可以给子类添加和基类中的方法同名的方法,以扩展基类的功能,只要这些方法具有不同的参数列表即可。重载基类中的现有方法在本质上与重载常规方法相同。(4)访问控制符访问控制符是C#语言中的一类关键字,用于指定声明的成员或类型的可访问性。本节主要介绍C#语言中常用的四个访问控制符:public、protected、internal和private。classSampleClass{classSampleClass{publicintx;//无访问限制}protected关键字是一个成员访问控制符。protected修饰的成员在它的类中可访问并且可由派生类访问,也就是说,仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的。internal关键字是类型和类型成员的访问控制符。只有在同一程序集的文件中,内部类型或成员才是可访问的。private关键字是一个成员访问控制符。私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结构体中才是可访问的。(5)多态性多态性(polymorphism)是面向对象程序设计中的一个重要概念,它是指同一个消息被不同类型的对象接收时产生不同的行为。所谓消息是指对类成员的调用,不同的行为是指调用了不同的类成员。①方法的重载方法重载(functionoverload)是指功能相似,方法名相同但所带参数不同的一组方法。这里的“所带参数不同”既可能是参数的数据类型不同也可能是参数的个数不同。在第五章,我们已经简单介绍了方法的重载。②隐藏基类方法除了常规方法重载之外,还有一些特殊情况需要考虑。例如,在有些情况下,希望往派生类中添加一个与基类中方法名相同,所带参数也相同的成员方法。这种情况下程序运行时由于无法通过参数列表来确定调用基类还是派生类中的方法,所以对于这种特殊的方法重载我们需要隐藏基类中的方法,使通过派生类对象进行的方法调用能调用到派生类中的与基类中方法名相同,所带参数也相同的成员方法。在派生类中定义与基类中方法名相同,所带参数也相同的成员方法时可以使用new关键字隐藏基类中的方法。③虚方法派生类定义的重载函数成员(函数名和参数类型与基类中函数成员相同)虽然可以隐藏基类的同名函数成员,但是只能通过派生类对象来调用派生类再定义的函数成员。如果使用基类变量引用派生类对象,然后通过基类变量调用该函数成员,访问的仅仅是从基类继承的同名函数,无法访问派生类定义的重载成员函数。如何通过基类变量来访问派生类中重载的函数成员呢?C#提供了虚方法机制来解决这个问题。首先在基类中将这个可能会被重载地方法通过virtual关键字定义为虚方法,接着在派生类中通过override关键字重载该方法,最后就可以通过基类变量引用派生类对象,来访问派生类中重载的这个同名方法。这样,通过基类的变量,就可以使属于同一个类族的不同对象产生不同的行为,从而实现了运行过程中的多态。④base关键字为了直接从基类中调用方法,可以使用base关键字。这个关键字可以在任何类中使用,它提供了基类中的所有方法,以供使用。base关键字用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法;指定创建派生类实例时应调用的基类构造函数。基类访问只能在构造函数、实例方法或实例属性访问器中进行。从静态方法中使用base关键字是错误的。(6)密封类密封类在声明中使用sealed修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将会提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。(7)接口C#接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语言的限制(理论上)。C#接口可以从多个基接口继承,而类或结构可以实现多个接口。C#接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。C#接口类似一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被引用。接口变量只能引用实现该接口的类的实例。①接口定义interfaceIMyExample//定义接口{interfaceIMyExample//定义接口{stringthis[intindex]{get;set;}voidFind(intvalue);stringPoint{get;set;}}在C#中类和结构可以同时派生至多个C#接口。例如:interfaceIDataBound{voidBind(Binderb);}classEditBox:Control,IControl,IDataBound{publicvoidPaint();publicvoidBind(Binderb){}}在上述代码中,类“EditBox”继承了类“Control”interfaceIDataBound{voidBind(Binderb);}classEditBox:Control,IControl,IDataBound{publicvoidPaint();publicvoidBind(Binderb){}}②接口特点C#中的接口有如下特点:C#中的接口是独立于类来定义的。接口和类都可以继承多个接口。类可以派生于一个基类,接口不能派生于一个基类。一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能从仅有的一个类派生。6.2.3上位机界面设计1.创建RFID电子钱包程序工程项目(1)打开VS2022,在起始页的项目窗体界面上,选择菜单中的“创建新项目”,进入创建新项目对话框,在右侧的模板中选择Windows窗体应用程序选项;点击“下一步”,进入配置新项目对话框,在项目名称输入栏中输入将要开发的项目名称“ElectronicWallets”,在位置栏选择应用程序所保存的路径位置,如图6-14所示;点击“下一步”,进入其他信息对话框,选择默认框架,最后单击“创建”按钮,进入项目开发界面。图6-14窗体应用设计界面(2)将RFID读写模块的动态链接库HFrfid.dll拷贝进ElectronicWallets工程项目的bin/Debug目录中,如图6-15所示。图6-15将HFrfid.dll拷贝进ElectronicWallets工程项目的bin/Debug目录中(3)右键单击解决方案资源管理器中的“依赖项”,选择“添加项目引用”选项,如图6-16所示。图6-16选择“添加项目引用”选项(4)在添加引用对话框中,选择“浏览”项,然后在工程的Debug目录下找到并选中HFrfid.dll链接库,单击“确定”按钮,如图6-17所示。图6-17引用HFrfid.dll动态链接库(5)当工程项目中添加完成HFrfid.dll动态链接库之后,就可以调用相应的方法实现对RFID卡实现电子钱包操作。查看HFrfid对象如图6-18所示。图6-18查看HFrfid对象2.窗体界面设计(1)选中整个Form窗体,然后在右边选项卡中选择“属性”,如图6-19所示。然后在属性栏Text属性中输入“RFID电子钱包”,如图6-20所示。图6-19选中整个Form窗体选择“属性”图6-20在Text属性中输入“RFID电子钱包”(2)点击菜单栏中的“视图”,打开下拉框中的“工具箱”,如图6-21所示。选择公共控件,添加一个Label控件显示程序标题信息,比如“RFID电子钱包读写程序”,可以通过Label的Font属性修改字体、字形和字号等;添加一个ComboBox控件用于选中串口名称,两个Button控件分别实现端口检测和打开串口,一个Label控件显示RFID模块的设备号信息和TextBox控件设置RFID模块地址为20。添加串口相关组件如图6-22所示。图6-21在Text属性中输入“RFID电子钱包”图6-22添加串口相关组件(3)在界面设计中,继续添加4个Button控件,8个ComBox下拉列表控件,5个TextBox控件,完成程序界面,通过选定的密钥和指定的数据块,执行卡中数据初始化操作、数据增加操作、数据减值操作以及数据的查询操作,在界面下方通过TextBox控件显示操作状态,如图6-23所示。秘钥控件在属性Items中添加秘钥控件在属性Items中添加KeyA和KeyB块号控件在属性Items中添加0-20(4)将上图中主要控件进行规范命名和设置初始值,如表6-5所示。表6-5对应控件命名控件名称命名说明comboBox1cbPort设置串口名称,如Com1、Com2、Com3button2btntestport检测当前可用的串口button1btnPort打开或关闭串口按钮button3btnInitalbag初始化指定的数据块数据button4btnbagDec对指定的数据块减值操作(充值)button5btnBagInc对指定的数据块增值操作(扣钱)button6btnBagquery对指定数据块进行数值查询操作(查询余额)txtDeviceAddress设置RFID模块设备地址20txtInitalbag设置指定数据块初始化数据txtBagdec设置指定数据块减值数据txtBaginc设置指定数据块增值数据txtBagquery显示指定数据块余额comboBox2cbInitalkey选择初始化数据块的密钥A或者密钥BcomboBox3cbBagdeckey选择减值数据块的密钥A或者密钥BcomboBox4cbBaginckey选择增值数据块的密钥A或者密钥BcomboBox5cbBagquerykey选择查询数据块的密钥A或者密钥BcomboBox6cbBaginitalData选择初始化数据块comboBox7cbBagdecData选择减值数据块comboBox8cbBagincData选择增值数据块comboBox9cbBagqueryData选择查询数据块txtstatus操作状态显示选中组件,点击“属性”,找到“Design”中的“Name”属性,按上表修改命名,例如修改组件“ComboBox1”的名称如图6-24所示。图6-24修改组件“comboBox1”的名称基于RFID的读写卡实现任务基于RFID的读写卡实现任务3引导案例 引导案例基于RFID的电子钱包程序基于RFID技术的电子钱包程序是一种利用RFID技术来实现非接触式支付的系统,这种系统通过RFID标签(通常嵌入在智能卡或手机中)与RFID读写器之间的无线通信来完成交易。RFID电子钱包程序功能就是通过串口通信进行RFID卡中指定的数据块进行数据的初始化、数据的增加、数据的减值以及数据的查询操作,程序功能模块结构图如图6-25所示。图6-25电子钱包程序功能模块结构图6.3.1RFID设备选型1.RC522-IC卡感应模块RC522-IC卡感应模块采用MFRC522芯片,如图6-26所示,应用于13.56MHz非接触式通信。MFRC522芯片是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,MFRC522利用了先进的调制和解调概念,集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。图6-26RC522-IC卡感应模块RC522-IC卡感应模块支持14443A兼容应答器信号,还支持快速CRYPTO1加密算法,用语验证MIFARE系列产品。它与主机间通信采用SPI模式,有利于减少连线,缩小PCB板体积,降低成本。模块采用MFRC522芯片设计读卡电路,使用方便,适用于设备开发、读卡器开发等。模块参数如表6-6所示。表6-6RC522-IC卡感应模块参数序号参数范围1输入电压DC3.3V2工作电流13-26mA3工作频率13.56MHZ4空闲电流10mA5读卡距离最远达4cm以上6支持的卡类型mifare1S50(S70)、mifareUltraLight、mifarePro、mifareDesfire2.Mifare1S50卡Mifare1S50卡作为读写标签,其主要指标包括:包含容量为8K位EEPROM,分为16个扇区,每个扇区为4块,每块16个字节以块为存取单位。每个扇区有独立的一组密码及访问控制每张卡有唯一序列号,为32位具有防冲突机制。支持多卡操作无电源,自带天线,内含加密控制逻辑和通讯逻辑电路。数据保存期为10年,可改写10万次,读无限次。工作温度范围为-20℃~50℃(湿度为90%),工作频率为13.56MHz,通信速率为106KBPS,读写距离为10cm以内(读写距离与读写器有关)。6.3.2RFID读写卡程序设计1.RFID电子钱包程序功能代码实现(1)在Form1窗体代码文件(Form1.cs)中引用串口类及RFID模块读写类。代码如下:usingSystem.IO.Ports;//后添加的串口类usingHFrfid;//后添加的RFID模块读写类namespaceElectronicWallets{publicpartialclassForm1:Form{publicForm1(){usingSystem.IO.Ports;//后添加的串口类usingHFrfid;//后添加的RFID模块读写类namespaceElectronicWallets{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}}}privatevoidbtntestport_Click(objectsender,EventArgse){cbPort.Items.Clear();cbPort.Text=null;SearchPort();PcdOption.CloseSerialPort();btnPort.Text="打开串口";}privatevoidForm1_Load(objectsender,EventArgse)privatevoidbtntestport_Click(objectsender,EventArgse){cbPort.Items.Clear();cbPort.Text=null;SearchPort();

温馨提示

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

评论

0/150

提交评论