版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CentralSouthUniversityRFID课程设计学院:信息科学与工程学院班级:学号:导师:、八刖百目前,很多企业仓库管理还是停留在手工操作的基础上,这样的传统的仓库管理,一般依赖于一个非白动化的、以纸张文件为基础的系统来记录、追踪进出的货物,完全由人工实施仓库内部的管理,因此仓库管理的效率极其低下,所能管理的仓库规模也很小。随着计算机的应用普及,目前大多数企业的仓库管理数据资料已开始采用计算机数据系统管理,但数据还是采用先纸张记录、再手工输入计算机的方式进行采集和统计整理。这不仅造成大量的人力资源浪费,而且由于人为的因素,数据录入速度慢、准确率低。随着企业规模的不断发展,仓库管理的
2、物资种类机数量在不断增加、出入库频率剧增,仓库管理作业也已十分复杂和多样化,传统的人工仓库作业模式和数据采集方式已难以满足仓库管理的快速、准确要求,严重影响了企业的运行工作效率,成为制约企业发展的一大障碍。目前RFID技术正在为供应链领域带来一场巨大的变革,以识别距离远,快速,不易损坏,容量大等条码无法比拟的优势,简化繁杂的工作流程,有效改善供应链的效率和透明度。基于RFID的仓库管理系统是在现有仓库管理中引入RFID技术,对仓库到货检验、入库、出库、调拨、移库移位、库存盘点等各个作业环节的数据进行白动化的数据采集,保证仓库管理各个环节数据输入的速度和准确性,确保企业及时准确地掌握库存的真实数
3、据,合理保持和控制企业库存。通过科学的编码,还可方便地对物品的批次、保质期等进行管理。利用系统的库位管理功能,更可以及时掌握所有库存物资当前所在位置,有利于提高仓库管理的工作效率。一、实现目标在本方案中,速度、效率、正确率、信息的整合是重点追求的目标。主要在于提高仓库管理正确性、管理精度及操作的方便性;在仓库管理系统中融入RFID技术,应用货物包装、货位二种电子标签来辅助进行仓库管理,提高企业效率;最小包装单位管理,即存储的每一最小包装单位都有唯一标示,为库存精细管理提供支持;记录各种零部件入库上架、进出数量、位置等记录;在仓位标签中记录零部件变动信息(种类、数量、等),以跟踪仓库货物,提高入
4、、出、存、移的正确率,减少在日常工作中对人的依赖性,降低人为失误;在移库移仓管理上,仓管人员可根据电子标签进行货物快速定位并白动在系统中调整仓位;在库存盘点中,脱离单据提高盘点效率,不仅盘点库存数量而且盘点位置并保证货物与位置(仓位)对应得正确率,并能在平时随时进行区域盘点,在日常仓库工作中保证库存的正确,尤其可以在入出正常的时候进行盘点工作;有效区分实物库存及列帐库存,有效管理票、物时间差,方便仓库与财务对账。二、系统构成RFID系统由RFID电子标签(RFIDTag)”、读写器(天线+控制器)”、PC等高级设备”这三要素构成。RFIDTag”由可保存大量数据的IC芯片及天线构成,根据PC等
5、高级设备”的指令,保存在RFID芯片中的数据可由读写器”读取或擦写。(1)RFID电子标签内置全球唯一ID,并拥有96bit/240Bit空间存储用户定制信息;防水,防油污;使用寿命长;读取距离长,标签数据可以加密,且信息防篡改;标签可擦写,可循环利用远距离读写器采用串口与电脑通信;RFID标签非接触式的进行读取货物信息,准确率为98高。读写距离远标准、符合FCC条例;读取性能可靠。(3)管理软件仓库系统管理软件采用原有SAP管理软件结合新WCS系统,系统中标签数据的读写、相关设备的控制以及与新仓库管理软件的数据接口通过采用国际先进的RFID中间件实现。RFID中间件采用三层结构体系,即虚拟硬
6、件层、数据处理层和应用接口层。1)虚拟硬件层:通过虚拟硬件的方法实现对RFID硬件设备的参数设定和操作管理。这一层,RFID硬件控制器提供了对RFID读写器以及其它RFID设备的控制。具体有以下一些功能:支持RFID设备的在线和离线两种连接方式;RFID硬件设备的驱动以及读写控制。2)数据处理层:这一层实现了对数据的处理工作,对数据的处理工作通过RFID数据控制器来实现,应用到了数据库等,RFID数据控制器的作用是:从RFID硬件控制器读取标签数据;将数据传送给RFID硬件控制器;进行数据格式的转换、数据重组、过滤和分析等数据处理工作。3)应用接口层:应用接口层是原有仓库管理软件与RFID系统
7、交互的通道。这一层的服务有RFID前置服务、应用集成服务以及EPC信息服务。它们实现的功能为RFID前置服务:为所有的RFID控制器提供支持,担当了所有RFID控制器的主控制器功能;URFID是整个仓库RFID管理系统的数据和网络连接的中心点;RFID前置服务也担负着对RFID管理系统的业务流程的监控的功能(类似于EJB对象对业务逻辑的监控);RFID前置服务也为用户提供了http以及数据检索等方法的支持;RFID也担当之于应用集成服务进行数据交互服务的功能。三、实验流程(1)入库流程功能要求查询功能非计划入库输入功能土架单生成功能(越库中转采用虚拟库位)土架执行功能入库单关闭功能基本步骤第一
8、步到货后仓库验收:事务员等待质保人员验收货物后需要进行产品品种、数量的核对。这部分工作可以由手持终端来完成的。首先将所有本次进货的单据、产品信息下载到手持终端中,手持终端将提示材料管理员输入购货单的号码。材料管理员首先识读这个电子标签ID号,然后手持终端的系统判断这个电子标签是否正确,如果不正确,系统立刻向材料管理员做出警示;如果正确,材料管理员再扫描所购材料单上的项目号,系统随后检查购货单上的项目是否与实际进货相符。接着,材料管理员扫描物料规格信息、批次条码和标识号的电子标签等。这个标识号唯一标识购入的这件物料,作为一个最基本的信息用于以后所有的库存管理环节中。如果有不符合订货要取的物料,系
9、统将给出相应的信息。同时需要将验收后的相关信息如批次、数量、生产日期等传送给RFID系统;第二步初始化货物标签:计算机需要根据入数计算共需多少标签生成标签入库指示清单,将根据入库预报单中的供应商代码、货物代码、订单号、批次、数量(验收后的实际数量)等按照最小库存包装单位写入电子货物标签(以便可跟踪具体入库包装货物的采购情况,当然还要考虑标签容量,同时要记录UID号,建立数据关联);同时根据规则指示入库仓位:规则指如能互相替换的物料、经常一起配套出库的物料等尽可能放在一起(需要在基础数据初始化中设置该规则),将指示的仓位同时写入货物标签,以利于上架时比对仓位是否放置正确;将含仓位指示的单据信息(
10、仓位布置单)传给手持终端;写好信息的标签根据清单安装到包装货物包装上;第三步上架确认有如下两种方式:根据指示上架确认:上架工查找仓位(扫描仓位标签,与入库清单中的相同,则表示找到,也可以通过在标签上印刷仓位号,人工查找),找到后将入库货物上架,扫描上架货物电子标签,确认该仓位上上架货物正确,上架确认完毕后在手持机中该标签序号的纪录打上入库标记,防止重复确认。入库数据一般根据代码、批次、质检日期(入库日期)、质检标准、标签UID号等不同在系统中作不同记录(即使在同一仓位上);由于UID号与货物代码、订单号、数量关联,所以可以只比对仓位号、UID号;第四步更新仓位标签:指用手持机更新仓位标签中当前
11、记载的该货物编码、数量。第五步事务员将手持机中该单据入库数据上传至RFID系统中,完成库存更新及入库流水账记录。(2)领料出货流程功能要求查询功能非计划出库输入功能拣货单生成功能(越库中转采用虚拟库位)拣货单执行功能出库确认功能(门式设备完成,连接PC终端)基本步骤第一步生成拣货单数据:操作员在RFID系统中根据出库单生成拣选单(仓位按出库路线排列),含领料单号、拣选仓位、货物代码、供应商代码、批号、整包装数量(整包装指RFID管理的最小包装单位)、散数散数与整包装数为两条纪录即使同一仓位、同一货物。仓位的拣选按照仓库类型进行先入先出控制(根据入库日期、批次或质检日期等)。第二步领料拣选:拣选
12、工将拣选单下载到手持机中,通过扫描货物标签,将扫描到的货物标签仓位信息、代码信息与拣选单中的比对,如一致,则表示拣选正确,分为:整包装取货,则直接从拣选单的整包装数量中扣除该标签中纪录数量,同时该序号的标签在手持机中被打上标记,防止重复扫描,该标签回收;拆零拣货,则按照拣选单的散数确认,同时将散数从货物标签记载的数量中扣除。第三步更新仓位标签:指取货后更新仓位标签中的该货物的当前数量。要求工作人员进行写货位标签的操作,将更改后的货物数据写回到货位标签。直至完成此货位拣货的全部操作;出库确认:工作人员进行出库检验,扫描配送箱或容器上的电子标签(单号条码、货物条码、数量条码、客户条码等)或电子标签
13、,确认与配送单(出库单一致),完成出库的确认工作(贝岭成品库可能需要,也是一般企业需要的最后一步)。最后,操作员将手持机中的拣选确认单数据上传至RFID系统中,完成库存更新及出库流水账记录。成品库可以根据拣选确认结果打印出库装箱单(配送单)及外包装电子标签。(3)盘点流程功能要求查询功能货物盘点启动功能盘点执行功能-盘点差异查询打印功能盘点复核确认功能基本步骤下载盘点数据至盘点机(即离线手持终端):扫描仓位标签:由于仓位标签中记载该仓位上所有货物信息,平时可以随时随地通过扫描货物标签及仓位标签,来快速盘点货物的位置及数量是否正确;当正式盘点时扫描货物标签以标签中货物的数量作理论数量(不显示),
14、人工盘点实物后在手持机上记录实际数量;同时扫描过的货物标签在手持终端中做好标记,防止重复扫描比对处理。(假设货物标签中不记录数量,由于对每一个货位中的货物,其数量在每次更改后都会记录在货位标签中,因此货位标签中记录的数据与系统后端数据库中的数据是一致的。所以盘点工作流程可以为:(1)工作人员通过手持设备扫描货位标签取得此货位中货物的理论数量(此数据不会显示),然后系统将提示盘点员进行下一步操作;(2)盘点员使用手持设备读取货物的标签或标签取得货物编码,盘点实物以后输入其数量;(3)手持系统会将此数据与理论数量进行核对,从而可以立刻获得此仓位的货物数量是否正确;)操作员根据初次盘点数据过滤出差异
15、表:如果仅是仓位放置错误,数量正确,则根据情况决定是否需要调整(如移仓);如果数量出现错误,则需要过滤出出错的仓位、货物列表以便复盘。盘点工根据差异表复盘:一般复盘需要手工盘点,直至盘点结果得到确认。事务员开立调整单:将实际盘点的结果传输到RFID系统中,经确认发现系统库存与实际库存发生不一致,若在ERP中需要调整履历的,则直接在RFID中处理。若货架中的每件货物(库存最小单位)上都贴RFID标签,要求每个货位都有其专用的天线(智能货架)。则可以:(1) 在后端系统中开始一个新的盘点操作。(2) 管理系统通过开启指定货位的专用天线,得到该货位中实际存放的货物的明细信息。(3) 后端管理系统通过
16、核对系统数据和实际数据完成对指定货位的盘点。其他模块(系统维护及基本信息处理)该模块基本包括以下功能:入出库履历查询库存查询库存分布查询封仓管理因为某种原因,该库位上货物进行封仓处理,不能进行拣货处理直至解封。库位查询根据货物查该货物的库位分布;根据库位区域查该库位区域中货物的分布;B/S结构图形化库存、库位查询功能在内部网络中用浏览器方式加上用图形化的表现方式展现仓库中库位、货物的分布信息,方便各级人员查询操作。库存成本计算、价格查询功能数据上下传、同步功能基本信息维护模块货物基本信息、库位信息、库位、安全库存设定、库位最大存放量、库位与货物绑定设置等只影响本系统的信息维护。标签标识打印功能
17、打印标签标识,与RFID封装在一起,方便人工辨识,该标识必须易于更换。标签损坏处理功能当货物标签不能正常读取时,系统支持重新生成新标签替换的功能。与终端设备的接口通过专用接口及中间件完成与设备的集成。身份认证主要是人员角色定义,权限控制,登陆认证等功能四、实验源代码Sale函数#include"stdafx.h"#include"SqlUtil.h"#include"Sales.h"#include<iostream>#include<string>#include<cstring>#include
18、<cstdlib>#include<iomanip>#include<cstdio>#include<ctime>#include<math.h>#include"CommandLib.h"usingnamespacestd;SaleManager:SaleManager()sqlUtil=newADOConn();sqlUtil->OnInitADOConn();cout<<"开始打开数据库连接.”<<endl;UHFreader=newCommandLib(".
19、COM4");UHFreader->setUserFreq(902.750,927.250,0.500,-40,0,1,400,0x03);/*获取RFID的EPC*/intSaleManager:getRfieEpc(unsignedchar*&EPC,int*&EPCLen)unsignedcharlenc=0;unsignedchar*tagInfo=0;inttagNum;/int*EPCLen;intret=1;while(!UHFreader->getInventory(EPC,tagNum,EPCLen);system("cls&q
20、uot;);cout<<"读到"<<tagNum<<"张卡."<<endl;cout<<"len:"<<EPCLen0<<endl;for(inti=0;i<tagNum;i+)cout<<"第"<<i+1<<"张卡EPC号为:"for(intj=0;j<EPCLeni;j+)printf("%.2x",EPCij);cout<<en
21、dl;returntagNum;/*添加物品*/boolSaleManager:addProduct()boolflag=false;unsignedchar*EPC=0;int*EPCLen=0;inttagNum=this->getRfieEpc(EPC,EPCLen);_bstr_tsql=""charsqltmp200;charname50;charbuf20;floatprice;charEPCOne50;charbirthday50;for(inti=0;i<tagNum;i+)(cout<<"请输入商品名:"<
22、<endl;cin>>namecout<<"请输入商品价格:"<<endl;cin>>buf;price=atof(buf);cout<<"生产日期:"<<endl;cin>>birthday;/*time_tnow;time(&now);structtmtmTmp;localtime_s(&tmTmp,&now);sprintf_s(birthday,"%d-%d-%d%d:%d:%d.000n",tmTmp.tm_ye
23、ar+1900,tmTmp.tm_mon+1,tmTmp.tm_mday,tmTmp.tm_hour,tmTmp.tm_min,tmTmp.tm_sec);cout<<birthday<<endl;for(j=0;j<EPCLeni;j+)(printf("%02x",EPCij);EPCOnej=EPCij+48;*/sprintf_s(EPCOne,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",EPCi0,EPCi1,EPCi2,EPCi3,EPCi4,EPCi5,
24、EPCi6,EPCi7,EPCi8,EPCi9,EPCi10,EPCi11)sprintf_s(sqltmp,"insertintoproduct(EPC,name,price,pdate,num)values('%s','%s',%f,'%s',1)",EPCOne,name,price,birthday);/cout<<sqltmp<<endl;sql=_bstr_t(sqltmp);flag=this->sqlUtil->ExecuteSQL(sql);cout<<&quo
25、t;执行结束!"<<endl;if(flag)(cout<<"插入数据成功!"<<endl;else(cout<<"插入数据失败。"<<endl;returntrue;/*销售物品*/boolSaleManager:saleProduct()(charbuf100;unsignedchar*EPC=NULL;charEPCOne50;int*EPCLen=0;charname30;cout<<"请输入售货员的姓名:"<<endl;cin>
26、;>name;inttagNum=this->getRfieEpc(EPC,EPCLen);for(inti=0;i<tagNum;i+)(sprintf_s(EPCOne,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x”,EPCi0,EPCi1,EPCi2,EPCi3,EPCi4,EPCi5,EPCi6,EPCi7,EPCi8,EPCi9,EPCi10,EPCi11);sprintf_s(buf,"select*fromproductwherenum=1andEPC='%s'"
27、,EPCOne);_bstr_tsql=_bstr_t(buf);_RecordsetPtrrsp=sqlUtil->GetRecordSet(sql);this->showProductData(rsp);sprintf_s(buf,"insertintosalevalues('%s','%s',getdate()",EPCOne,name);this->sqlUtil->ExecuteSQL(buf);sprintf_s(buf,"updateproductsetnum=0whereEPC='%s
28、'",EPCOne);/cout<<buf<<endl;this->sqlUtil->ExecuteSQL(buf);cout<<"交易完成!"<<endl;returntrue;/*获取当前系统时间*/voidSaleManager:getCurrentDateTime(char*&dateTimeStr)time_tnow;time(&now);/定义两个变量,存储转换结果structtmtmTmp;charstTmp50;localtime_s(&tmTmp,&
29、;now);sprintf_s(stTmp,"%d-%d-%d%d:%d:%d.000n",tmTmp.tm_year+1900,tmTmp.tm_mon+1,tmTmp.tm_mday,tmTmp.tm_hour,tmTmp.tm_min,tmTmp.tm_sec);dateTimeStr=stTmp;memcpy(dateTimeStr,stTmp,sizeof(stTmp);cout<<"生成的日期是:"<<dateTimeStr<<endl;/*显示商品库存量*/boolSaleManager:displayP
30、roduct()_bstr_tsql="select*fromproductwherenum=1"_RecordsetPtrrsp=sqlUtil->GetRecordSet(sql);showProductData(rsp);returntrue;voidSaleManager:showProductData(_RecordsetPtrrsp)tryrsp->MoveFirst();while(!rsp->adoEOF)stringepc=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t(&qu
31、ot;EPC")->Value);stringname=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name")->Value);stringprice=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("price")->Value);stringbirthday=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("pdate&q
32、uot;)->Value);cout<<"产品名:"<<name<<setw(2)<<”价格:"<<price<<setw(2)<<"生产日期:"<<birthday<<endl;rsp->MoveNext();catch(_com_error&e)cout<<e.Description()<<endl;/*显示销售额*/boolSaleManager:displaySale()_bstr_ts
33、ql="selectname,price,pdatefromproductwherenum=0"/_bstr_tsql1="selectname,count(price)fromproductwherenum=0groupbyname"_RecordsetPtrrsp=sqlUtil->GetRecordSet(sql);/_RecordsetPtrrsp1=sqlUtil->GetRecordSet(sql1);cout<<"查询结果:"<<endl;tryrsp->MoveFirst();
34、while(!rsp->adoEOF)(stringepc=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("product.Epc")->Value);stringname=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name")->Value);stringprice=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("price&qu
35、ot;)->Value);stringsaleDay=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("saledate")->Value);stringuser=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("saleMan")->Value);stringbirthday=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("pdate&qu
36、ot;)->Value);cout<<"产品名:"<<name<<setw(3)<<”价格:"<<price<<setw(3)<<endl;rsp->MoveNext();catch(_com_error&e)(sqlUtil->ExitConnect();cout<<e.Description()<<endl;/*try(rsp1->MoveFirst();while(!rsp1->adoEOF)(stringname
37、=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("name")->Value);stringprice=(char*)(_bstr_t)(rsp->Fields->GetItem(_variant_t("sum(price)")->Value);cout<<"name:"<<name<<"price:"<<price<<endl;rsp1->MoveNext();
38、catch(_com_error&e)(sqlUtil->ExitConnect();cout<<e.Description()<<endl;*/returntrue;/*显示主菜单*/intSaleManager:displayMenu()(printf("n*n");printf("*主菜单*printf("*1.添加商品|2.销售商品printf("*3.查看商品|4.查看销售printf("*5.清空屏幕|6.退出程序printf("*intchoice=0;*n");
39、n");n");n");cin>>choice;returnchoice;接口函数/COPYRIGHTNOTICE/Copyright(c)2011,上海交通大学物联网实验室(版权声明)/Allrightsreserved./fileSerialPort.cpp/brief串口通信类的实现文件/本文件为串口通信类的实现代码/version1.0/author陈杰/E-mail:chjie/#include"stdafx.h"#include"SerialPort.h"#include<process.h&g
40、t;#include<iostream>usingnamespacestd;/*线程退出标志*/boolCSerialPort:s_bExit=false;/*heartBeat线程退出标志*/boolCSerialPort:s_bHBExit=false;/*当串口无数据时,sleep至下次查询间隔的时间,单位:秒*/constUINTSLEEP_TIME_INTERVAL=5;/charbuffer100;char*buffer;intaccum;/boolocpMark;/boolflag=false;/boolinvFlag=false;CSerialPort:CSeria
41、lPort(constchar*portName):m_hListenThread(INVALID_HANDLE_VALUE)/类给成员变量赋值/if(pro_Flag!=0)/return;m_hComm=INVALID_HANDLE_VALUE;/INVALID_HANDLE_VALUEm_hListenThread=INVALID_HANDLE_VALUE;o_eCode=0;buffer=NULL;InitializeCriticalSection(&m_csCommunicationSync);if(!InitPort(portName)if(5=o_eCode)OcpMar
42、k:instance()->setVal(true);cout<<"initPortfail!"<<endl;/exit(-1);elsecout<<"initPortsuccess!"<<endl;if(!OpenListenThread()cout<<"OpenListenThreadfail!"<<endl;elsecout<<"OpenListenThreadsuccess!"<<endl;CSerialP
43、ort:CSerialPort(void)/对应构造函数,称为析构函数,在对象销毁时调用CloseListenTread();ClosePort();deletebuffer;OcpMark:instance()->setVal(false);DeleteCriticalSection(&m_csCommunicationSync);boolCSerialPort:InitPort(constchar*portName/*=1*/,UINTbaud/*=CBR_115200*/,charparity/*='N'*/,UINTdatabits/*=8*/,UINTs
44、topsbits/*=1*/,DWORDdwCommEvents/*=EV_RXCHAR*/)(/*临时变量,将制定参数转化为字符串形式,以构造DCB结构*/charszDCBparam50;sprintf_s(szDCBparam,"baud=%dparity=%cdata=%dstop=%d",baud,parity,databits,stopsbits);/*打开指定串口该函数内部已经有临界区保护,上面请不要加保护*/if(!openPort(portName)(returnfalse;/*进入临界段*/EnterCriticalSection(&m_csCo
45、mmunicationSync);/*是否有错误发生*/BOOLbisSuccess=TRUE;/*在此可以设置输入输出的缓冲区大小,如果不设置,则系统会设置默认值.*自己设置缓冲区大小时,要注意设置稍大一些,避免缓冲区溢出*/*if(bisSuccess)(bisSuccess=SetupComm(m_hComm,10,10);*/*设置串口的超时时间,均设为0,表示不使用超时限制*/COMMTIMEOUTSCommTimeouts;CommTimeouts.ReadintervalTimeout=0;CommTimeouts.ReadTotalTimeoutMultiplier=3;Com
46、mTimeouts.ReadTotalTimeoutConstant=2000;CommTimeouts.WriteTotalTimeoutMultiplier=3;CommTimeouts.WriteTotalTimeoutConstant=2000;if(bIsSuccess)(bIsSuccess=SetCommTimeouts(m_hComm,&CommTimeouts);DCBdcb;if(bIsSuccess)(/将ANSI字符串转换为UNICODE字符串DWORDdwNum=MultiByteToWideChar(CP_ACP,0,szDCBparam,-1,NULL,0
47、);wchar_t*pwText=newwchar_tdwNum;if(!Mult旧yteToWideChar(CP_ACP,0,szDCBparam,-1,pwText,dwNum)(bIsSuccess=TRUE;/*获取当前串口配置参数,并且构造串口DCB参数*/bIsSuccess=GetCommState(m_hComm,&dcb)&&BuildCommDCB(pwText,&dcb);/*开启RTSflow控制*/dcb.fRtsControl=RTS_CONTROL_ENABLE;/*释放内存空间*/deletepwText;if(bIsSucce
48、ss)(/*使用DCB参数配置串口状态*/bIsSuccess=SetCommState(m_hComm,&dcb);/*清空串口缓冲区*/PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);/*离开临界段*/LeaveCriticalSection(&m_csCommunicationSync);returnbIsSuccess=TRUE;boolCSerialPort:InitPort(constchar*portName,constLPDCB&plDCB)/*打开指定
49、串口该函数内部已经有临界区保护,上面请不要加保护*/if(!openPort(portName)returnfalse;/*进入临界段*/EnterCriticalSection(&m_csCommunicationSync);/*配置串口参数*/if(!SetCommState(m_hComm,plDCB)returnfalse;/*清空串口缓冲区*/PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);/*离开临界段*/LeaveCriticalSection(&m_csComm
50、unicationSync);returntrue;voidCSerialPort:ClosePort()/*如果有串口被打开,关闭它*/if(m_hComm!=INVALID_HANDLE_VALUE)CloseHandle(m_hComm);m_hComm=INVALID_HANDLE_VALUE;boolCSerialPort:openPort(constchar*portName)/*进入临界段*/EnterCriticalSection(&m_csCommunicationSync);/*打开指定的串口*/m_hComm=CreateFileA(portName,/*设备名,
51、COM1,COM2等*/GENERIC_READ|GENERIC_WRITE,/*访问模式,可同时读写*/0,/*共享模式,0表示不共享*/NULL,/*安全性设置,一般使用NULL*/OPEN_EXISTING,/*该参数表示设备必须存在,否则创建失败*/0,0);/*如果打开失败,释放资源并返回*/if(m_hComm=INVALID_HANDLE_VALUE|m_hComm=(HANDLE)-1)o_eCode=GetLastError();LeaveCriticalSection(&m_csCommunicationSync);/cout<<"exit3&
52、quot;<<endl;returnfalse;/*退出临界区*/LeaveCriticalSection(&m_csCommunicationSync);returntrue;boolCSerialPort:OpenListenThread()/*检测线程是否已经开启了*/if(m_hListenThread!=INVALID_HANDLE_VALUE)/*线程已经开启*/returnfalse;s_bExit=false;/*线程ID*/UINTthreadId;/*开启串口数据监听线程*/m_hListenThread=(HANDLE)_beginthreadex(N
53、ULL,0,ListenThread,this,0,&threadId);if(!m_hListenThread)returnfalse;/*设置线程的优先级,高于普通线程*/if(!SetThreadPriority(m_hListenThread,THREAD_PRIORITY_ABOVE_NORMAL)returnfalse;returntrue;boolCSerialPort:CloseListenTread()if(m_hListenThread!=INVALID_HANDLE_VALUE)/*通知线程退出*/s_bExit=true;/*等待线程退出*/Sleep(10);
54、/*置线程句柄无效*/CloseHandle(m_hListenThread);m_hListenThread=INVALID_HANDLE_VALUE;returntrue;/boolCSerialPort:OpenHeartBeatThread()/*检测线程是否已经开启了*/if(m_hHeartBeatThread!=INVALID_HANDLE_VALUE)/*线程已经开启*/returnfalse;/s_bExit=false;/*线程ID*/UINTthreadId;/*开启串口数据监听线程*/m_hHeartBeatThread=(HANDLE)_beginthreadex(N
55、ULL,0,HeartBeatThread,this,0,&threadId);/if(!m_hHeartBeatThread)/returnfalse;/*设置线程的优先级,高于普通线程*/if(!SetThreadPriority(m_hHeartBeatThread,THREAD_PRIORITY_ABOVE_NORMAL)/(/returnfalse;/returntrue;/boolCSerialPort:CloseHeartBeatThread()/(/if(m_hHeartBeatThread!=INVALID_HANDLE_VALUE)/(/*通知线程退出*/s_bHB
56、Exit=true;/*等待线程退出*/Sleep(10);/*置线程句柄无效*/CloseHandle(m_hHeartBeatThread);/m_hHeartBeatThread=INVALID_HANDLE_VALUE;/returntrue;/UINTCSerialPort:GetBytesInCOM()(DWORDdwError=0;/*错误码*/COMSTATcomstat;/*COMSTAT结构体,记录通信设备的状态信息*/memset(&comstat,0,sizeof(COMSTAT);UINTBytesInQue=0;/*在调用ReadFile和WriteFile
57、之前,通过本函数清除以前遗留的错误标志*/if(ClearCommError(m_hComm,&dwError,&comstat)(BytesInQue=comstat.cbInQue;/*获取在输入缓冲区中的字节数*/returnBytesInQue;UINTWINAPICSerialPort:ListenThread(void*pParam)(/*得到本类的指针*/CSerialPort*pSerialPort=reinterpret_cast<CSerialPort*>(pParam);/*读取输入缓冲区中的数据并输出显示*/charcRecved=0x00;
58、accum=-1;/charcommand;/charlength=0;/chartagNum;/charnum;/characcLen=0;/charcommandLength=0;if(buffer!=NULL)(deletebuffer;buffer=newchar1000;/线程循环,轮询方式读取串口数据while(!pSerialPort->s_bExit)(UINTBytesInQue=pSerialPort->GetBytesInCOM();/*如果串口输入缓冲区中无数据,则休息一会再查询*/*如果Inventory标志位为true,等一轮结束再接受*/if(Byte
59、sInQue=0&&flagl=false)if(BytesInQue=0)(Sleep(SLEEP_TIME_INTERVAL);continue;do(cRecved=0x00;if(pSerialPort->ReadChar(cRecved)(accum+;bufferaccum=cRecved;while(-BytesInQue);/accLen+=(m+1);/cout<<"BytesInQue"<<BytesInQue<<endl;/*即使break剩余的字节还会在串口中取得*/UINTBytesInQue1=pSerialPort->GetBytesInCOM();/if(m=length-1&&invFlag=false)(/m=-1;/flag=true;/if(invFlag=true)(/if(accLen<buffer1)/continue;/tagNum=buffer2;/for(;tagNum>0;tagNum-)(/length=buffer1;/commandLength+=buffer1+comma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度展会现场医疗服务与安全保障协议2篇
- 多媒体技术与应用知到智慧树章节测试课后答案2024年秋浙江农林大学
- 2024食堂餐饮业务承接协议范本版B版
- 农村社区服务中心建设合同协议书
- 商业舞蹈馆建设合同
- 商铺租赁合同模板:创业基地
- 保险公司内勤聘用合同
- 国际旅游服务合同管理办法
- 2024版环保型编织袋买卖协议范本一
- 广播电视公司租赁合同
- 中国式现代化为主题的论文3000字(1) (1)全文
- YB2防爆电机使用说明书
- 安全生产法律法规清单(2024年5月版)
- 江苏省连云港市2023-2024学年八年级下学期期末道德与法治试卷(含答案解析)
- 2024年大学试题(宗教学)-佛教文化笔试考试历年高频考点试题摘选含答案
- 三年级下册语文必背古诗词
- 老年人谵妄中西医结合诊疗专家共识
- 团餐食品安全年度汇报
- 华西解剖学课件绪论和骨学总论
- 2024平安保险测评题库
- 膀胱癌诊断治疗指南
评论
0/150
提交评论