版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、CentralSouthUniversityRFID課程設計學院:信息科學與工程學院班級:學號:導師:、八刖百目前,很多企業(yè)倉庫管理還是停留在手工操作的基礎(chǔ)上,這樣的傳統(tǒng)的倉庫管理,一般依賴于一個非白動化的、以紙張文件為基礎(chǔ)的系統(tǒng)來記錄、追蹤進出的貨物,完全由人工實施倉庫內(nèi)部的管理,因此倉庫管理的效率極其低下,所能管理的倉庫規(guī)模也很小。隨著計算機的應用普及,目前大多數(shù)企業(yè)的倉庫管理數(shù)據(jù)資料已開始采用計算機數(shù)據(jù)系統(tǒng)管理,但數(shù)據(jù)還是采用先紙張記錄、再手工輸入計算機的方式進行采集和統(tǒng)計整理。這不僅造成大量的人力資源浪費,而且由于人為的因素,數(shù)據(jù)錄入速度慢、準確率低。隨著企業(yè)規(guī)模的不斷發(fā)展,倉庫管理的
2、物資種類機數(shù)量在不斷增加、出入庫頻率劇增,倉庫管理作業(yè)也已十分復雜和多樣化,傳統(tǒng)的人工倉庫作業(yè)模式和數(shù)據(jù)采集方式已難以滿足倉庫管理的快速、準確要求,嚴重影響了企業(yè)的運行工作效率,成為制約企業(yè)發(fā)展的一大障礙。目前RFID技術(shù)正在為供應鏈領(lǐng)域帶來一場巨大的變革,以識別距離遠,快速,不易損壞,容量大等條碼無法比擬的優(yōu)勢,簡化繁雜的工作流程,有效改善供應鏈的效率和透明度。基于RFID的倉庫管理系統(tǒng)是在現(xiàn)有倉庫管理中引入RFID技術(shù),對倉庫到貨檢驗、入庫、出庫、調(diào)撥、移庫移位、庫存盤點等各個作業(yè)環(huán)節(jié)的數(shù)據(jù)進行白動化的數(shù)據(jù)采集,保證倉庫管理各個環(huán)節(jié)數(shù)據(jù)輸入的速度和準確性,確保企業(yè)及時準確地掌握庫存的真實數(shù)
3、據(jù),合理保持和控制企業(yè)庫存。通過科學的編碼,還可方便地對物品的批次、保質(zhì)期等進行管理。利用系統(tǒng)的庫位管理功能,更可以及時掌握所有庫存物資當前所在位置,有利于提高倉庫管理的工作效率。一、實現(xiàn)目標在本方案中,速度、效率、正確率、信息的整合是重點追求的目標。主要在于提高倉庫管理正確性、管理精度及操作的方便性;在倉庫管理系統(tǒng)中融入RFID技術(shù),應用貨物包裝、貨位二種電子標簽來輔助進行倉庫管理,提高企業(yè)效率;最小包裝單位管理,即存儲的每一最小包裝單位都有唯一標示,為庫存精細管理提供支持;記錄各種零部件入庫上架、進出數(shù)量、位置等記錄;在倉位標簽中記錄零部件變動信息(種類、數(shù)量、等),以跟蹤倉庫貨物,提高入
4、、出、存、移的正確率,減少在日常工作中對人的依賴性,降低人為失誤;在移庫移倉管理上,倉管人員可根據(jù)電子標簽進行貨物快速定位并白動在系統(tǒng)中調(diào)整倉位;在庫存盤點中,脫離單據(jù)提高盤點效率,不僅盤點庫存數(shù)量而且盤點位置并保證貨物與位置(倉位)對應得正確率,并能在平時隨時進行區(qū)域盤點,在日常倉庫工作中保證庫存的正確,尤其可以在入出正常的時候進行盤點工作;有效區(qū)分實物庫存及列帳庫存,有效管理票、物時間差,方便倉庫與財務對賬。二、系統(tǒng)構(gòu)成RFID系統(tǒng)由RFID電子標簽(RFIDTag)”、讀寫器(天線+控制器)”、PC等高級設備”這三要素構(gòu)成。RFIDTag”由可保存大量數(shù)據(jù)的IC芯片及天線構(gòu)成,根據(jù)PC等
5、高級設備”的指令,保存在RFID芯片中的數(shù)據(jù)可由讀寫器”讀取或擦寫。(1)RFID電子標簽內(nèi)置全球唯一ID,并擁有96bit/240Bit空間存儲用戶定制信息;防水,防油污;使用壽命長;讀取距離長,標簽數(shù)據(jù)可以加密,且信息防篡改;標簽可擦寫,可循環(huán)利用遠距離讀寫器采用串口與電腦通信;RFID標簽非接觸式的進行讀取貨物信息,準確率為98高。讀寫距離遠標準、符合FCC條例;讀取性能可靠。(3)管理軟件倉庫系統(tǒng)管理軟件采用原有SAP管理軟件結(jié)合新WCS系統(tǒng),系統(tǒng)中標簽數(shù)據(jù)的讀寫、相關(guān)設備的控制以及與新倉庫管理軟件的數(shù)據(jù)接口通過采用國際先進的RFID中間件實現(xiàn)。RFID中間件采用三層結(jié)構(gòu)體系,即虛擬硬
6、件層、數(shù)據(jù)處理層和應用接口層。1)虛擬硬件層:通過虛擬硬件的方法實現(xiàn)對RFID硬件設備的參數(shù)設定和操作管理。這一層,RFID硬件控制器提供了對RFID讀寫器以及其它RFID設備的控制。具體有以下一些功能:支持RFID設備的在線和離線兩種連接方式;RFID硬件設備的驅(qū)動以及讀寫控制。2)數(shù)據(jù)處理層:這一層實現(xiàn)了對數(shù)據(jù)的處理工作,對數(shù)據(jù)的處理工作通過RFID數(shù)據(jù)控制器來實現(xiàn),應用到了數(shù)據(jù)庫等,RFID數(shù)據(jù)控制器的作用是:從RFID硬件控制器讀取標簽數(shù)據(jù);將數(shù)據(jù)傳送給RFID硬件控制器;進行數(shù)據(jù)格式的轉(zhuǎn)換、數(shù)據(jù)重組、過濾和分析等數(shù)據(jù)處理工作。3)應用接口層:應用接口層是原有倉庫管理軟件與RFID系統(tǒng)
7、交互的通道。這一層的服務有RFID前置服務、應用集成服務以及EPC信息服務。它們實現(xiàn)的功能為RFID前置服務:為所有的RFID控制器提供支持,擔當了所有RFID控制器的主控制器功能;URFID是整個倉庫RFID管理系統(tǒng)的數(shù)據(jù)和網(wǎng)絡連接的中心點;RFID前置服務也擔負著對RFID管理系統(tǒng)的業(yè)務流程的監(jiān)控的功能(類似于EJB對象對業(yè)務邏輯的監(jiān)控);RFID前置服務也為用戶提供了http以及數(shù)據(jù)檢索等方法的支持;RFID也擔當之于應用集成服務進行數(shù)據(jù)交互服務的功能。三、實驗流程(1)入庫流程功能要求查詢功能非計劃入庫輸入功能土架單生成功能(越庫中轉(zhuǎn)采用虛擬庫位)土架執(zhí)行功能入庫單關(guān)閉功能基本步驟第一
8、步到貨后倉庫驗收:事務員等待質(zhì)保人員驗收貨物后需要進行產(chǎn)品品種、數(shù)量的核對。這部分工作可以由手持終端來完成的。首先將所有本次進貨的單據(jù)、產(chǎn)品信息下載到手持終端中,手持終端將提示材料管理員輸入購貨單的號碼。材料管理員首先識讀這個電子標簽ID號,然后手持終端的系統(tǒng)判斷這個電子標簽是否正確,如果不正確,系統(tǒng)立刻向材料管理員做出警示;如果正確,材料管理員再掃描所購材料單上的項目號,系統(tǒng)隨后檢查購貨單上的項目是否與實際進貨相符。接著,材料管理員掃描物料規(guī)格信息、批次條碼和標識號的電子標簽等。這個標識號唯一標識購入的這件物料,作為一個最基本的信息用于以后所有的庫存管理環(huán)節(jié)中。如果有不符合訂貨要取的物料,系
9、統(tǒng)將給出相應的信息。同時需要將驗收后的相關(guān)信息如批次、數(shù)量、生產(chǎn)日期等傳送給RFID系統(tǒng);第二步初始化貨物標簽:計算機需要根據(jù)入數(shù)計算共需多少標簽生成標簽入庫指示清單,將根據(jù)入庫預報單中的供應商代碼、貨物代碼、訂單號、批次、數(shù)量(驗收后的實際數(shù)量)等按照最小庫存包裝單位寫入電子貨物標簽(以便可跟蹤具體入庫包裝貨物的采購情況,當然還要考慮標簽容量,同時要記錄UID號,建立數(shù)據(jù)關(guān)聯(lián));同時根據(jù)規(guī)則指示入庫倉位:規(guī)則指如能互相替換的物料、經(jīng)常一起配套出庫的物料等盡可能放在一起(需要在基礎(chǔ)數(shù)據(jù)初始化中設置該規(guī)則),將指示的倉位同時寫入貨物標簽,以利于上架時比對倉位是否放置正確;將含倉位指示的單據(jù)信息(
10、倉位布置單)傳給手持終端;寫好信息的標簽根據(jù)清單安裝到包裝貨物包裝上;第三步上架確認有如下兩種方式:根據(jù)指示上架確認:上架工查找倉位(掃描倉位標簽,與入庫清單中的相同,則表示找到,也可以通過在標簽上印刷倉位號,人工查找),找到后將入庫貨物上架,掃描上架貨物電子標簽,確認該倉位上上架貨物正確,上架確認完畢后在手持機中該標簽序號的紀錄打上入庫標記,防止重復確認。入庫數(shù)據(jù)一般根據(jù)代碼、批次、質(zhì)檢日期(入庫日期)、質(zhì)檢標準、標簽UID號等不同在系統(tǒng)中作不同記錄(即使在同一倉位上);由于UID號與貨物代碼、訂單號、數(shù)量關(guān)聯(lián),所以可以只比對倉位號、UID號;第四步更新倉位標簽:指用手持機更新倉位標簽中當前
11、記載的該貨物編碼、數(shù)量。第五步事務員將手持機中該單據(jù)入庫數(shù)據(jù)上傳至RFID系統(tǒng)中,完成庫存更新及入庫流水賬記錄。(2)領(lǐng)料出貨流程功能要求查詢功能非計劃出庫輸入功能揀貨單生成功能(越庫中轉(zhuǎn)采用虛擬庫位)揀貨單執(zhí)行功能出庫確認功能(門式設備完成,連接PC終端)基本步驟第一步生成揀貨單數(shù)據(jù):操作員在RFID系統(tǒng)中根據(jù)出庫單生成揀選單(倉位按出庫路線排列),含領(lǐng)料單號、揀選倉位、貨物代碼、供應商代碼、批號、整包裝數(shù)量(整包裝指RFID管理的最小包裝單位)、散數(shù)散數(shù)與整包裝數(shù)為兩條紀錄即使同一倉位、同一貨物。倉位的揀選按照倉庫類型進行先入先出控制(根據(jù)入庫日期、批次或質(zhì)檢日期等)。第二步領(lǐng)料揀選:揀選
12、工將揀選單下載到手持機中,通過掃描貨物標簽,將掃描到的貨物標簽倉位信息、代碼信息與揀選單中的比對,如一致,則表示揀選正確,分為:整包裝取貨,則直接從揀選單的整包裝數(shù)量中扣除該標簽中紀錄數(shù)量,同時該序號的標簽在手持機中被打上標記,防止重復掃描,該標簽回收;拆零揀貨,則按照揀選單的散數(shù)確認,同時將散數(shù)從貨物標簽記載的數(shù)量中扣除。第三步更新倉位標簽:指取貨后更新倉位標簽中的該貨物的當前數(shù)量。要求工作人員進行寫貨位標簽的操作,將更改后的貨物數(shù)據(jù)寫回到貨位標簽。直至完成此貨位揀貨的全部操作;出庫確認:工作人員進行出庫檢驗,掃描配送箱或容器上的電子標簽(單號條碼、貨物條碼、數(shù)量條碼、客戶條碼等)或電子標簽
13、,確認與配送單(出庫單一致),完成出庫的確認工作(貝嶺成品庫可能需要,也是一般企業(yè)需要的最后一步)。最后,操作員將手持機中的揀選確認單數(shù)據(jù)上傳至RFID系統(tǒng)中,完成庫存更新及出庫流水賬記錄。成品庫可以根據(jù)揀選確認結(jié)果打印出庫裝箱單(配送單)及外包裝電子標簽。(3)盤點流程功能要求查詢功能貨物盤點啟動功能盤點執(zhí)行功能-盤點差異查詢打印功能盤點復核確認功能基本步驟下載盤點數(shù)據(jù)至盤點機(即離線手持終端):掃描倉位標簽:由于倉位標簽中記載該倉位上所有貨物信息,平時可以隨時隨地通過掃描貨物標簽及倉位標簽,來快速盤點貨物的位置及數(shù)量是否正確;當正式盤點時掃描貨物標簽以標簽中貨物的數(shù)量作理論數(shù)量(不顯示),
14、人工盤點實物后在手持機上記錄實際數(shù)量;同時掃描過的貨物標簽在手持終端中做好標記,防止重復掃描比對處理。(假設貨物標簽中不記錄數(shù)量,由于對每一個貨位中的貨物,其數(shù)量在每次更改后都會記錄在貨位標簽中,因此貨位標簽中記錄的數(shù)據(jù)與系統(tǒng)后端數(shù)據(jù)庫中的數(shù)據(jù)是一致的。所以盤點工作流程可以為:(1)工作人員通過手持設備掃描貨位標簽取得此貨位中貨物的理論數(shù)量(此數(shù)據(jù)不會顯示),然后系統(tǒng)將提示盤點員進行下一步操作;(2)盤點員使用手持設備讀取貨物的標簽或標簽取得貨物編碼,盤點實物以后輸入其數(shù)量;(3)手持系統(tǒng)會將此數(shù)據(jù)與理論數(shù)量進行核對,從而可以立刻獲得此倉位的貨物數(shù)量是否正確;)操作員根據(jù)初次盤點數(shù)據(jù)過濾出差異
15、表:如果僅是倉位放置錯誤,數(shù)量正確,則根據(jù)情況決定是否需要調(diào)整(如移倉);如果數(shù)量出現(xiàn)錯誤,則需要過濾出出錯的倉位、貨物列表以便復盤。盤點工根據(jù)差異表復盤:一般復盤需要手工盤點,直至盤點結(jié)果得到確認。事務員開立調(diào)整單:將實際盤點的結(jié)果傳輸?shù)絉FID系統(tǒng)中,經(jīng)確認發(fā)現(xiàn)系統(tǒng)庫存與實際庫存發(fā)生不一致,若在ERP中需要調(diào)整履歷的,則直接在RFID中處理。若貨架中的每件貨物(庫存最小單位)上都貼RFID標簽,要求每個貨位都有其專用的天線(智能貨架)。則可以:(1) 在后端系統(tǒng)中開始一個新的盤點操作。(2) 管理系統(tǒng)通過開啟指定貨位的專用天線,得到該貨位中實際存放的貨物的明細信息。(3) 后端管理系統(tǒng)通過
16、核對系統(tǒng)數(shù)據(jù)和實際數(shù)據(jù)完成對指定貨位的盤點。其他模塊(系統(tǒng)維護及基本信息處理)該模塊基本包括以下功能:入出庫履歷查詢庫存查詢庫存分布查詢封倉管理因為某種原因,該庫位上貨物進行封倉處理,不能進行揀貨處理直至解封。庫位查詢根據(jù)貨物查該貨物的庫位分布;根據(jù)庫位區(qū)域查該庫位區(qū)域中貨物的分布;B/S結(jié)構(gòu)圖形化庫存、庫位查詢功能在內(nèi)部網(wǎng)絡中用瀏覽器方式加上用圖形化的表現(xiàn)方式展現(xiàn)倉庫中庫位、貨物的分布信息,方便各級人員查詢操作。庫存成本計算、價格查詢功能數(shù)據(jù)上下傳、同步功能基本信息維護模塊貨物基本信息、庫位信息、庫位、安全庫存設定、庫位最大存放量、庫位與貨物綁定設置等只影響本系統(tǒng)的信息維護。標簽標識打印功能
17、打印標簽標識,與RFID封裝在一起,方便人工辨識,該標識必須易于更換。標簽損壞處理功能當貨物標簽不能正常讀取時,系統(tǒng)支持重新生成新標簽替換的功能。與終端設備的接口通過專用接口及中間件完成與設備的集成。身份認證主要是人員角色定義,權(quán)限控制,登陸認證等功能四、實驗源代碼Sale函數(shù)#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<<"開始打開數(shù)據(jù)庫連接.”<<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<<"生產(chǎn)日期:"<<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;執(zhí)行結(jié)束!"<<endl;if(flag)(cout<<"插入數(shù)據(jù)成功!"<<endl;else(cout<<"插入數(shù)據(jù)失敗。"<<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;/*獲取當前系統(tǒng)時間*/voidSaleManager:getCurrentDateTime(char*&dateTimeStr)time_tnow;time(&now);/定義兩個變量,存儲轉(zhuǎn)換結(jié)果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<<"產(chǎn)品名:"<<name<<setw(2)<<”價格:"<<price<<setw(2)<<"生產(chǎn)日期:"<<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<<"查詢結(jié)果:"<<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<<"產(chǎn)品名:"<<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;接口函數(shù)/COPYRIGHTNOTICE/Copyright(c)2011,上海交通大學物聯(lián)網(wǎng)實驗室(版權(quán)聲明)/Allrightsreserved./fileSerialPort.cpp/brief串口通信類的實現(xiàn)文件/本文件為串口通信類的實現(xiàn)代碼/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;/*當串口無數(shù)據(jù)時,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)/對應構(gòu)造函數(shù),稱為析構(gòu)函數(shù),在對象銷毀時調(diào)用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*/)(/*臨時變量,將制定參數(shù)轉(zhuǎn)化為字符串形式,以構(gòu)造DCB結(jié)構(gòu)*/charszDCBparam50;sprintf_s(szDCBparam,"baud=%dparity=%cdata=%dstop=%d",baud,parity,databits,stopsbits);/*打開指定串口該函數(shù)內(nèi)部已經(jīng)有臨界區(qū)保護,上面請不要加保護*/if(!openPort(portName)(returnfalse;/*進入臨界段*/EnterCriticalSection(&m_csCo
45、mmunicationSync);/*是否有錯誤發(fā)生*/BOOLbisSuccess=TRUE;/*在此可以設置輸入輸出的緩沖區(qū)大小,如果不設置,則系統(tǒng)會設置默認值.*自己設置緩沖區(qū)大小時,要注意設置稍大一些,避免緩沖區(qū)溢出*/*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字符串轉(zhuǎn)換為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;/*獲取當前串口配置參數(shù),并且構(gòu)造串口DCB參數(shù)*/bIsSuccess=GetCommState(m_hComm,&dcb)&&BuildCommDCB(pwText,&dcb);/*開啟RTSflow控制*/dcb.fRtsControl=RTS_CONTROL_ENABLE;/*釋放內(nèi)存空間*/deletepwText;if(bIsSucce
48、ss)(/*使用DCB參數(shù)配置串口狀態(tài)*/bIsSuccess=SetCommState(m_hComm,&dcb);/*清空串口緩沖區(qū)*/PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);/*離開臨界段*/LeaveCriticalSection(&m_csCommunicationSync);returnbIsSuccess=TRUE;boolCSerialPort:InitPort(constchar*portName,constLPDCB&plDCB)/*打開指定
49、串口該函數(shù)內(nèi)部已經(jīng)有臨界區(qū)保護,上面請不要加保護*/if(!openPort(portName)returnfalse;/*進入臨界段*/EnterCriticalSection(&m_csCommunicationSync);/*配置串口參數(shù)*/if(!SetCommState(m_hComm,plDCB)returnfalse;/*清空串口緩沖區(qū)*/PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);/*離開臨界段*/LeaveCriticalSection(&m_csComm
50、unicationSync);returntrue;voidCSerialPort:ClosePort()/*如果有串口被打開,關(guān)閉它*/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,/*該參數(shù)表示設備必須存在,否則創(chuàng)建失敗*/0,0);/*如果打開失敗,釋放資源并返回*/if(m_hComm=INVALID_HANDLE_VALUE|m_hComm=(HANDLE)-1)o_eCode=GetLastError();LeaveCriticalSection(&m_csCommunicationSync);/cout<<"exit3&
52、quot;<<endl;returnfalse;/*退出臨界區(qū)*/LeaveCriticalSection(&m_csCommunicationSync);returntrue;boolCSerialPort:OpenListenThread()/*檢測線程是否已經(jīng)開啟了*/if(m_hListenThread!=INVALID_HANDLE_VALUE)/*線程已經(jīng)開啟*/returnfalse;s_bExit=false;/*線程ID*/UINTthreadId;/*開啟串口數(shù)據(jù)監(jiān)聽線程*/m_hListenThread=(HANDLE)_beginthreadex(N
53、ULL,0,ListenThread,this,0,&threadId);if(!m_hListenThread)returnfalse;/*設置線程的優(yōu)先級,高于普通線程*/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()/*檢測線程是否已經(jīng)開啟了*/if(m_hHeartBeatThread!=INVALID_HANDLE_VALUE)/*線程已經(jīng)開啟*/returnfalse;/s_bExit=false;/*線程ID*/UINTthreadId;/*開啟串口數(shù)據(jù)監(jiān)聽線程*/m_hHeartBeatThread=(HANDLE)_beginthreadex(N
55、ULL,0,HeartBeatThread,this,0,&threadId);/if(!m_hHeartBeatThread)/returnfalse;/*設置線程的優(yōu)先級,高于普通線程*/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結(jié)構(gòu)體,記錄通信設備的狀態(tài)信息*/memset(&comstat,0,sizeof(COMSTAT);UINTBytesInQue=0;/*在調(diào)用ReadFile和WriteFile
57、之前,通過本函數(shù)清除以前遺留的錯誤標志*/if(ClearCommError(m_hComm,&dwError,&comstat)(BytesInQue=comstat.cbInQue;/*獲取在輸入緩沖區(qū)中的字節(jié)數(shù)*/returnBytesInQue;UINTWINAPICSerialPort:ListenThread(void*pParam)(/*得到本類的指針*/CSerialPort*pSerialPort=reinterpret_cast<CSerialPort*>(pParam);/*讀取輸入緩沖區(qū)中的數(shù)據(jù)并輸出顯示*/charcRecved=0x00;
58、accum=-1;/charcommand;/charlength=0;/chartagNum;/charnum;/characcLen=0;/charcommandLength=0;if(buffer!=NULL)(deletebuffer;buffer=newchar1000;/線程循環(huán),輪詢方式讀取串口數(shù)據(jù)while(!pSerialPort->s_bExit)(UINTBytesInQue=pSerialPort->GetBytesInCOM();/*如果串口輸入緩沖區(qū)中無數(shù)據(jù),則休息一會再查詢*/*如果Inventory標志位為true,等一輪結(jié)束再接受*/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剩余的字節(jié)還會在串口中取得*/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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024會計面試自我介紹范文(33篇)
- 造氣知識-關(guān)于魯奇爐
- 醫(yī)院應急的演練總結(jié)
- 探索2024:2小毛蟲教案設計詳解
- 2022-2023年軍隊文職人員招聘《軍隊文職歷史學》預測試題10(答案解析)
- 2024年中考物理一輪復習單元達標全攻略專題專題20電與磁含解析
- 2024年課堂教學革新:《雞毛信》課件的新使命
- 2辦公室5s策略:2024年培訓課件
- 2025版高中數(shù)學一輪復習課時作業(yè)梯級練二十八平面向量的基本定理及坐標表示課時作業(yè)理含解析新人教A版
- 部編版道德與法治八年級下冊4.2依法履行義務課時訓練
- 小學道德與法治六年級上冊第5課《國家機構(gòu)有哪些》測試題
- PLC控制的自動花樣音樂噴泉系統(tǒng)設計畢業(yè)設計論文
- 建筑公司組織架構(gòu)及崗位職責
- COPD診療新進展
- 精品資料(2021-2022年收藏的)病案管理制度全套
- 低壓工作票(共3頁)
- 2閥門結(jié)構(gòu)和工作原理(上)
- 基礎(chǔ)圖案設計(課堂PPT)
- 食堂操作工藝流程圖
- 幼兒園參觀學?;顒臃桨?篇
- 關(guān)于旅游景區(qū)游客滿意度研究的文獻綜述
評論
0/150
提交評論