基于单片机的条形码数据采集系统的设计_第1页
基于单片机的条形码数据采集系统的设计_第2页
基于单片机的条形码数据采集系统的设计_第3页
基于单片机的条形码数据采集系统的设计_第4页
基于单片机的条形码数据采集系统的设计_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

基于单片机的条形码数据采集系统的设计基于单片机的条形码数据采集系统的设计基于单片机的条形码数据采集系统的设计摘 要条形码技术最早出现于二十世纪四十年代,是将一组条、空及其对应字符按一定编码规则排列,用来表示一组信息的图形标识。随着计算机应用技术的发展,条形码技术也在商业、邮政、工业生产、交通运输等领域发挥着愈来愈重要的作用。现有的条形码采集设备大多需要与计算机设备相连才能使用,在需要便携采集数据的场合下无法使用。为了解决这个问题,本设计研究实现了一个基于单片机的可携带便携式条形码采集设备以及与该设备配套的PC上位机程序。此设备可以应用于需要便携式采集条形码的场合,并且可以利用上位机程序实现条形码的增、删、改、查等操作。该设备基于单片机与条形码识别模块,以EEPROM为存储介质,通过串口与上位机进行通信。设备的第一种模式为条形码识别模块采集到条形码数据后通过串口发送到单片机,单片机将接收到的数据显示在LCD1602液晶显示器上,并通过按键来实现条形码数据的存储及查询;第二种模式为条形码识别模块采集带条形码数据后通过串口发送到上位机程序,上位机程序实现条形码数据的增、删、改、查。本设备的两种模式实现了传统设备与便携设备的功能,且具有体积小、操作方便、功耗小等优点,可适用于多种场合。关键词:条形码采集,单片机,上位机注:本设计(论文)题目来源于教师的国家级(或省部级、厅局级、校级、企业)科研项目,项目编号为:。AbstractBarcodetechnologyfirstappearedinthe1940s.Itisagraphicidentifierthatrepresentsasetofinformationbyarrangingasetofbars,spacesandtheircorrespondingcharactersaccordingtocertaincodingrules.Withthedevelopmentofcomputerapplicationtechnology,barcodetechnologyisplayinganincreasinglyimportantroleinthefieldsofcommerce,postal,industrialproduction,transportationandsoon.Mostoftheexistingbarcodecollectiondevicesneedtobeconnectedtoacomputerdevicetobeused,andcannotbeusedwhenportabledatacollectionisrequired.Inordertosolvethisproblem,thisdesignresearchrealizesaportablebarcodecollectiondevicebasedonsinglechipmicrocomputerandaPChostcomputerprogrammatchedwiththedevice.Thisdevicecanbeappliedtotheoccasionswhereportablebarcodecollectionisrequired,andtheuppercomputerprogramcanbeusedtorealizetheoperationsofadding,deleting,changingandcheckingthebarcode.Thedeviceisbasedonasinglechipmicrocomputerandabarcoderecognitionmodule,andusesEEPROMasastoragemediumtocommunicatewiththehostcomputerthroughaserialport.Thefirstmodeofthedeviceisthatthebarcoderecognitionmodulecollectsthebarcodedataandsendsittothesingle-chipmicrocomputerthroughtheserialport.Thedatareceivedbythesingle-chipmicrocomputerisdisplayedontheLCD1602liquidcrystaldisplay,andthebarcodedataisstoredandqueriedbythebutton;thesecondmodeAfterthebarcoderecognitionmodulecollectsthebarcodedata,itsendsittothehostcomputerprogramthroughtheserialport,andthehostcomputerprogramrealizestheaddition,deletion,modificationandcheckofthebarcodedata.Thetwomodesofthedevicerealizethefunctionsofthetraditionaldeviceandtheportabledevice,andhavetheadvantagesofsmallsize,convenientoperation,lowpowerconsumption,andthelike,andcanbeappliedtovariousoccasions.Keywords:BarCodeScquisition,SingleChipMicrocomputer,UpperComputer目 录1绪论 31.1题目背景及意义 31.2条形码研究现状 31.3论文构成 52单片机部分的设计 62.1硬件设计 62.1.1硬件总体设计 62.1.2最小系统模块 72.1.3条形码采集模块 132.1.4LCD1602液晶显示模块 142.1.5存储模块 172.1.6按键模块 192.2软件设计 202.2.1软件总体设计 202.2.2开发平台 212.2.3主函数 212.2.4条形码数据传输 222.2.5条形码数据显示 242.2.6存储程序 252.2.7按键程序 263上位机部分的设计 303.1上位机程序总体设计 303.1.1开发平台 303.1.2软件总体设计 303.2上位机开发技术基础 303.2.1C#语言 303.2.2Windows窗体应用 313.3串口模块 323.3.1串口扫描函数 333.3.2串口打开及关闭函数 343.3.3发送及接收数据函数 353.4显示模块 363.5数据操作模块 373.5.1条形码数据的结构 373.5.2数据保存的格式——JSON 373.5.3添加或修改数据 373.5.4查询数据 413.5.4删除数据 424系统测试 444.1单片机部分测试 444.1.1显示测试 444.1.2储存测试 444.2上位机部分测试 454.2.1显示测试 454.2.2添加测试 454.2.3修改测试 464.2.4查询测试 474.2.5删除测试 485设计总结 495.1结论 495.2遇到的困难 495.3进一步的设计 50参考文献 51致谢 52附录A 53附录B 541绪论1.1题目背景及意义随着条形码技术与计算机应用技术的发展,相对于早期的条形码技术,现在的条形码自动识别技术具有可靠准确、灵活实用、设备简单、易于制作和经济便宜等优点[1],也因此成为迄今为止最经济、实用的一种自动识别技术。现在的条形码技术被广泛应用于各个领域和行业,其中包括零售业、物流与仓储、图书管理、工业控制[2]以及电子产品等等。相信随着条形码技术及市场需求的发展,会有越来越多的领域和场合需要应用条形码技术。在这种发展前提下,条形码数据的采集也就尤为重要。随着条形码应用越来越广泛,传统条形码识别设备必须连接pc以及成本高的劣势日益凸显。针对此问题,本设计旨在实现一种多功能的便携式条形码数据采集设备,该设备可适用于多种场合,为不同情形下的条形码采集提供可靠的识别与储存方案。1.2条形码研究现状早在上世纪四十年代,最初的条形码构想由NormanJosephWoodland和BernardSilver提出。他们提交了“分类设备和方法”专利申请,其中描述了线性和牛眼印刷图案,以及阅读代码所需的机械和电子系统。该系统于1952年10月7日申请了美国专利。在1959年从麻省理工学院获得硕士学位后,DavidCollins为了解决自动识别铁路车辆的问题,他开发了一个名为KarTrak的系统,使用蓝色和红色反光条纹连接到汽车的侧面,编码一个六位数的公司标识符和一个四位数的汽车编号。从条纹反射的光被送入两个光电倍增管中的一个,过滤为蓝色或红色。波士顿和缅因州铁路公司于1961年在他们的碎石车上测试了KarTrak系统。测试一直持续到1967年,当时美国铁路协会(AAR)选择它作为整个北美舰队的标准自动车识别系统。这些装置始于1967年10月10日。随着铁路系统的日趋成熟,DavidCollins前往管理层寻找资金,用于为其他行业开发黑白版本的代码[3]。因为管理层拒绝了他的要求,DavidCollins随后退出了西尔韦尼亚并组建了计算机识别公司。作为其最初的创新,该公司在其系统中使用白炽灯泡,用氦氖激光器代替它们,并且还装有镜子,使其能够在扫描仪前方几英尺处找到条形码。这使整个过程更加简单和可靠,并且通常使这些设备能够通过识别和读取完整部分来处理损坏的标签。在20世纪70年代中期,NAFC建立了美国超市关于统一杂货-产品代码的特设委员会,为条形码开发制定了指导方针。此外,它还创建了一个符号选择小组委员会,以帮助标准化该方法。他们与咨询公司麦肯锡公司合作,开发了一个标准化的11位数代码,用于识别产品。委员会随后发出了一份合同招标书,以开发条形码系统来打印和阅读代码。各招标公司研究了各种各样的条形码方法,包括线性码,RCA的靶心同心圆码,星爆模式等。在1973年4月3日,IBM设计的UPC被选为NAFC标准,以此为基础建立了UPC条码系统,并全面实现了该码制标准化,为条形码起飞奠定了基础。IBM为未来的行业要求设计了五个版本的UPC符号系统:UPCA,B,C,D和E。UPC-A和UPC-E条形码的数量受到用于创建它们的标准的限制。UPC-A:(每个左数字10个可能值^6个左数字)×(每个数字10个可能值^5个右数字)=100,000,000,000。UPC-E:(每个数字10个可能的值^6个数字)×(每个UPC-E数字有2个可能的奇偶校验模式)=2,000,000。1974年在俄亥俄州特洛伊的马什超市,一包箭牌口香糖是第一个使用条形码扫描仪销售的零售产品。到1984年,美国33%的杂货店配备了条形码扫描仪[4]。欧洲12国正式成立了欧洲物品编码协会(简称EAN,此后EAN己经发展成为一个国际性组织,故改名为“国际物品编码协会”,简称IAN)在UPC条形码的基础上制定出欧洲物品编码标准版(EAN-13)和缩短版(EAN-8),并签署了“欧洲物品编码”协议备忘录,通用于全世界。当前的国际条形码质量规范是ISO/IEC15416(线性)和ISO/IEC15415(2D)[5]。此后,条形码不断发展,为了提高条码符号的信息密度,不同种类的条形码被设计出来,如39码、93码和128码等。至此,条形码逐渐由线性码发展到二维码。线性条形码通常包含任何类型的文本信息。相比之下,二维条码更复杂,可以在代码中包含更多信息:价格,数量,网址或图像。二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。堆叠式/行排式二维条码形态上是由多行短截的一维条码堆叠而成;矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1”,用“空”表示二进制“0”,“点”和“空”的排列组成代码[6]。二维码的原理可以从矩阵式二维码的原理和行列式二维码的原理来讲述。线性条形码扫描仪无法读取2D条形码,需要使用图像扫描仪来读取嵌入在2D条形码中的信息。带有摄像头的手机,以及许多其他设备,可以通过集成摄像头读取2D条形码。目前常见的二维码有PDF417、QRCode、Code49、Code16K等。在二维码标准化研究方面,国际自动识别制造商协会(AIM)、美国标准化协会(ANSI)已完成了PDF417、QRCode、Code49、Code16K、CodeOne等码制的符号标准。1.3论文构成本设计的目的是实现条形码数据的采集、传输、显示及存储,并设计出具有经济、实用、方便等优点的成条形码数据采集系统。本设计主要内容为:1、第一章的内容为条形码数据采集系统的设计背景、目的以及条形码目前的研究现状,对条形码数据采集有一个初步的认识了解。2、第二章的内容为单片机部分的硬件及软件设计。第一部分为总体设计,第二部分为各个模块的设计与实现。3、第三章的内容为上位机部分。本设计在VisualStudio2017平台上开发基于C#的Winform上位机程序。4、第四章的内容为系统测试。测试内容主要为样机测试及程序调试。5、第五章的内容为本设计的总结,对条形码数据采集系统的分析总结。2单片机部分的设计2.1硬件设计2.1.1硬件总体设计条形码数据采集系统的单片机部分主要分为五个模块:最小系统、条形码采集、数据显示、断电存储、按键。单片机的电源部分采用USB供电的形式。工作原理大致如下:采集模块识别条形码后通过串口将数据传到最小系统模块,单片机进行处理后将数据保存到一个字符串数组,再通过IO口将数据显示到LCD1602液晶屏上,与此同时,通过多个按键来实现条形码数据的保存,查询和删除。此外,单片机通过CP2102模块与上位机进行串口通信。系统框图如图2.1所示。图2.1单片机系统框图最小系统模块的MCU选用STC公司生产的STC89C52RC单片机,这是一种新一代高速/低功耗/超强抗干扰的CMOS8位微控制器[7]。条形码采集模块采用微型条形码采集模块,显示模块为LCD162液晶显示器。CP2102模块实现了URAT转USB的通信功能,功能十分强大,无需外接电路,还有LED灯提示串行口的是否有数据正在传输。系统原理图在Protues软件上绘制。Proteus是著名的EDA工具(仿真软件),从原理图绘制、代码调试、仿真到PCB设计,真正实现了从概念到产品的完整设计,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。原理图绘制过程如下:1、设置图纸大小2、从器件库选择器件进行放置,或者自行绘制器件入库后放置3、对放置器件的属性进行设置4、严格按照电路图进行连线5、保存后按照一定制式输出原理图虽然Protues具有完善的仿真功能,但是出于对结果的直观展示及条形码采集模块的使用,本设计采用单片机实验板来进行软件调试。实验板型号为普中科技HC6800-EM3v2.2,该实验板具有多种模块,能实现各种功能,无需自己焊接实验板,方便快捷。实验板与条形码识别模块和LCD1602模块的连接实物图如图2.2所示。图2.2实验板实物图按照电路图用杜邦线连接各个模块后就可以进行单片机软件进行测试,详细的测试测试内容在第四章。2.1.2最小系统模块设计的单片机最小系统主要包括STC89C52芯片,晶振电路和复位电路。最小系统原理图如图2.3所示。图2.3最小系统原理图1、STC89C52芯片MCS-51是Intel公司推出的一个单片机系列,这一系列的单片机以其经典的结构,特殊功能寄存器的管理方式,灵活的位操作和面向控制的指令系统[8],为单片机的发展打下了良好的基础。STC公司MCS-51的基础上做了许多改进,使得STC89C52单片机无论在加密机制还是拓展功能上都比传统的51单片机优良许多。STC89C52系列单片机指令代码完全兼容传统8051,12时钟/机器周期和6时钟/机器周期可以任意选择,有全球唯一ID号,加密性好,抗干扰强。主要特性如下:(1)工作电压:5.5V~3.3V(2)工作频率范围:0~40MHz,实际工作频率可达48MHz(2)ROM:8KB可反复擦写Flash;RAM:512字节(3)32个通用双向I/O口(4)内带4K字节EEPROM存储空间(5)共3个16位定时器/计数器(定时器T0、T1、T2)(6)4个外部中断(7)1个通用全双工异步串行口(UART)(8)ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器和仿真器,可通过串口直接下载用户程序(9)PDIP封装(10)多种工作模式:掉电模式(可由外部中断唤醒)、空闲模式和正常模式STC系列单片机的优点有:(1)加密性强(2)高抗静电(ESD保护),轻松过2KV/4KV快速脉冲干扰(3)工作电压宽,不惧电源抖动(4)价格经济,功能众多STC89C52单片机引脚图如图2.4所示:图2.4STC89C52单片机引脚图各引脚功能如下:(1)电源引脚:Vcc(40脚)、GND(20脚)是单片机的电源引脚。Vcc为电源输入,接+5V电源,GND接地线。(2)时钟引脚XTAL1(19脚)、XTAL2(18脚)是单片机的时钟引脚。XTAL1为片内振荡电路的输入端,XTAL2为片内振荡电路的输出端[9]。基于8051的单片机有两种时钟方式,一种是片内时钟,需要在XTAL1、XTAL2这两个脚外接石英晶体和振荡电路,振荡电容一般为5pf~30pf;另外一种是外部时钟方式,即XTAL1输入外部时钟信号、XTAL2脚接地。(3)编程控制引脚C89C52单片机的编程控制引脚有4个,分别为:RST(9脚)、PSEN(29脚)、ALE/PROG(30脚)、EA/Vpp(31脚)。RST是单片机的复位引脚。当该引脚输入连续两个机器周期以上的高电平时使单片机复位。复位后程序计数器PC=0000H,即复位后将从程序存储器的第一个单元读取指令码,使得单片机从头开始执行程序。PSEN是程序存储器允许输出控制端,及外部程序存储器选通信号输出引脚。当读取外部程序存储器时PSEN低电平有效,以实现外部程序存储器的读取。ALE/PROG是控制单片机读取外部拓展RAM的引脚。地址锁存控制信号(ALE)是在访问外部存储器时,用来控制P0口的输出低8位地址送锁存器存起来,以实现地址和数据的隔离。当ALE是高电平时,允许地址锁存,当访问外部存储器时,ALE信号负跳变,将P0口上低8位地址信号送入锁存器[10]。在没有访问外部存储器时,ALE以晶振六分之一的固定频率输出脉冲,当访问外部存储器时,ALE以十二分之一振荡周期输出。在Flash编程时,此引脚也用作编程输入脉冲。EA/Vpp是控制拓展外部ROM的引脚。当EA为高电平的时候,单片机读取内部程序存储器,当有外部拓展ROM时,读取完内部ROM后自动读取外部ROM。EA为低电平的时候,单片机直接访问外部程序存储空间。(4)I/O口引脚STC89C52单片机有32个可编程I/O口,分成4组8位:P0、P1、P2、P3。P0(39脚~32脚):双向8位三态I/O口,每个口可以独立控制。既可作为输入输出口,也可作为地址/数据复用总线使用。当用作通用I/O口时,P0是8位准双向口,因为P0口内部无上拉电阻,所以必须外接上拉电阻,一般电阻大小为10KΩ。当用作地址/数据总线时,无需加上拉电阻,且此时P0口是一个真正的双向口。P1(1脚~8脚):P1口是准双向I/O口,内带上拉电阻。P1口作为输入使用前,要先向该口写入1,然后单片机才能正确读取外部信号。此外,P1.0引脚的第二功能为定时器/计数器2的外部输入,P1.2引脚的第二功能为定时器/计数器2的触发输入,即T2的外部控制端。P2(21脚~28脚):P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平,与P1口相似。此外,在访问外部程序存储器和16位的外部数据存储器时,P2口也可作为高八位地址线。P3(10脚~17脚):P3口是一个具有内部上拉电阻的8位双向I/O口,与P1口相似。作为第一功能使用时就当作普通I/O口,作为第二功能使用时,各引脚的定义如表2.1所示。表2.1P3口各引脚第二功能定义标号第二功能说明P3.0RXD串行输入口P3.1TXD串行输出口P3.2INT0外部中断0P3.3INT1外部中断1P3.4T0定时器/计数器0外部输入端P3.5T1定时器/计数器1外部输入端P3.6WR外部数据存储器写脉冲P3.7RD外部数据存储器读脉冲2、晶振电路最小系统模块的晶振电路如图2.5所示:图2.5晶振电路STC89C52内部有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路如图2.5所示,在XTAL1和XTAL2引脚上外接定时元件,内部振荡器就产生自激振荡[11]。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz之间选择(一般选择11.0592M,因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合),电容值在20~30pF之间选择,电容值的大小可对频率起微调的作用。11.0592M晶振Y1与单片机的18,19脚(即晶振工作的引脚)并联.22p电容C2一端接18脚,一端接地。22p电容C3一端接19脚,一端接地。这两个电容,我们在10~30P之间选择都是可以的,主要作用是,过滤掉晶振部分的高频信号,让晶振工作的时候更加稳定。3、复位电路复位电路的作用是将单片机内部各电路的状态恢复到一个确定的初始值,并从这个状态开始工作。单片机的复位电路就好比电脑的重启部分,当电脑在使用过程中死机,按下重启按钮电脑内部的程序开始从头执行。当单片机系统在运行中,受到环境干扰出现程序错误时,按下复位按钮,内部程序从头开始执行。有两种类型的复位电路:上电复位和按键复位。上电复位电路使用电容充电来实现复位。上电时,RST引脚的为高电平。上电后,电容器快速充电,随着充电的进行,RST引脚的电位逐渐下降到低电平。通过验证RST引脚的高电平是否大于2个机器周期,可以实现正常复位。在按键复位电路中,当没有按下按钮时,它是与电源复位电路相同的电路。如果用户在MCU工作时按下复位按键,则RST引脚上的电位立即变为高电平,因为已经充电的电容器通过电阻器环路快速放电,并一直保持到释放按钮为止,以满足微控制器复位的条件。按键复位电路如图2.6所示。图2.6按键复位电路2.1.3条形码采集模块本设计的条形码采集模块使用微雪电子公司出产的型号为BarcodeScannerModule的微型条形码数据识别模块。此条形码扫描识别模块通过图像智能识别算法,可快速准确地读取纸质或屏幕上的一维码及二维码。体积小巧,板载USB和UART接口,既可直接接入计算机使用,也可集成到各种设备中。产品特性:(1)操作简单,无须了解复杂图像识别算法(2)支持Barcode,QR等通用一维码及二维码的识读(3)板载microUSB和UART串口,可接入计算机或嵌入式设备使用(4)支持通过扫描设置码来对模块参数进行设置(5)板载辅助光源,能够在完全黑暗的环境中进行识读产品参数:(1)工作电压:5V(2)工作电流:135mA(扫描),58mA(待机),2mA(休眠)(3)工作温度:0°C~60°C(4)工作湿度:5%~95%(不凝结)(5)通信接口:UART、USB(6)支持一维码类型:Codebar、Code11、Code39/Code93、UPC/EAN、Code128/EAN128、Interleaved2of5、Matrix2of5、MSICode、Industrial2of5、GS1Databar(RSS)(7)支持二维码类型:QRcode、DataMatrix、PDF417(8)辅助光源:白光(9)识读角度:旋转360°,倾斜±65°,偏转±60°(10)视场角度:28°(水平),21.5°(垂直)(11)产品尺寸:53.3mm×21.4mm条形码识别模块将识别到的条形码数据通过串口传送到单片机,由单片机进行数据处理。模块如图2.7所示。图2.7微雪条形码识别模块条形码采集模块电路原理图如图2.8所示:图2.8条形码采集模块电路原理图2.1.4LCD1602液晶显示模块本设计将条形码采集模块通过串口传送的数据显示到LCD1602液晶显示屏上,实现条形码数据的便携显示。1、LCD1602液晶显示器LCD1602是一种工业字符型液晶,主要原理是利用液晶的物理特性,以电流刺激液晶分子产生点、线、面并配合背部灯管即可以显示出图形[12]。各种型号的液晶通常是按照显示字符的行数或液晶点阵的行、列数来命名的。LCD1602的意思是每行显示16个字符,一共可以显示两行,共32个字符。这类液晶通常都是字符型液晶,即只能显示ASCII码字符,如数字大小写字母和各种符号等。LCD1602尺寸图如图2.9所示。图2.9LCD1602尺寸图LCD1602液晶显示器的主要技术参数如表2.2所示。表2.0LCD1602主要技术参数显示容量16*2个字符工作电压4.5~5.5V工作电流2.0mA(5.0V)最佳工作电压5.0V字符尺寸2.95*4.35(WXH)mmLCD1602各引脚接口功能说明如表2.3所示。表2.3LCD1602各引脚功能说明引脚符号功能说明1VSS电源地2VDD电源正极3VL液晶显示偏压信号4RS数据/命令选择端(H/L)5R/W读/写选择端(H/L)6E使能信号7DB0DataI/O8DB1DataI/O9DB2DataI/O10DB3DataI/O11DB4DataI/O12DB5DataI/O13DB6DataI/O14DB7DataI/O15BLA背光源正极16BLK背光源负极LCD1602的读写时序如图2.10,图2.11所示:图2.10读操作时序图图2.11写操作时序图2、显示电路设计LCD1602的数据引脚和单片机的P0口连接,并选用10K的上拉排阻。控制引脚RS、R/W、EN分别与单片机的P2.0、P2.1、P2.2进行连接。将滑动变阻器与电源、地和VL引脚连接,所以可以通过调节滑动变阻器的电阻值来调节屏幕的亮度。电路原理图如图2.12所示。图2.12显示电路原理图2.1.5存储模块本设计采用AT24C02EEPROM作为条形码数据的存储介质,通过I2C总线接口进行读写操作,实现条形码数据的存储,读取和删除。1、AT24C02AT24C02是美国Atmel公司生产的低功耗CMOS型EEPROM,内含256*8位存储空间,被广泛应用于低电压及低功耗的工商业领域。此外,AT24C02有一个16字节页写缓冲器,采用I2C总线式进行数据读写的串行操作,占用很少的资源和I/O口。主要特性如下:(1)工作电压:1.8V~5.5V(2)二线串行接口(3)输入引脚经施密特触发滤波抑制噪声(4)双向数据传输协议(5)支持硬件写保护优点有:(1)工作电压宽(2)高可靠性:擦写次数可达10000次(3)写入速度快(4)抗干扰能力强,数据不易丢失(5)体积小AT24C02的引脚功能如表2.4所示:表2.4AT24C02引脚说明引脚功能时钟信号引脚(SCL)串行时钟输入引脚,用于产生器件所有数据操作的时钟数据输入/输出引脚(SDA)双向数据/地址引脚,用于器件所有数据的传输地址引脚(A0,A1,A2)器件地址输入端写保护引脚(WP)当该引脚接地时,允许器件读写;当接电源是,启动写保护功能2、I2C总线I2C总线是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,只需两根线就可以在连接于总线上的器件之间传送信息,多用于连接微处理器及其外围芯片[13]。I2C总线的主要特点是接口方式简单,两条线可以挂多个参与通信的器件。(1)I2C工作原理:主设备用于启动数据的总线传输并生成时钟以打开需要传输的设备。在这种情况下,所有被寻址的设备都被视为从设备。在总线上发送和接收的主设备和从设备之间的关系不是固定的,而是取决于此时数据传输的方向。当主设备想要向从设备发送数据时,它首先寻址从设备然后主动发送数据,最后主设备结束数据传输。如果它想接受从设备的数据,则有主机寻址从机,然后主机接收从机发送的数据,最后主机结束接收过程。(2) I2C通信时序:I2C通信时序图如图2.13所示。图2.13I2C通信时序图起始信号:I2C通信的起始信号的定义是在SCL高电平期间,SDA由高电平向低电平变化产生了一个下降沿,以此表示起始信号,如图2.13中的Start部分所示。主机发出一字节的从机地址:最低位为读写控制码(0为写,1为读),高七位为从机地址。从机发出应答信号:应答信号分为两种情况:一种是主机每写完一字节数据,从机就在下一个时钟周期拉低SDA;另外一种是主机每读完一字节数据,主机在下一个时钟周期拉低SDA。数据传输:I2C没有固定的波特率,但存在时序要求。发送器必须首先保持SCL为低电平并改变数据线SDA输出当前要传输的数据的一位。当SCL为高电平时,SDA不允许变化。因为接收器想要读取当前SDA电平信号是0还是1,所以必须确保SDA的稳定性。如图2.13中的每一位数据都是在SCL的低电平位置时变化。8位数据位后边跟着的是一位应答位。停止信号:I2C通信停止信号的定义是在SCL高电平期间,SDA由低电平向高电平变化产生了一个上升沿,以此表示结束信号,如图2.13中的Stop部分所示。3、存储模块电路原理图图2.14存储模块电路原理图其中SCL引脚接单片机的P2.3,SDA引脚接单片机的P2.4。2.1.6按键模块在此模块中,按键模块实现清屏、存储条形码、查询条形码、删除条形码的功能。硬件部分选择独立按键,一端接单片机的I/O口,一端接地。当按键没有按下时,电路不通,对应I/O口为高电平;当按键按下时,电路导通,对应I/O口为低电平。因为硬件误差,所以在进行按键程序中要进行软件消抖处理。按键模块电路原理图如图2.15所示:图2.15按键模块电路原理图2.2软件设计2.2.1软件总体设计为实现条形码数据的采集、显示、储存与删除,单片机程序设计主要分为以下几个方面:1、初始化串口,条形码采集模块通过串口传输条形码数据,在串口中断服务程序中将条形码数据存入一个字符串数组;2、初始化LCD1602液晶,将字符串数组里的数据显示出来;3、判断K1~K4的值,并执行相应的按键程序。其中,为了更简洁的编写程序,本设计采用多文件的形式进行整个单片机软件的编写。主文件包括主函数、串口相关程序、按键函数和延时函数等。lcd.c文件包括初始化程序、写命令程序和写数据程序等LCD1602操作程序。i2c.c文件包括起始程序、停止程序、读写字节程序和读写指定地址数据程序等。单片机程序工作流程图如图2.16所示:图2.16单片机程序流程图2.2.2开发平台在本设计中,使用KeilμVision4作为单片机软件开发的平台。1、KeilμVision4的产品特征:(1)多窗口和灵活的窗口管理系统(2)可以显示外设寄存器的信息(3)具有调试还原视图并可以保存多个调试窗口(4)简化多项目工作区2、KeilμVision4的优点:(1)集编辑,编译,仿真等于一体,多语言的程序设计(2)界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。2.2.3主函数主函数需要实现的功能是初始化串口和LCD1602,并保持液晶屏的第一行持续显示“BARCODE”这一字符串。此外,通过死循环来监听按键是否按下以及条形码识别模块是否有传送新的条形码数据进来。因此,主函数如下所示:voidmain(void){ LcdInit(); //LCD1602初始化 UsartInit();//串口初始化 LCD_Write_String(0,0,"BARCODE");//液晶屏的第一行持续显示BARCODE while(1) { LCD_Write_String(0,0,"BARCODE"); if(another_flag)//若有新的条形码数据传入 { LCD_Write_String(0,1,str);//在液晶屏的第二行显示条形码 i=0; another_flag=0; } keypros();//监听按键是否按下 } }2.2.4条形码数据传输微雪条形码识别模块将扫描到的条形码数据通过串口传送到单片机串口的缓冲区,单片机再将数据存到一个字符串数组。因为接收和发送触发的是同一个串口中断,所以在串口中断函数中就必须先判断是哪种中断,然后再做出相应的处理。1、串口基础知识51单片机的UART串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成。SCON寄存器的功能描述如表2.5所示。表2.5SCON寄存器说明位符号功能说明7SM0第7位和6位共同决定了串口通信的4种模式:模式0~模式3。6SM15SM2多机通信控制位4REN允许串行接收位3TB8模式2,3中发送数据的第9位2RB8模式2,3中接收数据的第9位1T1发送中断标志位0R1接收中断标志位在本设计中选用模式1,及SM0=0,SM1=1。模式1是10位数据的异步通信,包括1位起始位,8位数据位和1位停止位。此外,波特率设置为4800。串口初始化的步骤为:(1)配置串口为模式1,即SCON=0X50;(2)配置定时器T1为模式2(自动重装模式),即TMOD=0X20;(3)根据波特率计算TH1和TL1的初值;(4)打开定时器控制寄存器TR1,启动T1;(5)串行口工作在中断方式时,要进行中断设置。2、串口初始化程序voidUart_Init(){ SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,波特率是为4800 TL1=0XF3; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器}3、串口中断服务程序voidUart()interrupt4{ if(RI)//判断是接收中断产生{ Temp=SBUF;//读入缓冲区的值 RI=0;//标志位清零 if(i<13) { str[i]=Temp; i++; } another_flag=1;}SBUF=Temp; //把接收到的值再发回 while(!TI);//如果是发送标志位,清零TI=0;}2.2.5条形码数据显示本设计中采用LCD1602来显示接收到的条形码数据。显示模块的程序主要对LCD1602的三个引脚进行控制,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号)。此模块的编程主要是由图2.10和图2.11的操作时序来进行液晶屏初始化,写命令和写数据。1、初始化函数voidLcd_Init() //LCD初始化子程序{ LcdWriteCom(0x38);//开显示 LcdWriteCom(0x0c);//开显示不显示光标 LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//设置数据指针起点}2、显示字符串函数voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s) { if(y==0) { LcdWriteCom(0x80+x);//表示第一行 } else { LcdWriteCom(0xC0+x);//表示第二行 } while(*s) { LcdWriteData(*s); //写入字符串 s++; }}2.2.6存储程序本设计的存储模块使用I2C总线接口的EEPROM——AT24C02。I2C是一个通信协议,它拥有严密的通信时序逻辑要求,所以要根据其时序来编写程序。1、在指定地址写数据voidAt24c02Write(unsignedcharaddr,unsignedchardat){ I2cStart(); I2cSendByte(0xa0);//发送写器件地址 I2cSendByte(addr);//发送要写入内存地址 I2cSendByte(dat); //发送数据 I2cStop();}2、读取指定地址的数据unsignedcharAt24c02Read(unsignedcharaddr){ unsignedcharnum; I2cStart(); I2cSendByte(0xa0);//发送写器件地址 I2cSendByte(addr);//发送要读取的地址 I2cStart(); I2cSendByte(0xa1);//发送读器件地址 num=I2cReadByte();//读取数据 I2cStop(); returnnum; }2.2.7按键程序按键程序用于对保存在字符串数组的条形码数据进行操作。voidkeypros(){ if(k1==0) //清屏程序 { Delay1ms(5);//消除抖动一般大约10ms if(k1==0) //再次判断按键是否按下 { LcdWriteCom(0x01);//发送清屏指令 } while(!k1); //检测按键是否松开 } if(k2==0) //存储当前字符串数组内的数据 { Delay1ms(5); if(k2==0) { save_flag=At24c02Read(1); //获取当前存储条形码的个数 if(save_flag==15) //超过15个不能增加 { LCD_Write_String(0,1,"storagefull!"); return; } for(m=13*save_flag;m<13*save_flag+13;m++)//当前储存个数*13即可得到存储地址 { At24c02Write(m,str[x]); LCD_Write_String(0,1,str); x++; } save_flag++; //存储个数加一 At24c02Write(1,save_flag); //写入新的存储个数 x=0; } } if(k3==0) { Delay1ms(5); if(k3==0) //显示当前存储的条形码 { save_flag=At24c02Read(1); //获取当前存储条形码的个数 if(save_flag!=0&&save_flag>=1) { for(n=13*k;n<13*k+13;n++)//从头到尾循环显示已经存储的条形码 { str[x]=At24c02Read(n); x++; } LCD_Write_String(0,1,str); //送到1602显示 x=0; } k++; if(k==save_flag) //显示到最后一个时返回第一个 { k=1; } } } if(k4==0) { Delay1ms(5); if(k4==0) //从最后一个开始删除条形码 { if(save_flag!=1) //若条形码个数不为1,删除最后一个 { save_flag=At24c02Read(1); save_flag--; At24c02Write(1,save_flag); } if(save_flag<1) //若条形码个数小于1,设置当前可存储的位置为1 { save_flag=1; At24c02Write(1,save_flag); } } while(!k4); }}3上位机部分的设计3.1上位机程序总体设计3.1.1开发平台本设计的上位机程序部分在VisualStudio2017平台上开发。VisualStudio2017是微软于2017年3月8日正式推出的新版本集成开发环境,可用于编辑、调试并生成代码,然后发布应用[14]。集成开发环境(IDE)是一个功能丰富的程序,可用于软件开发的许多方面。除了大多数IDE提供的标准编辑器和调试器之外,VisualStudio还包括编译器、代码完成工具、图形设计器和许多其他功能,以简化软件开发过程。VisualStudio2017主要特性:(1)具有高效的辅助功能,能协助开发者编写程序(2)具有极佳的拓展性,适应各种开发项目,提高工作效率并满足工作流需求(3)具有强大的Debug功能,错误列表能显示所有的错误使开发者能快速修复问题,直达问题核心并找到修复方法(4)完美屏幕布局:可以保存并应用最适合特定计算机或任务的自定义屏幕布局(5)协作编码:以任何所需方式轻松协同工作3.1.2软件总体设计为实现上位机程序与单片机的串口通信及条形码数据的增、删、改、查,上位机程序设计主要分为以下几个方面:1、设计窗体程序的框架,为窗体添加文本框、下拉列表和按钮等控件;2、通过串口组件开发程序,使单片机和上位机能进行串口通信;3、将需要显示或者输入的条形码数据在文本框内进行操作;4、条形码数据以JSON格式存入Txt文档内。3.2上位机开发技术基础本设计的上位机程序采用基于C#的windows窗体程序开发。3.2.1C#语言C#(读作“SeeSharp”)是一种简单易用的新式编程语言。C#是从C语言系列发展而来,并且是一种面向对象的语言。此外,C#支持面向组件的编程。当代软件设计越来越对自描述的、独立的功能包形式的软件组件有依赖性。这样的组件的主要特征包括:提供了编程模型的属性,方法和事件;包含有关组件的声明性信息的函数以及您自己的文档。C#提供了一个语言构造来直接支持这些概念,所以C#是一种用于创建和使用软件组件非常方便有效的语言。有一些C#功能,可帮助创建可靠耐用的应用:垃圾收集自动释放无法访问的未使用的对象占用的内存;异常处理提供了结构化的方法来进行错误检测和恢复。C#语言的类型安全设计防止读取未初始化的变量、索引范围之外的数组以及执行未检查的类型转换。C#使用统一类型系统。所有C#类型从父对象类型继承。因此,所有类型的具有共同的操作集合,并且每个类型可以一致地存储,传送和处理。此外,C#还支持自定义引用类型和值类型来支持对象动态分配和轻量级结构的内联式存储。3.2.2Windows窗体应用WindowsForms是基于.NETFramework的智能客户端开发技术。.NETFramework是一组托管库,可简化常见的应用程序任务,如读取和写入文件系统。如果使用VisualStudio等开发环境,则可以创建Windows窗体的SmartForms应用程序,以显示信息,请求用户输入以及通过网络与远程计算机进行通信。在Windows窗体中,窗体是一个可视界面,可以在其上向用户显示信息。通常,可以通过向窗体添加控件以及开发对用户操作(如鼠标点击或按键)的响应来创建Windows窗体应用程序。控件是显示数据或接受数据输入的离散用户界面元素(UI元素)。当用户对窗体或其中某个控件执行某些操作时,该操作会生成一个事件。应用程序通过代码响应这些事件,并在事件发生时对其进行处理。Windows窗体包含一组可以添加到窗体的控件:显示文本框、按钮、下拉框、单选按钮甚至网页的控件。如果现有控件不能满足开发需求,Windows窗体还支持使用UserControl类创建自定义控件。Windows窗体具有全面的UI控件,可以模拟MicrosoftOffice等高端应用程序中的功能。开发者使用ToolStrip和MenuStrip控件可以创建包含文本和图像的工具栏和可下拉菜单和承载其他控件。使用VisualStudio的Windows窗体设计器可以轻松创建Windows窗体应用程序。只需使用光标选择控件,然后将它们添加到表单上的所需位置即可。设计人员提供网格线和对齐线等工具,以便于控制对齐控件。无论是使用VisualStudio还是从命令行进行编译,都可以使用FlowLayoutPanel,TableLayoutPanel和SplitContainer控件在简化创建高级窗体布局的操作。当需要创建自己的自定义UI元素时,System.Drawing命名空间包含大量类,可直接在窗体上显示线,圆和其他形状。采用Windows窗体程序开发上位机程序的优点有:(1)窗体布局开发简便(2)具有多种控件,可以灵活的使用来完成需求3.3串口模块上位机程序需要与单片机进行串口通信,在.Netframework中提供了SerialPort类用以实现串口通信。开发者可以使用此类来控制串行端口文件资源。该类提供同步和事件驱动的I/O,对引脚和中断状态的访问以及对串行驱动程序属性的访问[15]。此外,此类的功能可以包装在内部Stream对象中,可通过BaseStream属性访问,并传递给包装或使用流的类。工作流程如下:1、扫描可用串口2、打开串口3、发送或接受数据4、关闭串口本设计中使用的SerialPort类的属性和方法如表3.1和表3.2所示。表3.1使用的SerialPort类的属性属性说明BaudRate获取或设置串行波特率。PortName获取或设置通信端口,包括但不限于所有可用的COM端口IsOpen获取一个值,该值指示SerialPort对象的打开或关闭状态。表3.2使用的SerialPort类的方法方法说明Close()关闭端口连接,将IsOpen属性设置为false,并释放内部Stream对象Open()打开一个新的串行端口连接ReadExisting()读取SerialPort对象的流和输入缓冲区中所有立即可用的字节Write(String)将指定的字符串写入串行端口3.3.1串口扫描函数串口扫描函数实现的思路是使用for循环把所有的串口都打开一遍,然后将可以成功打开的串口号添加到下拉列表中。privatevoidscanport(SerialPortMyport,ComboBoxMybox){//将可用的串口号放入ComboBox控件string[]portnum=newstring[20];stringbuffer;Mybox.Items.Clear();//清空ComboBox的内容for(inti=1;i<20;i++){ try{ buffer="COM"+i.ToString();Myport.PortName=buffer;Myport.Open();//如失败,异常处理使后面的代码不被执行portnum[i-1]=buffer;Mybox.Items.Add(buffer);//如成功,则添加此串口号 Myport.Close();Mybox.Text=portnum[i-1];//显示最后扫描成功的串口号}catch{}}} 3.3.2串口打开及关闭函数这两个函数的实现思路为通过使用SerialPort类自有的方法实现。在实现的过程中注意对打开和关闭按钮进行使能操作,防止出现逻辑错误。privatevoidopenport_Click(objectsender,EventArgse){try{ serialPort1.PortName=portnum.Text;//赋予串口组件指定的端口号 serialPort1.BaudRate=Convert.ToInt32(bundrate.Text);//赋予串口组件指定的波特率serialPort1.Open();openport.Enabled=false;//串口打开后禁止打开按钮使用closeport.Enabled=true;//串口打开后允许关闭按钮使用}catch{ MessageBox.Show("端口错误","错误");}}privatevoidcloseport_Click(objectsender,EventArgse){try{ serialPort1.Close(); openport.Enabled=true;//串口打开后允许打开按钮使用 closeport.Enabled=false;//串口打开后禁止关闭按钮使用} catch{}}3.3.3发送及接收数据函数因为本设计需要传送的数据均为字符数据,所以在实现这两个函数时只需使用SerialPort类自有的方法:Write()和ReadExisting()即可。实现思路为:从发送文本框读取数据,使用Write()将其写入串行端口。ReadExisting()方法在编码的基础上,读取

SerialPort

对象的流和输入缓冲区中所有立即可用的字节,然后将其显示到接受文本框内。privatevoidsendmessage_Click(objectsender,EventArgse)//发送数据{byte[]date=newbyte[1];//单字节发数据if(serialPort1.IsOpen)//串口打开了才能发送数据{ if(textsend.Text!="")//串口那个输入发送控件不是空的才发送{ try { serialPort1.Write(textsend.Text);//从文本框内获取字符串并写入}catch { }}}}privatevoidreceivemessage(objectsender,SerialDataReceivedEventArgse)//接受数据{textreceive.AppendText(serialPort1.ReadExisting());//串口接收数据后显示到文本框内}3.4显示模块本设计使用Textbox控件进行条形码数据的显示和输入。使用Textbox控件,用户可以在应用程序中输入文本。此控件具有标准Windows文本框控件,包括多行编辑和密码字符屏蔽中找不到的其他功能。通常情况下,Textbox控件用于显示或输入单个文本行。可以使用Multiline和ScrollBars属性,以显示或输入多行文本。在进行窗体设计时,直接拖动Textbox控件到主窗体的所需位置即可。修改完控件属性后在文本框左上角添加Label控件对文本框进行标注。本设计中使用的Textbox控件的属性和方法如表3.3和表3.4所示。表3.3使用的Textbox控件的属性属性说明Text获取或设置与此控件关联的文本ScrollBars获取或设置哪些滚动条应出现在多行TextBox控件中Name获取或设置控件的名称。表3.4使用的Textbox控件的方法方法说明AppendText(String)向文本框的当前文本追加文本Clear()从文本框控件中清除所有文本3.5数据操作模块因为条形码数据较为简单,上位机添加的信息都为字符数据,所以在本设计中并没有使用数据库,而是将条形码数据以JSON格式存入Txt文档内。3.5.1条形码数据的结构本设计中,将条形码数据定义在一个类中定义。此类中包含条形码,商品名称,价格这三个字符型数据成员。publicclassItem{publicstringBarcode{get;set;}//条形码publicstringName{get;set;}//物品名称publicstringPrice{get;set;}//价格}3.5.2数据保存的格式——JSONJSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种轻量级的文本数据交换格式。JSON类似XML,是存储和交换文本信息的语法,但是JSON比XML更小、更快,更易解析,且具有自我描述性,更易理解。在本设计中,为了方便数据的存储与读取,通过使用Newtonsoft.Json类库对条形码数据进行序列化和反序列化。在进行序列化之前,将条形码数据类以字典形式存储。其中,类中的条形码成员作为字典的键,整个类作为字典的值。进行反序列化时,将读取到的数据也存入相同格式的字典中。3.5.3添加或修改数据在此模块中,点击“添加/修改”按钮后会弹出新的窗口进行数据输入。此后可以通过点击“添加”或“修改”按钮对此条数据进行操作。新窗口如图3.1所示。图3.1添加/修改窗口详细程序如下:1、主窗口按钮程序privatevoidin_add_Click(objectsender,EventArgse){Form2f2=newForm2();//打创建新窗口f2.barcode=textreceive.Text;//将主窗口条形码文本框内的数据传到新窗口f2.Show();//跳转到新窗口}2、子窗口程序namespaceserialport2{publicpartialclassForm2:Form{publicstringbarcode;publicstringname;publicstringprice;publicForm2(){InitializeComponent();}publicclassItem{publicstringBarcode{get;set;}publicstringName{get;set;}publicstringPrice{get;set;}}privatevoidForm2_Load(objectsender,EventArgse){itembarcode.Text=barcode;//将接收到的条形码显示到文本框中}privatevoidadd_Click(objectsender,EventArgse){Itemitem=newItem();item.Barcode=barcode;item.Name=itemname.Text;item.Price=itemprice.Text;//将用户输入的数据存储到数据类中StreamReadersr=newStreamReader(@"E:/iteminformation.txt",Encoding.Default);stringstr=sr.ReadToEnd();//读取存储在txt文档内的数据sr.Close();Dictionary<string,Item>item_dict=newDictionary<string,Item>();item_dict=JsonConvert.DeserializeObject<Dictionary<string,Item>>(str);//将读取到的数据存入字典item_dict.Add(item.Barcode,item);//将新数据添加到字典中str=JsonConvert.SerializeObject(item_dict);StreamWritersw=newStreamWriter(@"E:/iteminformation.txt",false,Encoding.Default);//将字典序列化后写入文档sw.Flush();sw.Write(str);sw.Flush();sw.Close();MessageBox.Show("添加成功","成功");}privatevoidamend_Click(objectsender,EventArgse)//修改操作,与添加操作类似{Itemitem=newItem();item.Barcode=barcode;item.Name=itemname.Text;item.Price=itemprice.Text;StreamReadersr=newStreamReader(@"E:/iteminformation.txt",Encoding.Default);stringstr=sr.ReadToEnd();sr.Close();Dictionary<string,Item>item_dict=newDictionary<string,Item>();item_dict=JsonConvert.DeserializeObject<Dictionary<string,Item>>(str);if(item_dict.ContainsKey(itembarcode.Text)){item=item_dict[itembarcode.Text]asItem;item.Name=itemname.Text;item.Price=itemprice.Text;}else{MessageBox.Show("没有对应物品","错误");}str=JsonConvert.SerializeObject(item_dict);StreamWritersw=newStreamWriter(@"E:/iteminformation.txt",false,Encoding.Default);sw.Flush();sw.Write(str);sw.Flush();sw.Close();MessageBox.Show("修改成功","成功");}}}3.5.4查询数据查询数据操作与添加数据操作类似,区别在于查询操作多了判断是否存在已有数据的步骤。若有数据,则将其显示在窗口上,若无数据,则弹出错误窗口,声明不存在此数据。详细程序如下:privatevoidin_serch_Click(objectsender,EventArgse){StreamReadersr=newStreamReader(@"E:/iteminformation.txt",Encoding.Default); stringstr=sr.ReadToEnd();//读取文档中的数据sr.Close();Dictionary<string,Item>item_dict=newDictionary<string,Item>();item_dict=JsonConvert.DeserializeObject<Dictionary<string,Item>>(str);if(item_dict.ContainsKey(textreceive.Text))//若字典中存在键相同的数据,则将其显示出来{ Itemitem=newItem(); item=item_dict[textreceive.Text]asItem; itemname.Text=item.Name; itemprice.Text=item.Price;}else{ MessageBox.Show("没有对应物品","错误");}}3.5.4删除数据删除数据操作与查询数据操作类似,区别在于不显示数据以及多了删除字典里一项数据的操作,具体程序如下:privatevoidin_del_Click(objectsender,EventArgse){StreamReadersr=newStreamReader(@"E:/iteminformation.txt",Encoding.Default);stringst

温馨提示

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

最新文档

评论

0/150

提交评论