版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z.实验一条码制作与设计一、实验目的熟悉各种条码的类型;掌握条码编制软件的安装和根本操作使用方法;学会设计不同应用领域的条码、二维码;能够读写条码、二维码信息。二、实验容制作条形码标签,二维码标签。三、根本原理条形码的编码原理、二维码的工作原理。四、所需仪器供电电源、电子标签。1.软件环境:windows操作系统、Android操作系统2.硬件环境:PC、智能手机实验步骤1.条形码设计、条形码读写下载并安装Labelm*通用条码标签设计系统下载:搜索并下载l*setup.e*e安装:找到l*setup.e*e文件,然后双击,按照提示,选择好安装路径后,然后执行下一步,即可完成对软件的安装。软件熟悉:翻开Labelm*通用条码标签设计系统,默认翻开新建标签,这里我们选用从模板翻开,可以预览不同应用场合的标签模板,逐一翻开、熟悉,观察其特点、组成等。设计标签:翻开Labelm*通用条码标签设计系统,依次选择“从模板翻开〞、“超市标签〞、“超市水果标签〞。按照模板,对其标签进展修改设计。最后保存,以备读取。图1.1条码信息读取:在手机上下载“scanpet中国〞,然后将其安装,翻开,scanpet中国简介:条形码扫描仪应用程序:SCANPET是您完美的库存物资管理员。它是一个通过使用E*cel作为产品数据库的条形码扫描仪。您只需用手机上的摄像头来读取工程条形码,它便会在您的E*cel文件中查找到该工程的信息。SCANPET将货品管理员、库存物资管理员、E*cel数据库和条形码扫描仪集于一身:您可以使用SCANPET来管理您的库存物资登记、掌控您的商店、或者读取条形码,等等。建立属于您自己的工程数据库就如同创立一个E*cel文件一样简单。本程序有众多强大的配置选项,适用于几乎任何情形。
图1.2初次翻开,软件提示配置向导,选择“体验模式〞,再选择“新文件〞,提示是否创立新的输出文件,选择“是〞,这个时候可以读取刚刚设计的条码。然后输入相应的商品信息,如图3所示。最后保存输出文件。接着返回“体验模式界面〞选择“文件〞,点击刚刚新建的文件,点击绿色的条码图标,进展扫描刚刚的条码,这个时候将调出刚刚的商品信息。即完成对条码的信息输入及读取。二维码设计、二维码读写在线生成二维码:可以使用手机二维码生成软件,也可以使用网上的二维码生成器如:草料二维码。cli.im/te*t/2014082717"rLq87。分别尝试文本信息、网址,名片、图片等类型,然后生成二维码,使用手机二维码读取软件读取,如肥猫比价软件等等。体验二维码的应用场合及特点。六、实验分析与心得七、问题与建议实验二标签信息的读写一、实验目的1.熟悉和学习ISO/IEC18000-3,ISO15693标准规第三局部协议。2.理解指令容中的读取和写入标签数据操作局部容。3.学会使用RFID原理实验箱,认识不同频段的RFID读写器模块。4.理解标签信息的读写过程。二、实验容通过发送不同的根本指令,观察返回的数据,了解指令的作用。三、根本原理ISO15693标准规第三局部。四、所需仪器供电电源、电子标签。五、实验步骤1、读取UID将1个标签放于实验箱ISO15693M模块天线之上,给系统上电,翻开系统软件PracticeSystem.e*e,正确设置串口,波特率115200。运行“寻卡〞命令,得到正常标签的UID。操作如图2.1所示:图2.12、读取单个BLOCK数据确认系统已经得到了单个标签的UID,在“ISO15693命令〞处,运行“读取单个数据块〞mand〔命令〕,即可得到这个UID标签的相应Block里面的数据。操作如图2.2所示:图2.2查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时读写器读到这个标签存储器地址为0里面存储的数据,具体数据说明请查看位于J*200E*Document\Doc文件夹下的物联网RFID教学软件PracticeSystem介绍.pdf文件。可以在BlkAdd处更改地址,选择读取需要地址的数据。3、写单个BLOK数据确认系统已经得到了单个标签的UID,在“ISO15693命令〞处选择写入单个数据块,在BlkAdd处输入想要写入数据的存储器地址数值,再在BlkBit处输入需要写入存储器这个地址的数据,运行“写入单个数据块〞mand,即可把需要的数据写入到当前标签指定地址的Block存储器里。操作如图2.3所示:图2.3查看“响应数据〞里面的“Status〞处的信息。上图为放置1个标签〔卡片〕时读写器向标签的存储器00位置写入12341234这4个字节数据的响应。写入数据后,可以再通过“读取单个数据块〞mand〔命令〕读取相应地址的数据,与刚刚写入的数据比拟来验证是否写入正确。 命令说明可以参考位于J*200E*Document\Doc文件夹下的ISO15693标准相关命令使用说明.doc相关文档。实验三RFID防撞系统实验一、实验目的1.了解防碰撞的原理2.熟悉和学习Anticollision容,理解它的原理、流程和软件实现方法。3.掌握设置防碰撞的命令。二、实验容通过使用带anticollison〔防冲突〕处理过程的指令和不带anticollison〔防冲突〕处理过程的指令读取多个标签,以及使用不带anticollison处理过程的指令读取单个标签,比拟其指令和读取的结果。分析实验数据,总结防冲撞机理,掌握指令产生的作用。三、根本原理ISO15693标准规第三局部第8节。所需仪器供电电源、多电子标签。实验步骤1、设置加电运行系统,在系统的天线围放置两或者两以上标签。翻开系统软件PracticeSystem.e*e,正确设置串口,操作如图3.1所示:图3.1选择确定当前使用的串口,操作如图3.2所示:图3.2点击“翻开〞连接串口。连接正确时信息栏显示如图3.3所示:图3.32、操作(1)Anticollision〔防冲突〕操作在系统软件下,“测试命令〞处,选择运行“测试防冲突〞,“发送使用防冲突算法的寻卡命令〞动作。操作如图3.4所示:图3.4查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置3个标签〔卡片〕时“Anticollision〞使用防冲突算法的寻卡命令读到的数据响应。注意“S〞行里面后面的数据。(2)Non-Anticollision操作保持多标签数量不变,在系统软件下,“测试防冲突〞处,选择运行“发送不使用防冲突算法的寻卡命令〞动作。操作如图3.5所示:图3.5查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置3个标签〔卡片〕时“Non-Anticollision〞不使用防冲突算法的寻卡命令读到的数据响应。注意此时“S〞行里面后面的数据。在系统的射频磁场保存一电子标签,拿出多余的标签,在系统软件下,“测试防冲突〞处,再次选择运行“发送不使用防冲突算法的寻卡命令〞动作。操作如图3.6所示:图3.6查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时“发送不使用防冲突算法的寻卡命令〞命令读到的数据响应。注意此时“S〞行里面后面的的数据。把这个数据和“发送不使用防冲突算法的寻卡命令〞操作多个标签时以及“发送使用防冲突算法的寻卡命令〞操作时“S〞行里面的数据比拟,结合ISO/IEC15693标准协议,分析实现现象和结果,体会实验过程,加深对RFID防冲撞的理解。实验四RFIDCRC实验一、实验目的1.了解CRC的原理及作用。2.熟悉和学习ISO/IEC18000-3,ISO15693标准规第三局部协议,其中贯串所有指令局部CRC的容。3.熟悉Anne*D的容。理解它的原理、流程和软件实现方法。二、实验容通过使用带CRC处理过程的指令和不带CRC处理过程的指令读取单个标签,比拟其指令和读取的结果。分析实验数据,了解CRC的作用,掌握指令的应该取得的效果。三、根本原理ISO15693标准规第三局部下的Anne*D局部。四、所需仪器供电电源、单电子标签。五、实验步骤1、设置加电运行系统,在系统的天线围放置1个标签。翻开系统软件PracticeSystem.e*e,正确设置串口,设置操作同防碰撞实验局部的设置操作。2、操作2.1、带CRC命令操作在系统软件下,“测试循环冗余校验〞处,选择运行“发送包含冗余校验的寻卡指令〞动作。操作如图4.1所示:图4.1查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时读写器发送一个“包含冗余校验的寻卡指令〞的读取命令时读到标签的数据响应。注意“S〞行里面的“CRC〞处的数据。2.2、不带CRC命令操作保持单标签不变,在系统软件下,“测试循环冗余校验〞处,选择运行“发送不带含冗余校验的寻卡指令〞动作。操作如图4.2所示:图4.2查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时读写器发送一个“不带含冗余校验的寻卡指令〞的读取命令时读到标签的数据响应。注意此时“S〞行里面的“CRC〞处的数据。在上两图中可以从信息栏里观测:时间为13:16:13和时间为14:01:44发送的指令的区别。其中时间为13:16:13的指令是带CRC码的指令,时间为14:01:44的指令是不带CRC码的指令。比拟软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,结合ISO/IEC15693标准协议,分析实现现象和结果,体会实验过程,加深对CRC16循环冗余检查机制的理解。实验五RFID数据包〔1〕数据包分析一、实验目的1.理解 RFID标签和读写器之间传输的信息包的构造2.熟悉ISO/IEC18000-3,ISO15693标准规第三局部协议和指令容。3.掌握信息包相应的分析方法。4.熟悉和学习本系统通讯接口协议。5.理解Reader与主机之间的通讯方式、流程和软件实现方法。二、实验容通过发送寻卡〔INVENTORY〕命令从电子标签里读出UID,通过在PC软件下分析相关的数据,了解、掌握读写器和标签之间数据包的组成和构造。通过使用带起始标志处理过程的指令和不带起始标志处理过程的指令读取单个标签,比拟其指令和读取的结果。分析实验数据,了解Reader与主机之间的通讯方式,掌握指令的应该取得的效果。三、根本原理ISO15693标准规第三局部的第4节和第7节容。此通讯协议标准主要是规定了Reader与主机之间的通讯方式,此通讯协议是建立在RS232串行通讯根底上的,实现的是单点对单点的通讯,类似于3964通讯协议。协议规定以ASCII〔美国标准信息交换代码〕模式通信。四、所需仪器供电电源、电子标签。五、实验步骤1.数据包分析1.1、设置加电运行系统,在系统的天线围放置1个标签。翻开系统软件PracticeSystem.e*e,正确设置串口,设置操作同防碰撞实验局部的设置操作。1.2、操作(1)运行“寻卡〞mand〔命令〕在系统软件下,“ISO15693命令〞处,选择运行运行“寻卡〞mand动作。操作如图5.1所示:图5.1查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时读写器发送一个“寻卡〞读取命令时读到标签的数据响应。上图中在信息栏里,命令局部“S〞行里面后面的数据“时间:09:29:40命令数据为:3A0201020027BEDA0D0A〞,其中“Code〞对应的数据是“01〞,“27〞为命令标志。上图中在信息栏里,标签的响应局部“R〞行里面“时间:09:29:40响应数据:3A02000A0000000BEDD521000104E08EE8ODOA〞,其中“0A〞数据后面的第二、三个字节是标签标签返回的第一个和第二个字节的数据分别为:Flags:标签返回的标志,DSFID:数据存储格式标志,后面的8个字节是标签的UID号,具体数据说明请查看位于J*200E*Document\Doc文件夹下的物联网RFID教学软件PracticeSystem介绍.pdf文件。结合ISO/IEC15693标准协议,分析实现现象和结果,总结实验过程,加深对传输的信息包数据构造的理解。2.信令数据包2.1、设置加电运行系统,在系统的天线围放置1个标签。翻开系统软件PracticeSystem.e*e,正确设置串口,设置操作同防碰撞实验局部的设置操作。2.2、操作(1)带起始标志命令操作在系统软件下,“ISO15693命令〞处,选择运行“发送包含帧起始符的寻卡命令〞动作。操作如图5.2所示:图5.2查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时读写器发送一个带起始标志的读取命令时读到标签的数据响应。注意“S〞行里面后面“SOF〞处的数据。(2)不带起始标志命令操作保持单标签不变,在系统软件下,“测试命令〞处,选择运行“发送不含帧起始符的寻卡命令〞动作。操作如图5.3所示:图5.3查看“响应数据〞,就是软件界面下部,命令参数设置和结果显示区里“R〞行,后面的数据和软件界面中部的消息显示区里的数据,上图为放置1个标签〔卡片〕时读写器发送一个不带起始标志的读取命令时读到标签的数据响应。注意“S〞行里面后面“SOF〞处的数据。比拟两个命令“R〞行里面后面的数据,结合ISO/IEC15693标准协议,分析实现现象和结果,总结实验过程,了解本系统Reader与主机之间的通讯方式。加深对信令数据包数据构造的理解。实验六RFID应用程序的建立一、实验目的1.设计、开发一个可连接实验系统平台并且可以做读卡操作的应用程序。2.掌握使用DLL的技能,通过调用DLL里面的函数,开发出实际应用程序软件,满足实际应用的需要。3.理解RFID应用系统开发流程。二、实验容使用MicrosoftVisualStudio2010设计如下图的应用程序界面如图6.1 图6.1编写代码,能使程序运行到达实验目的三、根本原理C*语言编程规,DLL的调用规四、实验步骤1.启动MicrosoftVisualStudio2010开发平台,在C*模块下,新建一个Windows船体应用程序,界面如图6.2:图6.2
新建完成后,给工程取名为ISO15693_Reader,进入界面后如图6.3,右键点击窗体选择属性窗口,在Te*t属性中取名为RFIDPracticeTeaching图6.3
完成后开场建立功能模块,在工具箱中拖出GroupBo*空间,放置在窗体上,并拖拽出Lable与boBo*控件,如下图,在Lable控件的Te*t属性中分别取名:Port与Baud表示串口与波特率,并给两个boBo*取名cmb_Port与cmb_Baud,如图6.4图6.4
完成后,开场搭建翻开串口,关闭串口与刷新串口的按钮,从工具箱中拖拽出三个Button,如下图放置在窗体中,在其Te*t属性中分别取名:Open、Close、Refresh在其Name属性中取名为:btn_Port、btn_Baud、btn_Refresh,如图6.5图6.5
建立完成后,如下图,搭建实验类型,也即对应的命令窗体,放置GroupBo*,取名mandOperate:在其中分别放置7个RadioButton分别取其Te*t属性如下图,并且放置两个按钮和2个boBo*,Run按钮和AutRun按钮表示执行当前的命令,Name属性分别取名btn_Run,btn_AutoRun,Run表示执行一次,Auto表示循环执行,对RadioButton分别取名为rb_Inventory、rb_ReadSingle、rb_WriteSingle、rb_StayQuiet、rb_ResetReady,rb_ReadMultiple,rb_AutoInventory,在ModulationSystem:窗口中,放置有两个RadioButton,分别取名为ASK,FSK,表示两种调制模式,下方两个boBo*分别表示标签的集合,以及重置模式的选项,取名为cmb_tags,cmb_Reset,如图6.6图6.6
设置完成后搭建对应的读取数据,写入数据的参数窗体,如下图,放置一个GroupBo*,其中放置一些文本框和Te*tBo*,分别表示读取/写入数据的地址,大小,已经长度,在Resulte后面放置一个Te*tBo*,设置其MultiLine属性为True用来存放读取或者写入的数据,还需放置一个文本框用来表示写入卡片数据块的数据,格式为16进制的字符串,如图6.7图6.7
完成后搭建最后的显示界面:放置一个GroupBo*取名为OutputInfo:表示输出的信息窗口,两个按钮取名为:ClearEveryTe*t,OutSystem,分别表示清空所有显示显示以及推出系统的按钮,下方的List_Info表示信息显示的控件,取名为List_Info,如图6.8图6.8至此窗体界面已经搭建完成,个别地方控件的Name属性的取名自己定义,Name属性是该控件的唯一标识,不可重复
编写软件代码:编写刷新串口,翻开与关闭对应的串口代码,首先引用DLL,右键点击解决方案中的引用,把放置ISO15693DLL.dll与SLABHIDDevice.dll的文件引用到该程序中,引入命名空间以及声明ISO15693类的实例如图6.9图6.9 双击窗体上的Refresh按钮进入到代码界面:写一个方法RefreshPort()用于刷新按钮,以供使用,代码如下privatevoidRefreshPort(){cmb_Port.Items.Clear();cmb_Port.Te*t="";string[]Ports=System.IO.Ports.SerialPort.GetPortNames();foreach(variteminPorts){cmb_Port.Items.Add(item);}if(Ports.Length>=0){cmb_Port.SelectedInde*=0;}}
双击界面上的Form窗体进入到Load事件中,调用Refresh方法以获取在该设备下的所有串口名,如图6.10图6.10在窗体界面上双击Open按钮进入btn_Open_Click事件中编写对应的翻开串口的代码,首先编写一个委托与方法用于跨线程显示List_Info的信息,也就是串口所有操作的信息都会在其显示代码如下:privatedelegatevoidAddList(stringmsg);privatevoidShowList(stringmsg){if(list_Info.InvokeRequired){AddListd=newAddList(ShowList);list_Info.Invoke(d,msg);}else{list_Info.Items.Insert(0,DateTime.Now.ToLongTimeString()+":êo"+msg);}}接着编写btn_Open_Click事件中关于翻开串口的代码://翻开串口privatevoidbtn_Open_Click(objectsender,EventArgse){if(cmb_Port.SelectedInde*<0){ShowList("翻开失败,请选择串口!");return;}Bytevalue=Reader.OpenSerialPort(cmb_Port.Te*t,Convert.ToInt32(cmb_Baud.Te*t));if(value==0*00){ShowList(string.Format("Port:[{0}],OpenSucceed!,Baud:[{1}]",cmb_Port.Te*t,cmb_Baud.Te*t));}else{ShowList(string.Format("Port[{0}],OpenFail!",cmb_Port.Te*t));}}如图6.11所示:图6.11同上,双击Close按钮进入关闭事件中,调用ISO15693中的关闭串口的方法Reader.CloseSerialPort();代码如下://关闭串口privatevoidbtn_Close_Click(objectsender,EventArgse){Bytevalue=Reader.CloseSerialPort();if(value==0*00){ShowList(string.Format("Port[{0}],CloseSucceed!",cmb_Port.Te*t));}else{ShowList(string.Format("Port[{0}],CloseFail!",cmb_Port.Te*t));}}如图6.12所示:图6.12双击Run按钮进入对应的时间编辑界面:Ismand变量中每一个值表示对应的窗体上的RadioButton,对应的不同的指令Ismand取值为:1==寻单卡,并有不同调制模式 2==写入数据到指定的数据块中 3==使对应的卡片处于静默状态 4==重置卡片的准备状态,有四种模式 5==读取卡片的多个数据块中的数据具体代码如下: //寻到的卡片数目privateInt32TagCount=0;//寻到的卡片号privateString[]TagNumber=null;//声明一个卡片集合用于存放不同卡号的卡片数据privateList<string>_listTag=newList<string>();//执行方法,所有指令都通过这个按钮来控制privatevoidbtn_Run_Click(objectsender,EventArgse){Bytevalue;Byte[]BlockData=null;//判断是否翻开串口if(Reader.IsOpen){//调用一个Switch来对每一种选中命令执行相对应的方法switch(Ismand){//寻单卡case0:if(rb_ask.Checked){value=Reader.Inventory(ModulateMethod.ASK,InventoryModel.Single,refTagCount,refTagNumber);if(value==0*00){ShowList(String.Format("Modulate.ASK,TagCount:{0},TagNumber:{1}",TagCount,TagNumber[0]));if(!_listTag.Contains(TagNumber[0])){_listTag.Add(TagNumber[0]);cmb_tags.Items.Add(TagNumber[0]);cmb_tags.SelectedInde*=0;}}else{ShowList("InventoryLose!NoTagNumber");}}elseif(rb_fsk.Checked){value=Reader.Inventory(ModulateMethod.FSK,InventoryModel.Single,refTagCount,refTagNumber);if(value==0*00){if(!_listTag.Contains(TagNumber[0])){_listTag.Add(TagNumber[0]);cmb_tags.Items.Add(TagNumber[0]);cmb_tags.SelectedInde*=0;}ShowList(String.Format("Modulate.FSK,TagCount:{0},TagNumber:{1}",TagCount,TagNumber[0]));}else{ShowList("InventoryLose!NoTagNumber");}}else{}break;//读取指定的数据块中的数据case1:if(cmb_tags.Te*t!=""){value=Reader.ReadSingleBlock(cmb_tags.Te*t,BlockLength.ShortBlock4Byte,Convert.ToByte(t*t_StartAdress.Te*t.Trim(),16),refBlockData);if(value==0*00){StringBuildersb=newStringBuilder();for(inti=0;i<BlockData.Length;i++){sb.Append(BlockData[i].ToString("*2"));}t*t_Resulte.Te*t=sb.ToString();t*t_WriteData.Te*t=t*t_Resulte.Te*t;ShowList(string.Format("Reader:[{0}],Adress:[{1}],ReaderData:{2}",cmb_tags.Te*t,t*t_StartAdress.Te*t.Trim(),ByteArrayToString(BlockData)));}}else{ShowList("请先寻到一或多卡片!");}break;//写入数据到卡片中指定的数据块case2://ByteBlockLength=Byte.Parse(t*t);if(cmb_tags.Te*t!=""){Byte[]DataForWrite=newByte[Convert.ToInt32(t*t_BlockSize.Te*t.Trim())];StringstrForWrite=t*t_WriteData.Te*t.Trim();try{for(Bytei=0;i<DataForWrite.Length;i++){DataForWrite[i]=Convert.ToByte(strForWrite.Substring(i*2,2),16);}}catch(System.ArgumentOutOfRangeE*ceptione*){ShowList(String.Format("错误:写入的数据长度不够{0}Byte!",Convert.ToInt32(t*t_BlockSize.Te*t.Trim())));//t*t_WriteData_2.SelectAll();//t*t_WriteData_2.Focus();return;}catch(System.E*ceptione*){ShowList(String.Format("错误:请填写{0}Byte的16进制数据!",Convert.ToInt32(t*t_BlockSize.Te*t.Trim())));t*t_WriteData.SelectAll();t*t_WriteData.Focus();return;}value=Reader.WriteSingleBlock(cmb_tags.Te*t,BlockLength.ShortBlock4Byte,Convert.ToByte(t*t_StartAdress.Te*t.Trim(),16),DataForWrite);if(value==0*00){ShowList(string.Format("Succeed!,Adress:[{0}],WriteData:{1}",t*t_StartAdress.Te*t,t*t_WriteData.Te*t));}else{ShowList(string.Format("Lose!Adress:[{0}],WriteData:{1}",t*t_StartAdress.Te*t,t*t_WriteData.Te*t));}}else{ShowList("请先寻到一或多卡片!");}break;//使卡片静默case3:if(cmb_tags.Te*t!=""){value=Reader.StayQuiet(cmb_tags.Te*t);if(value==0*00){ShowList(string.Format("命令执行成功,卡片[{0}]静默成功!",cmb_tags.Te*t));}else{ShowList(string.Format("命令执行失败,卡片[{0}]静默失败!",cmb_tags.Te*t));}}break;//重置卡片状态case4:if(cmb_Reset.SelectedInde*!=0){//ResetModeresetMode;switch(cmb_Reset.SelectedInde*){case1://resetMode=ResetMode.RstAllQuiet;value=Reader.ResetToReady(ResetMode.RstAllQuiet);break;case2://resetMode=ResetMode.RstAllSelected;value=Reader.ResetToReady(ResetMode.RstAllSelected);break;case3://resetMode=ResetMode.RstSpecificQuiet;value=Reader.ResetToReady(ResetMode.RstSpecificQuiet,cmb_tags.Te*t);break;case4://resetMode=ResetMode.RstSpecificSelected;value=Reader.ResetToReady(ResetMode.RstSpecificSelected,cmb_tags.Te*t);break;default://resetMode=ResetMode.RstSpecificQuiet;value=Reader.ResetToReady(ResetMode.RstAllQuiet);break;}if(value==0*00){switch(cmb_Reset.SelectedInde*){case1:ShowList("重置所有静默卡片命令执行成功!");break;case2:ShowList("重置所有选中卡片命令执行成功!");break;case3:ShowList(string.Format("重置静默卡片[{0}]执行成功!",cmb_tags.Te*t));break;case4:ShowList(string.Format("重置选中卡片[{0}]执行成功!",cmb_tags.Te*t));break;default://resetMode=ResetMode.RstSpecificQuiet;break;}}else{switch(cmb_Reset.SelectedInde*){case1:ShowList("重置所有静默卡片命令执行失败!");break;case2:ShowList("重置所有选中卡片命令执行失败!");break;case3:ShowList(string.Format("重置静默卡片[{0}]执行失败!",cmb_tags.Te*t));break;case4:ShowList(string.Format("重置选中卡片[{0}]执行失败!",cmb_tags.Te*t));break;default://resetMode=ResetMode.RstSpecificQuiet;break;}}}else{ShowList("请选择一种静默方式才可执行!");}break;//读取多个数据块case5:if(cmb_tags.Te*t!=""){Byte[]BlockDataMore=null;intcount=0;if(int.TryParse(t*t_BlockCount.Te*t.Trim(),outcount)){intAddress=0;if(int.TryParse(t*t_StartAdress.Te*t.Trim(),outAddress)){value=Reader.ReadMultiBlock(cmb_tags.Te*t,BlockLength.ShortBlock4Byte,(byte)Address,(byte)count,refBlockDataMore);if(value==0*00){StringBuildersb=newStringBuilder();for(inti=0;i<BlockDataMore.Length;i++){sb.Append(BlockDataMore[i].ToString("*2"));}t*t_Resulte.Te*t=sb.ToString();t*t_WriteData.Te*t=t*t_Resulte.Te*t;ShowList(string.Format("Reader[{0}],Aderess:{1},ReaderCount:{3},Data:{2}",cmb_tags.Te*t,t*t_StartAdress.Te*t.Trim(),ByteArrayToString(BlockDataMore),count));}}}else{MessageBo*.Show("请填写正确的读取数据的大小");}}break;default:break;}}else{ShowList("串口未翻开,请翻开串口!");}}其中Ismand值,双击每个命令的RadioButto进入后设置相对应的值即可如图6.13所示:图6.13退出系统以及清空文本框的代码如下:privatevoidbtn_CloseSystem_Click(objectsender,EventArgse){if(MessageBo*.Show("是否退出系统?","提示",MessageBo*Buttons.OKCancel,MessageBo*Icon.Question)==System.Windows.Forms.DialogResult.OK){this.Close();}}//清空文本框privatevoidbtn_Clear_Click(objectsender,EventArgse){t*t_Resulte.Te*t="";t*t_WriteData.Te*t="";list_Info.Items.Clear();}当用户选择寻多卡指令时,需要使用到多线程:代码如下://循环寻多卡privatevoidbtn_AutoRun_Click(objectsender,EventArgse){//开启寻多卡的线程Threadth=newThread(AutoRun);th.IsBackground=true;if(btn_AutoRun.Te*t=="AutoRun"){IsStop=true;btn_AutoRun.Te*t="StopRun";th.Start();}else{IsStop=false;btn_AutoRun.Te*t="AutoRun";}}//添加标签的委托privatedelegatevoidAddItem(stringtag);privatevoidAddCmbTagNumber(stringtag){if(cmb_tags.InvokeRequired){AddItemd=newAddItem(AddCmbTagNumber);cmb_tags.Invoke(d,tag);}else{cmb_tags.Items.Add(tag);cmb_tags.SelectedInde*=0;}}//控制寻多卡循环是否继续进展privateBooleanIsStop=false;//寻多卡的循环方法privatevoidAutoRun(){Bytevalue;while(IsStop){if(rb_ask.Checked){value=Reader.Inventory(ModulateMethod.ASK,InventoryModel.Multiple,refTagCount,refTagNumber);if(value==0*00){for(inti=0;i<TagNumber.Length;i++){ShowList(String.Format("Modulate.ASK,TagCount:{0},TagNumber:{1}",TagCount,TagNumber[i]));if(!_listTag.Contains(TagNumber[i])){_listTag.Add(TagNumber[i]);AddCmbTagNumber(TagNumber[i]);}}}else{ShowList("InventoryLose!NoTagNumber");}}elseif(rb_fsk.Checked){value=Reader.Inventory(ModulateMethod.FSK,InventoryModel.Multiple,refTagCount,refTagNumber);if(value==0*00){for(inti=0;i<TagNumber.Length;i++){if(!_listTag.Contains(TagNumber[i])){_listTag.Add(TagNumber[i]);AddCmbTagNumber(TagNumber[i]);}ShowList(String.Format("Modulate.FSK,TagCount:{0},TagNumber:{1}",TagCount,TagNumber[i]));}}else{ShowList("InventoryLose!NoTagNumber");}}else{}}}如图6.14所示:图6.14以上即为开发全过程,对应的串口操作的函数说明请参见位于J*200E*Document\J*2**PCSoftware\二次开发包\HF_ISO15693\应用手册文件夹下的ISO15693DLL.dll文档说明.doc五、实验测试连接设备后上电,保证读写器能正常工作1、寻单卡Inverntory如下图,点击Open翻开串口后,选择Inventory指令,点击Run按钮即可寻到卡片,如图6.15,Inventory指令为寻单卡指令,故读写器上只能放置一卡片,多了会提示读卡失败图6.152、自动寻多卡AutoInventory如下图,点击AutoInventory指令后,点击AutoRun即可启动循环寻多卡指令,读写器上放任意卡片均可读出数据,此时AutoRun上的文字会变为StopRun,再次点击即可关闭循环寻多卡,如图6.16图6.163、读取单个数据块ReadSingleBlock如下图,选中ReadSingleBlock后,在Tags标签集合中选中想读取的标签,在Parameter窗口中,设置读取数据的起始地址,即为StartAdress,为整数且大于0读取数据块的字节数固定为4个字节,设置好起始地址后点击Run按钮即可读取到数据,读取到的数据会显示在Resulte中,如图6.17图6.174、读取多个数据块中的数据ReadMultipleBlock同读取单个数据块的步骤一样,在最后在BlockCount,即读取的数据块的多少,例如2即为从起始地址为多少的未知读取两个数据块的数据,如图6.18所示图6.185、写入数据到单个数据块,WriteSingleBlock首先寻到卡片后,选择对应的卡片,设定好要写入的地址块,在WriteData中输入要写入的数据,写入的数据为4个字节的16进制数据,请确保输入正确,例如12345678,设定好后,选择WriteSingleBlock,点击Run按钮即可,如图6.19所示:图6.19可以通过读取相应的地址块来查看是否写入成功6、使*一卡片静默,StayQuiet选中StayQuiet,选择要静默的卡片,之后点击Run按钮即可,注,静默之后的卡片读写器无法识别到,需要重置后才可以使用,后面会介绍到重置的功能如图6.20所示图6.20
7、使一或多卡片重置准备状态,ResettoReady选中ResettoReady后,选择卡片,或者不选择卡片均可,在Reset中选择一种重置方式,有四种,详情参照ISO15693DLL说明文档.doc文档说明,点击Run即可恢复到正常状态,如图6.21所示:图6.21六、实验总结 通过本实验,实验人员能了解ISO15693标准下面常用的可选的指令功能、使用方法和提高判断指令执行结果的能力,通过编程使用ReadMultipleBlock指令,加强对电子标签存储空间构造的理解。 整个实验源文件,位于J*200E*Document\J*2**PCSoftware\C*\E*periment_C*文件夹里面的ISO15693_Reader.rar压缩文件里面,可供参考。ISO15693标准相关的其余可选指令,由于它们不是经常使用,而且这些可选指令需根据具体厂家生产的具体标签的数据手册做对应的设置才能很好的执行,才能实现相应的功能。因此,在此不对它们进展相关的实验。实验七UHF900MISO18000-6实验读写ISO18000-6协议标签的读写器是U
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西同文职业技术学院《文献信息检索与利用》2025-2026学年期末试卷
- 苏州大学应用技术学院《投资分析决策》2025-2026学年期末试卷
- 沈阳医学院《卫生信息技术基础》2025-2026学年期末试卷
- 上海行健职业学院《新中国史》2025-2026学年期末试卷
- 太原城市职业技术学院《国际商务》2025-2026学年期末试卷
- 上海民航职业技术学院《大学生劳动教育教程》2025-2026学年期末试卷
- 山西经贸职业学院《工程电磁场》2025-2026学年期末试卷
- 沈阳建筑大学《刑法学》2025-2026学年期末试卷
- 沈阳体育学院《抽样方法》2025-2026学年期末试卷
- 上海旅游高等专科学校《教育社会学》2025-2026学年期末试卷
- T/CI 467-2024复合集流体(铜箔)
- 《赤壁之战》课本剧剧本:感受三国英雄的壮志豪情
- 《平顶山平煤神马集团公司成本管理现状、问题及完善对策》7100字
- 电梯年度维修保养项目及要求
- 《经络与腧穴》课件-腧穴
- 2017-2021年安徽专升本考试英语真题卷
- 《百威啤酒定位分析》课件
- 号道路穿越天然气管道施工组织方案
- 安惠产品讲座
- 纪检干部业务培训
- 2024秋期国家开放大学专科《企业法务》一平台在线形考(任务1至4)试题及答案
评论
0/150
提交评论