版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
并行接口程序設(shè)計(jì)本章介紹在Windows2000/XP下的并行接口的程序設(shè)計(jì)方法,分析一下目前進(jìn)行并行接口編程的方法,可以歸納為幾種:DLL直接I/O方式:應(yīng)用程序通過(guò)一個(gè)可以進(jìn)行端口I/O訪問(wèn)的DLL接口軟件實(shí)現(xiàn)對(duì)并行接口的訪問(wèn),即通過(guò)調(diào)用第三方DLL接口軟件中的I/O端口讀寫(xiě)函數(shù)實(shí)現(xiàn)對(duì)并行口的寄存器的讀寫(xiě)。這樣的軟件很多,像Winlo、Inpout32、TVicPort等;ActiveX控件直接I/O方式:通過(guò)一個(gè)提供ActiveX控件實(shí)現(xiàn)對(duì)端口的直接I/O訪問(wèn),一般控件的方式采用VB編程比較簡(jiǎn)單。這樣的軟件包括Inpout32、TVicPort等;?并行接口專用接口軟件:使用這一類軟件對(duì)并行接口編程要比上2種方法簡(jiǎn)單,有些軟件支持中斷。這樣的軟件如TVicLPTo自己編寫(xiě)驅(qū)動(dòng)程序:直接在VC++環(huán)境下通過(guò)Windows2000DDK或WindowsXPDDK編寫(xiě)驅(qū)動(dòng)程序,這是一種最靈活的方法,但編程的難度比較大。5.1實(shí)現(xiàn)直接I/O方式的軟件并行接口的編程在不同的操作系統(tǒng)下采取不同的方法,在DOS和Windows95之前的操作系統(tǒng)下,可以直接對(duì)端口進(jìn)行讀寫(xiě),根據(jù)并行接口的不同模式的寄存器進(jìn)行讀寫(xiě)操作就可以完成各種模式的接口編程。在目前的Windows2000/XP操作系統(tǒng)下,不能直接對(duì)端口寄存器進(jìn)行訪問(wèn),這是由于Windows2000/XP對(duì)系統(tǒng)底層操作采取了屏蔽的策略,對(duì)用戶而言,系統(tǒng)變得更為安全,但這卻給接口和接口軟件開(kāi)發(fā)人員帶來(lái)了不小的困難,因?yàn)橹灰獞?yīng)用程序中涉及到底層的操作,開(kāi)發(fā)人員就不得不深入到Windows的內(nèi)核去編寫(xiě)屬于系統(tǒng)級(jí)的設(shè)備驅(qū)動(dòng)程序。對(duì)并行口的讀寫(xiě)操作就是如此,由于Windows對(duì)系統(tǒng)的保護(hù),應(yīng)用程序不允許直接I/O操作。在Windows2000/XP操作系統(tǒng)下,正規(guī)的接口程序的編程方法是采取驅(qū)動(dòng)程序的開(kāi)發(fā)方法。由于驅(qū)動(dòng)程序需要與操作系統(tǒng)最底層進(jìn)行交互,因此不同的操作系統(tǒng)的底層結(jié)構(gòu)對(duì)應(yīng)不同的設(shè)備驅(qū)動(dòng)程序模型。Windows2000/XP與Windows9x的內(nèi)部結(jié)構(gòu)不同,這兩類操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序是不兼容的,為了解決不同的操作系統(tǒng)的結(jié)構(gòu)的差異帶來(lái)的設(shè)備驅(qū)動(dòng)程序的不兼容的問(wèn)題,微軟公司在1997年提出了Windows操作系統(tǒng)的驅(qū)動(dòng)程序模型,即WDM(WindowsDriverModel)oWDM設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)是在VC++下通過(guò)DDK(DeviceDevelopmentKit:設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)包)才能完成的,這種方法的編程是比較復(fù)雜的,需要了解操作系統(tǒng)的內(nèi)部結(jié)構(gòu),并需要熟練的VC++開(kāi)發(fā)經(jīng)驗(yàn)。如果不采用WDM的方法,一個(gè)簡(jiǎn)單實(shí)用的方法是使用間接的I/O方式,就是在應(yīng)用程序調(diào)用一個(gè)第三方提供的直接I/O接口程序,由這個(gè)間接的I/O程序模塊實(shí)現(xiàn)對(duì)端口的讀寫(xiě)。下面介紹幾種這樣的軟件產(chǎn)品。Inpout32Inpout32:由LOGIX4U提供的免費(fèi)軟件,可以在/網(wǎng)站下載。Inpout32提供了以DLL文件和AxtiveX的OCX文件兩形式提供了直接訪問(wèn)I/O端口的函數(shù),在文件中只封裝了2個(gè)函數(shù),Inp32()和Out32()。支持從Windows95/98/Me到WindowsNT/2000/XP的多種操作系統(tǒng)。Inpout32只提供對(duì)I/O端口的訪問(wèn),不針對(duì)具體的接口類型,原則上可以完成所有面向寄存器訪問(wèn)編程的應(yīng)用程序。但I(xiàn)npout32沒(méi)有提供中斷的支持,所以只能完成以查詢控制方式的程序,不能實(shí)現(xiàn)中斷控制方式的程序設(shè)計(jì)。這可能會(huì)影響接口的傳輸速度,同時(shí)也使得軟件的CPU占用率很高。很可貴的是,在下載的軟件包中提供了DLL和OCX文件的VC++源程序代碼,這對(duì)于開(kāi)發(fā)接口相關(guān)的DLL程序和OCX控件程序很有參考價(jià)值。TVicPortEnTech提供了用于接口編程的多個(gè)軟件產(chǎn)品,包括TVicTW32、TVicLPT和TVicPort等,這些軟件可以在EnTech的網(wǎng)站/dev/index.shtm上獲得,其中TVicPort是一個(gè)免費(fèi)的軟件,是TVicHW32的簡(jiǎn)化版。TVicPort是需要安裝的,默認(rèn)的目錄是C:\TVicPortPersonal,在該目錄下有Docs和Samples兩個(gè)目錄,分別是說(shuō)明文件和程序例子源文件。核心模塊被安裝到了系統(tǒng)目錄。TVicPort功能說(shuō)明TVicPort的功能包括:?直接I/O訪問(wèn);-通過(guò)一個(gè)指針將物理存儲(chǔ)器影射用戶程序的存儲(chǔ)空間;-增強(qiáng)對(duì)并行接口的支持,可以直接控制和檢測(cè)并行端口的信號(hào)線;-提供獲得IDE硬盤(pán)的制造商信息的函數(shù),如硬盤(pán)序列號(hào),可以實(shí)現(xiàn)軟件的硬盤(pán)邦定;?支持WindowsXP64bit。TVicPort提供的核心模塊文件包括TVicPort.sys、TVicPort.vxd、TVicPort.dll和TVicPort.ocx四個(gè)。其中TVicPort.vxd是用于Windows9x/ME的虛擬設(shè)備驅(qū)動(dòng)程序,TVicPort.sys是用于Windows2000/XP的內(nèi)核模式驅(qū)動(dòng)程序,DLL和OCX是應(yīng)用程序接口模塊,實(shí)現(xiàn)應(yīng)用程序與設(shè)備驅(qū)動(dòng)程序的連接。雖然TVicPort支持多種語(yǔ)言平臺(tái),但DLL函數(shù)更適合用于VC++編程,而OCX文件適合用于VB編程。TVicPort提供兩種對(duì)于端口的訪問(wèn)方式,即“Hard”和“Soft”方式,其中“Soft”方式的讀寫(xiě)速度比較快,但當(dāng)被讀寫(xiě)的端口地址被另一個(gè)內(nèi)核模式驅(qū)動(dòng)程序占用時(shí)會(huì)訪問(wèn)失效。而“Hard”方式可以避免這種情況,即使端口被另一個(gè)內(nèi)核模式驅(qū)動(dòng)程序占用也能完成可靠的讀寫(xiě),但其訪問(wèn)速度比“Soft”方式慢。函數(shù)默認(rèn)的訪問(wèn)方式是“Hard”方式,可以使用SetHardAccess()函數(shù)更改訪問(wèn)方式。也可以通過(guò)函數(shù)TestHardAccess(涵數(shù)返回當(dāng)前的訪問(wèn)方式。TVicPort的DLL函數(shù)下面介紹TVicPort的DLL文件提供的VC++格式接口函數(shù)。這些函數(shù)的原形說(shuō)明在TVicPort.h中,在VC++中加入TVicPort.h后可以直接按照下面介紹的格式實(shí)現(xiàn)調(diào)用。如果在VB中調(diào)用這些函數(shù),可以在VB工程中加入\Samples\VB\PortLib.bas模塊,在模塊中對(duì)全部函數(shù)作了聲明,可以參照模塊中的聲明細(xì)節(jié)實(shí)現(xiàn)在VB中的調(diào)用。TVicPort.dll提供的公共函數(shù)BOOLOpenTVicPort():打開(kāi)(加載)TVicPort.vxd或TVicPort.sys設(shè)備驅(qū)動(dòng)。參數(shù):無(wú)。返回:打開(kāi)成功返回TRUE,失敗返回FALSE。BOOLIsDriverOpened():測(cè)試驅(qū)動(dòng)程序是否打開(kāi)。參數(shù):無(wú)。返回:驅(qū)動(dòng)程序已打開(kāi)返回TRUE,未打開(kāi)返回FALSEovoidCloseTVicPort():關(guān)閉(卸載)設(shè)備驅(qū)動(dòng)程序。voidSetHardAccess(BOOLHardAccess):設(shè)置當(dāng)前的訪問(wèn)方式為“Hard”或“Soft”參數(shù):TRUE表示設(shè)置為“Hard”方式,F(xiàn)ALSE表示設(shè)置為“Soft”方式。返回:無(wú)。BOOLTestHardAccess():測(cè)試當(dāng)前的訪問(wèn)方式。參數(shù):無(wú)。返回:TRUE表示“Hard”方式,F(xiàn)ALSE表示“Soft”方式。TVicPort.dll提供的端口訪問(wèn)函數(shù)UCHARReadPort(USHORTPortAddr)讀端口1個(gè)字節(jié)。USHORTReadPortW(USHORTPortAddr)讀端口2個(gè)字節(jié)(字)。ULONGReadPortL(USHORTPortAddr):讀端口4個(gè)字節(jié)(雙字)。參數(shù):端口地址。返回:讀得的端口數(shù)據(jù)。voidWritePort(USHORTPortAddr,UCHARbData:寫(xiě)1個(gè)字節(jié)到端口。voidWritePortW(USHORTPortAddr,USHORTwData)寫(xiě)2個(gè)字(字)節(jié)到端口。voidWritePortL(USHORTPortAddr,ULONGlData:寫(xiě)4個(gè)字節(jié)(雙字)到端口。參數(shù):PortAddr為端口地址,bData/wData/lData為要寫(xiě)的數(shù)據(jù)。返回:無(wú)。voidReadPortFIFO(USHORTPortAddr,USHORTNumPorts,UCHAR*Buffer)voidReadPortWFIFO(USHORTPortAddr,USHORTNumPorts,USHORT*Buffer)voidReadPortLFIFO(USHORTPortAddr,USHORTNumPorts,ULONG*Buffer)功能:讀取多個(gè)單元(字節(jié)/字/雙字)到一個(gè)輸入緩沖區(qū)。參數(shù):PortAddr為端口地址,NumPorts為單元數(shù),Buffer為輸入緩沖區(qū)指針。voidWritePortFIFO(USHORTPortAddr,USHORTNumPorts,UCHAR*Buffer)voidWritePortWFIFO(USHORTPortAddr,USHORTNumPorts,USHORT*Buffer)voidWritePortLFIFO(USHORTPortAddr,USHORTNumPorts,ULONG*Buffer)功能:寫(xiě)多個(gè)單元(字節(jié)/字/雙字)到端口。參數(shù):PortAddr為端口地址,NumPorts為單元數(shù),Buffer為輸出緩沖區(qū)指針。TVicPort.dll提供的存儲(chǔ)器訪問(wèn)函數(shù)ULONGMapPhysToLinear(ULONGPhysAddr,ULONGMappedSize)功能:映射系統(tǒng)的物理存儲(chǔ)器空間到應(yīng)用程序的線性存儲(chǔ)空間。參數(shù):PhysAddr為32位物理存儲(chǔ)器起始地址,MappedSize為映射的字節(jié)數(shù)。返回:物理存儲(chǔ)器空間的首字節(jié)映射到線性存儲(chǔ)空間的地址。voidUnmapMemory(ULONGPhysAddr,ULONGMappedSize)功能:關(guān)閉由MapPhysToLinear(涵數(shù)建立的映射。參數(shù):PhysAddr為32位物理存儲(chǔ)器起始地址,MappedSize為映射的字節(jié)數(shù)。返回:無(wú)。UCHARGetMem(ULONGMappedAddress,ULONGMemOffset)USHORTGetMemW(ULONGMappedAddress,ULONGMemOffset)ULONGGetMemL(ULONGMappedAddress,ULONGMemOffset)功能:讀取線性存儲(chǔ)空間的字節(jié)/字/雙字?jǐn)?shù)據(jù),以上3個(gè)函數(shù)可以用于VB,因?yàn)樵赩C++中可以直接通過(guò)指針實(shí)現(xiàn)線性地址空間的數(shù)據(jù)讀取,而VB缺乏指針的操作手段。參數(shù):MappedAddress為由MapPhysToLinear(涵數(shù)返回的線性存儲(chǔ)空間的首地址,MemOffset為線性存儲(chǔ)空間的偏移位置。返回:讀取的數(shù)據(jù)。voidSetMem(ULONGMappedAddress,ULONGMemOffset,UCHARbValue)voidSetMemW(ULONGMappedAddress,ULONGMemOffset,USHORTwValue)voidSetMemL(ULONGMappedAddress,ULONGMemOffset,ULONGdwValue)功能:向線性存儲(chǔ)空間寫(xiě)入一個(gè)字節(jié)/字/雙字?jǐn)?shù)據(jù),以上3個(gè)函數(shù)可以用于VB,因?yàn)樵赩C++中可以直接通過(guò)指針實(shí)現(xiàn)線性地址空間的數(shù)據(jù)讀取,而VB缺乏指針的操作手段。參數(shù):MappedAddress為由MapPhysToLinear(涵數(shù)返回的線性存儲(chǔ)空間的首地址,MemOffset為線性存儲(chǔ)空間的偏移位置,bValue/wValue/dwValue為要寫(xiě)入的數(shù)據(jù)。返回:無(wú)。(4) TVicPort.dll提供的并行接口訪問(wèn)函數(shù)UCHARGetLPTNumber():獲得當(dāng)前的并行接口號(hào)。參數(shù):無(wú)返回:1為L(zhǎng)PT1,2為L(zhǎng)PT2...。voidSetLPTNumber(UCHARLptNumber):設(shè)置一個(gè)并行口為當(dāng)前并行口。參數(shù):lptNumber為1表示LPT1,2表示LPT2...。返回:無(wú)。UCHARGetLPTNumPorts():檢測(cè)系統(tǒng)中的LPT數(shù)目。參數(shù):無(wú)。返回:系統(tǒng)中的LPT數(shù)目。ULONGGetLPTBasePort():獲得當(dāng)前LPT的基地址。參數(shù):無(wú)。返回:當(dāng)前LPT基地址。UCHARAddNewLPT(USHORTPortBaseAddress:添加一個(gè)LPT。參數(shù):PortBaseAddress為添加的LPT的基地址。返回:添加的LPT的號(hào)碼,同時(shí)設(shè)置添加的LPT為當(dāng)前LPT。BOOLGetPin(UCHARPinNumber):讀取當(dāng)前LPT連接器的可讀取線狀態(tài)。參數(shù):PinNumber為DB25連接器的線編號(hào),1?25。返回:TRUE表示高電平,F(xiàn)ALSE表示低電平。voidSetPin(UCHARPinNumber,BOOLPinLevel)設(shè)置當(dāng)前LPT的可寫(xiě)線狀態(tài)。參數(shù):PinNumber為DB25連接器的線編號(hào),PinLevel為T(mén)RUE表示高電平,F(xiàn)ALSE表示低電平。返回:無(wú)。BOOLGetLPTAckwl()獲得當(dāng)前LPT的Acknowledge線狀態(tài)。參數(shù):無(wú)。返回:TRUE表示有效,F(xiàn)ALSE為無(wú)效狀態(tài)。BOOLGetLPTBusy():獲得當(dāng)前LPT的Busy線狀態(tài)。參數(shù):無(wú)。返回:TRUE表示有效,F(xiàn)ALSE為無(wú)效狀態(tài)。BOOLGetLPTPaperEnd():獲得當(dāng)前LPT的PaperEnd線狀態(tài)。參數(shù):無(wú)。返回:TRUE表示有效,F(xiàn)ALSE為無(wú)效狀態(tài)。BOOLGetLPTSlct():獲得當(dāng)前LPT的Slct線狀態(tài)。參數(shù):無(wú)。返回:TRUE表示有效,F(xiàn)ALSE為無(wú)效狀態(tài)。BOOLGetLPTError():獲得當(dāng)前LPT的Error線狀態(tài)。參數(shù):無(wú)。返回:TRUE表示有效,F(xiàn)ALSE為無(wú)效狀態(tài)。voidLPTInit():在當(dāng)前LPT的Init線(DB25的16號(hào)引腳)輸出一個(gè)短暫的脈沖。參數(shù):無(wú)。返回:無(wú)。voidLPTSlctIn():設(shè)置當(dāng)前LPT的SelectIn線為有效。參數(shù):無(wú)。返回:無(wú)。voidLPTStrobe():在當(dāng)前LPT的Strobe線(DB25的1號(hào)引腳)輸出一個(gè)短暫的脈沖。參數(shù):無(wú)。返回:無(wú)。voidLPTAutofd(BOOLFlag):設(shè)置當(dāng)前LPT的AutoLF線(DB25的14號(hào)引腳)狀態(tài)。參數(shù):Flag為T(mén)RUE表示有效,F(xiàn)LASE表示無(wú)效。返回:無(wú)。(5)TVicPort.dll提供的IDE硬盤(pán)訪問(wèn)函數(shù)voidGetHDDInfo(UCHARIdeNumber,UCHARMaster,HDDInfo*Info)功能:返回IDE硬盤(pán)的制造商參數(shù)。參數(shù):IdeNumber為IDE通道號(hào),Masker為1表示Masker設(shè)備,0表示Slave設(shè)備。*Info為指向一個(gè)HDDInfo結(jié)構(gòu)的指針,該函數(shù)填寫(xiě)HDDInfo。返回:無(wú)。HDDInfo結(jié)構(gòu)如下:
typedefstruct_HDDInfo{ULONGBufferSize;〃緩沖存儲(chǔ)器容量ULONGDoubleTransfer;〃雙字節(jié)數(shù)據(jù)傳輸支持ULONGControllerType;〃控制器類型ULONGECCMode;//ECC校驗(yàn)?zāi)J経LONGSectorsPerInterrupt;〃每中斷的扇區(qū)數(shù)ULONGCylinders;〃柱面數(shù)ULONGHeads;〃磁頭數(shù)ULONGSectorsPerTrack;〃每磁道扇區(qū)數(shù)charModel[41];〃型號(hào)charSerialNumber[21];〃序列號(hào)charRevision[9];}HDDInfo,*pHDDInfo;〃控制器版本號(hào)TVicPort的ActiveX控件TVicPort的ActiveX控件屬性和DLL函數(shù)接口基本功能是類似的,個(gè)別DLL函數(shù)在ActiveX控件沒(méi)有。ActiveX控件的接口方式更適合在VB中使用。當(dāng)然并不是在VB中必須使用TVicPort的ActiveX控件方式,也可以采用DLL方式調(diào)用TVicPort.dll中的函數(shù)。首先在VB中創(chuàng)建一個(gè)StandardEXE類型的工程,選擇Project菜單中的Components菜單項(xiàng),打開(kāi)Components窗口,在Controls選項(xiàng)卡中找到TVicPortActiveXControlModele,選中后按確定按鈕將TVicPort控件插入到Toolbox中,在將其拖到應(yīng)用程序的窗體中,在窗體呈現(xiàn)一個(gè)TVP標(biāo)記,然后就可以編寫(xiě)代碼了。TVicPort的ActiveX屬性成員名稱和功能與DLL函數(shù)的有差別,全部的ActiveX屬性成員以及和DLL函數(shù)的對(duì)應(yīng)關(guān)系見(jiàn)下表。表5-1PVicPort的ActiveX屬性成員以及和DLL函數(shù)的對(duì)應(yīng)關(guān)系A(chǔ)ctiveX屬性成員對(duì)應(yīng)功能的DLL函數(shù)OpenDriverOpenTVicPortActiveHWIsDriverOpenedCloseDriverCloseTVicPortHardAccessSetHardAccess、TestHardAccessPortReadPort、WritePortPortWReadPortW、WritePortWPortLReadPortL、WritePortLMapPhysToLinearMapPhysToLinearUnmapMemoryUnmapMemoryMemGetMem、SetMemMemWGetMemW、SetMemWMemLGetMemL、SetMemLLPTNumberGetLPTNumber、SetLPTNumberLPTNumPortsGetLPTNumPortsLPTBasePortGetLPTBasePortPinGetPin、SetPinLPTAckwlGetLPTAckwlLPTBusyGetLPTBusyLPTPaperEndGetLPTPaperEndLPTSlctGetLPTSlctLPTErrorGetLPTErrorLPTInitLPTInitLPTSlctInLPTSlctInLPTStrobeLPTStrobeLPTAutofdLPTAutofdTVicLPTTVicLPT是EnTech提供的并行接口的專用接口軟件,該軟件包本身不是免費(fèi)的,但公司網(wǎng)站上還提供了一個(gè)免費(fèi)TVicLPT全功能評(píng)估版本??梢栽贓nTech的網(wǎng)站/dev/index.shtm上下載。TVicLPT是需要安裝的,TVicLPT1.3版默認(rèn)的安裝目錄是C:\TVicLPT13,在該目錄下有Help目錄和各種語(yǔ)言的測(cè)試程序源代碼目錄。核心模塊TVicLPT.ocx和TVicLPT.sys被安裝到了系統(tǒng)目錄。TVicLPT功能說(shuō)明TVicLPT1.3版只提供ActiveX控件文件,沒(méi)有提供DLL方式的函數(shù)調(diào)用接口。該控件支持多種語(yǔ)言調(diào)用,在安裝的目錄下可以找到VB、MSVC、BorlandC++Builder和BorlandDelphi的測(cè)試程序代碼。TVicLPT的功能包括:?檢測(cè)標(biāo)準(zhǔn)的地址上的并行端口;-具備添加非標(biāo)準(zhǔn)的并行口的能力;?檢測(cè)并行口支持的模式,包括SPP、PS/2、EPP和ECP等;-可以在不進(jìn)行位操作的情況下實(shí)現(xiàn)并行口模式的轉(zhuǎn)換;?通過(guò)“名字”實(shí)現(xiàn)對(duì)并行口的直接訪問(wèn);-直接訪問(wèn)和操作LPT的連接器上的信號(hào);?實(shí)現(xiàn)硬件中斷的掛接。TVicLPT的ActiveX控件屬性成員下面以VB語(yǔ)法格式說(shuō)明TVicLPT的ActiveX控件的屬性成員。(1) 公共的屬性和方法object.Active[=value]功能:打開(kāi)/關(guān)閉設(shè)備驅(qū)動(dòng)程序,或檢測(cè)設(shè)備驅(qū)動(dòng)程序打開(kāi)狀態(tài)。參數(shù):Value為設(shè)置參數(shù),1表示打開(kāi)第一個(gè)驅(qū)動(dòng)程序?qū)嵗?表示打開(kāi)第二個(gè)驅(qū)動(dòng)程序?qū)嵗?表示關(guān)閉驅(qū)動(dòng)程序。返回:1表示成功打開(kāi)驅(qū)動(dòng)程序,0表示為打開(kāi)或打開(kāi)失敗。object.NumLPTs功能:檢測(cè)系統(tǒng)安裝的標(biāo)準(zhǔn)的LPT數(shù)目。參數(shù):無(wú)。返回:LPT數(shù)目。object.AddCustomPort(CustomBaseAddressAsInteger)功能:添加非標(biāo)準(zhǔn)的(無(wú)法通過(guò)NumLPTs檢測(cè)到的)LPT到系統(tǒng)。參數(shù):CustomBaseAddress為添加的LPT的基地址。返回:無(wú)。object.Acquired[=value]功能:鎖定當(dāng)前的LPT以防止被其他應(yīng)用程序訪問(wèn),或檢測(cè)鎖定狀態(tài)。該屬性成員只用于Windows9x/ME。參數(shù):value為設(shè)定值,1表示鎖定,0表示為鎖定或解除鎖定。返回:可以是以下常數(shù)(在lptCVT.bas中定義)LPT_NOT_ACQUIRED:未鎖定;LPT_ACQUIRE_SUCCESS:鎖定成功;LPT_ACQUIRE_REFUSED:已經(jīng)被另一個(gè)應(yīng)用程序鎖定;LPT_ACQUIRE_BAD_PORT:LPT號(hào)錯(cuò)誤或操作系統(tǒng)為Windows2000/XP;LPT_ACQUIRE_NOT_OPENED:設(shè)備驅(qū)動(dòng)程序未打開(kāi)。(2) 當(dāng)前LPT和模式的屬性和方法object.CurrentLPT[=value]功能:設(shè)置或獲得當(dāng)前LPT號(hào)。參數(shù):value為設(shè)定值,表示LPT號(hào)。返回:當(dāng)前LPT號(hào)。object.CurrentLptMode[=value]功能:設(shè)置或獲得當(dāng)前LPT的當(dāng)前工作模式。參數(shù):value為設(shè)定值,表示模式,可以是以下常數(shù)(在lptCVT.bas中定義)LPT_SPP_MODE:SPP模式;LPT_PS2_MODE:PS/2模式;LPT_EPP_MODE:EPP模式;LPT_FAST_CENTRONIX:Centronix模式;LPT_ECP_MODE:ECP模式。返回:獲得的當(dāng)前LPT的工作模式,值的定義同上。object.MaxLptMode功能:獲得當(dāng)前LPT支持的“最大”工作模式。參數(shù):無(wú)。返回:“最大”工作模式值??梢允且韵鲁?shù)(在lptCVT.bas中定義)LPT_NOT_PRESENT=0LPT_SPP_MODE=1LPT_PS2_MODE=2LPT_EPP_MODE=3LPT_FAST_CENTRONIX=4LPT_ECP_MODE=5object.EPPEnabled功能:檢測(cè)當(dāng)前的LPT是否支持EPP模式。參數(shù):無(wú)。返回:TRUE表示支持EPP,F(xiàn)ALSE表示不支持EPP模式。LPT寄存器相關(guān)的屬性和方法object.BasePortAddress功能:返回當(dāng)前LPT的基地址。參數(shù):無(wú)。返回:當(dāng)前LPT的基地址值。object.ReadMode[=value]功能:設(shè)置或返回當(dāng)前LPT的數(shù)據(jù)寄存器的讀寫(xiě)狀態(tài)。參數(shù):value為設(shè)定值,0表示“只寫(xiě)”,1表示“只讀”。SPP不支持“只讀”。返回:TRUE表示“只讀”模式,F(xiàn)ALSE表示“只寫(xiě)”模式。object.DataPort[=value]object.StatusPort[=value]object.ControlPort[=value]object.EcrPort[=value]object.CfgaPort[=value]object.CfgbPort[=value]object.FifoPort[=value]object.EPPAddressPort[=value]object.EPPDataPort[=value]功能:以上9個(gè)屬性成員用于從當(dāng)前LPT不同的寄存器讀或向當(dāng)前LPT不同的寄存器寫(xiě)數(shù)據(jù)。它們針對(duì)的寄存器分別為數(shù)據(jù)寄存器、狀態(tài)寄存器、控制寄存器、ECR寄存器、CFGA寄存器、CFGB寄存器、FIFO寄存器、EPP地址寄存器和EPP數(shù)據(jù)寄存器。參數(shù):value為設(shè)定值,為寫(xiě)到當(dāng)前LPT的相應(yīng)寄存器的數(shù)據(jù)。返回:從當(dāng)前LPT的相應(yīng)寄存器讀出的數(shù)據(jù)。LPT寄存器位相關(guān)的屬性和方法object.DataPortBit(BitNumberAsInteger)[=value]object.StatusPortBit(BitNumberAsInteger)[=value]object.ControlPortBit(BitNumberAsInteger)[=value]object.EcrPortBit(BitNumberAsInteger)[=value]object.CfgaPortBit(BitNumberAsInteger)[=value]object.CfgbPortBit(BitNumberAsInteger)[=value]功能:以上6個(gè)屬性用于設(shè)置或返回當(dāng)前LPT的不同寄存器的指定位。6個(gè)不同屬性分別對(duì)應(yīng)數(shù)據(jù)寄存器、狀態(tài)寄存器、控制寄存器、ECR寄存器、CFGA和CFGB寄存器。參數(shù):BitNumber參數(shù)為位序號(hào),0~7。value為設(shè)定值,0或1。返回:獲得的不同的寄存器的指定位的值,0或1。(5) LPT連接器位相關(guān)的屬性和方法object.Pin(PinNumberAsInteger][=value]功能:用于設(shè)置或返回當(dāng)前LPT的DB25連接器上的指定線的信號(hào)狀態(tài)。當(dāng)前LPT的讀寫(xiě)狀態(tài)(由ReadMode屬性設(shè)定)將影響該屬性成員的執(zhí)行。參數(shù):PinNumber參數(shù)為連接器線序號(hào),1~25。value為設(shè)定值,0或1。返回:獲得的線狀態(tài),TRUE為高電平,F(xiàn)ALSE為低電平。object.PulseStrobe(By^alDelayCyclesAsLong)功能:在當(dāng)前LPT的Strobe線(DB25的1號(hào)引腳)輸出一個(gè)短暫的正脈沖。參數(shù):DelayCycles參數(shù)為一個(gè)和輸出脈沖寬度相關(guān)的相對(duì)時(shí)間間隔,如為0表示盡可能的短。返回:無(wú)。object.PulseStrobeAndWaitBus(TimeOutAsInteger)功能:在當(dāng)前LPT的Strobe線(DB25的1號(hào)引腳)輸出一個(gè)短暫的正脈沖,但只有當(dāng)外設(shè)送到接口的BUSY線信號(hào)變?yōu)橛行顟B(tài)才結(jié)束Strobe線的脈沖。參數(shù):TimeOut參數(shù)為一個(gè)相對(duì)的時(shí)間間隔表示等待BUSY信號(hào)的超時(shí)時(shí)間。返回:TRUE表示成功,未超時(shí);FALSE表示超時(shí)。(6) 中斷相關(guān)的屬性和方法object.IrqNumber[=value]功能:設(shè)置和獲得當(dāng)前LPT的中斷號(hào)。參數(shù):value是一個(gè)設(shè)定值,指定中斷號(hào),取值范圍為1?15。通常LPT1使用中斷7,LPT2使用中斷5。返回:當(dāng)前使用的中斷號(hào)。object.UnmaskIRQ功能:解除當(dāng)前LPT中斷屏蔽,當(dāng)硬件產(chǎn)生,將引發(fā)一個(gè)LptInterrupt事件。參數(shù):無(wú)。返回:無(wú)。object.MaskIRQ功能:屏蔽當(dāng)前LPT中斷。參數(shù):無(wú)。返回:無(wú)。object.IrqCounter功能:獲得當(dāng)前LPT發(fā)生的中斷數(shù)量。參數(shù):無(wú)。返回:中斷數(shù)。object_LptInterruptBjV^ZDataPortAsInteger,ByValStatusPortAsInteger,_ByValTimeStampLoAsLong,ByValTimeStampHiAsLong)功能:當(dāng)LPT的硬件產(chǎn)生中斷時(shí)調(diào)用的函數(shù)。參數(shù):DataPort和StatusPort產(chǎn)生中斷時(shí)的數(shù)據(jù)寄存器和狀態(tài)寄存器,TimeStampLo和TimeStampHi分別為時(shí)間郵票的低半部分和高半部分,參見(jiàn)API函數(shù)QueryPerformanceCounter()。批量讀寫(xiě)相關(guān)的方法object.ReadEppByteArrayfByValNumOfBytesAsLong,ByRefByteBufferAsAny)object.ReadEppWordArray(ByValNumOfWordsAsLong,ByRefWordBufferAsAny)object.ReadEppLongArray(ByValNumOfDWordsAsLong,ByRefLongBufferAsAny)功能:這三個(gè)函數(shù)使用在EPP模式,分別用于讀取字節(jié)、字和雙字型數(shù)組。參數(shù):NumOfBytes、NumOfWords和NumOfDWords分別為三個(gè)函數(shù)讀取的字節(jié)、字和雙字?jǐn)?shù),ByteBuffer、WordBuffer和LongBuffer分別為三個(gè)函數(shù)的輸入數(shù)據(jù)緩沖區(qū)。object.WriteEppByteArray(ByValNumOfBytesAsLong,ByRefByteBufferAsAny)object.WriteEppWordArray(ByValNumOfWordsAsLong,ByRefWordBufferAsAny)object.WriteEppLongArray(ByValNumOfDWordsAsLong,ByRefLongBufferAsAny)功能:這三個(gè)函數(shù)使用在EPP模式,分別用于向LPT寫(xiě)字節(jié)、字和雙字型數(shù)組。參數(shù):NumOfBytes、NumOfWords和NumOfDWords分別為三個(gè)函數(shù)要寫(xiě)入的字節(jié)、字和雙字?jǐn)?shù),ByteBuffer、WordBuffer和LongBuffer分別為三個(gè)函數(shù)的輸出數(shù)據(jù)緩沖區(qū)。5.2一個(gè)PC對(duì)等連接的并行接口測(cè)試實(shí)驗(yàn)進(jìn)行并行接口實(shí)驗(yàn)的簡(jiǎn)單方法是將兩臺(tái)pc通過(guò)一條并行接口電纜連接起來(lái),可以通過(guò)軟件測(cè)試并行接口的一些特性。本節(jié)介紹一個(gè)這樣的并行接口實(shí)驗(yàn)。5.2.1對(duì)等連接工作模式在對(duì)等連接中,并行接口必須工作在可以雙向傳輸?shù)哪J?,在現(xiàn)有的IEEE-1284標(biāo)準(zhǔn)中,PS/2、EPP和ECP支持字節(jié)雙向傳輸。在這三種模式中,PS/2和ECP模式比較適合對(duì)等連接。在PS/2模式中,握手信號(hào)可以自由的收程序的控制,本實(shí)驗(yàn)選擇PS/2模式。連接電纜由于并行接口最初的設(shè)計(jì)是針對(duì)打印機(jī)的,盡管在后續(xù)的升級(jí)中增加了多種模式,但有一點(diǎn)是沒(méi)有改變的,就是并行接口的設(shè)計(jì)是用于連接主機(jī)與外設(shè)的,如果使用并行接口連接兩臺(tái)主機(jī),實(shí)現(xiàn)對(duì)等連接,可能要對(duì)接口信號(hào)線的功能作一些調(diào)整,設(shè)計(jì)一個(gè)合理的連接方案是遇到的第一個(gè)問(wèn)題。在并行接口的信號(hào)線中,有8條雙向數(shù)據(jù)線D0?D7,8條地線,4條控制輸出線和5條狀態(tài)輸入線。通過(guò)連接電纜將兩端PC并行口的數(shù)據(jù)線和地線對(duì)應(yīng)引腳連接,再將一端的4條控制輸出線與另一端的5條狀態(tài)輸入線中的4條連接。下面的連接中可考慮到了ECP
模式的信號(hào)連接關(guān)系。表5-2并行接口的ECP模式PC-PC連接電纜A端計(jì)卜算機(jī)接口線中間連接B端計(jì)算機(jī)接口線信號(hào)名寄存器位線號(hào)線號(hào)寄存器位信號(hào)名nStrobeC01>>10S6nAck數(shù)據(jù)線D02[1k]2D0數(shù)據(jù)線D13[1k]3D1D24[1k]4D2D35[1k]5D3D46[1k]6D4D57[1k]7D5D68[1k]8D6D79[1k]9D7nAckS610<<1C0nStrobeBusyS711<<14C1nAutoFdPErrorS512<<16C2nInitnAutoFdC114>>11S7BusySelectS413<<17C3nSelectInnInitC216>>12S5PErrornSelectInC317>>13S4SelectGround18..2518..25Ground電纜的連接關(guān)系如下圖。
圖5-1ECP的PC-PC連接器關(guān)系5.2.2軟件設(shè)計(jì)測(cè)試程序在VB下設(shè)計(jì),并行接口的操作通過(guò)TVicLPT控件實(shí)現(xiàn)。1.測(cè)試程序的功能測(cè)試程序是為了測(cè)試并行接口在PS/2模式的功能,主要實(shí)現(xiàn)以下功能:?可以完成對(duì)控制寄存器的位操所,通過(guò)對(duì)控制寄存器的位操作實(shí)現(xiàn)對(duì)接口信號(hào)線的狀態(tài)控制;?可以實(shí)時(shí)檢測(cè)信號(hào)線的狀態(tài),這是通過(guò)讀狀態(tài)寄存器實(shí)現(xiàn)的。需要在定時(shí)器的控制下讀取狀態(tài)寄存器;-可以實(shí)現(xiàn)對(duì)數(shù)據(jù)寄存器的讀寫(xiě);?可以檢測(cè)中斷的產(chǎn)生;?可以實(shí)現(xiàn)字符傳輸。2.程序定時(shí)的實(shí)現(xiàn)雖然在程序中使用了Timer控件,但是不能使用該控件完成超時(shí)控制,Timer控件定時(shí)器完成超時(shí)控制會(huì)出現(xiàn)以下問(wèn)題:-VB中的Timer控件產(chǎn)生的時(shí)間間隔的精度很低,它的硬件時(shí)鐘的更新頻率為每秒約18次,不能完成高精度的定時(shí)要求;在程序上,如果采用查詢控制方式,接收程序代碼部分實(shí)際上是在狀態(tài)查詢定時(shí)器的事件觸發(fā)下執(zhí)行的,這樣在接收數(shù)據(jù)的過(guò)程中就無(wú)法使用狀態(tài)查詢定時(shí)器完成計(jì)時(shí)。本程序中使用一個(gè)系統(tǒng)定時(shí)器,通過(guò)API函數(shù)獲得定時(shí)器的當(dāng)前值,相關(guān)的API函數(shù)為QueryPerformanceCounter和QueryPerformanceFrequency,分別用于獲得系統(tǒng)定時(shí)器的計(jì)數(shù)值和技術(shù)頻率。需要在VB程序中對(duì)這兩個(gè)API函數(shù)聲明,用以下代碼聲明。DeclareFunctionQueryPerformanceCounterLib"Kernel32”(XAsCurrency)AsBooleanDeclareFunctionQueryPerformanceFrequencyLib"Kernel32”(XAsCurrency)AsBoolean在讀數(shù)據(jù)、寫(xiě)數(shù)據(jù)和等待一個(gè)狀態(tài)時(shí)都可以在開(kāi)始時(shí)刻調(diào)用QueryPerformanceCounter函數(shù)獲得開(kāi)始的時(shí)刻,在操作過(guò)程中再調(diào)用該函數(shù)獲得當(dāng)前的時(shí)間,用以下公式計(jì)算時(shí)間:(當(dāng)前時(shí)刻一開(kāi)始時(shí)刻)『定時(shí)器頻率在程序中可以使用以下語(yǔ)句獲得系統(tǒng)定時(shí)器頻率SysCountFrequency:Result=QueryPerformanceFrequency(SysCountFrequency)在需要記憶時(shí)間的位置插入以下語(yǔ)句可以獲得當(dāng)時(shí)的系統(tǒng)定時(shí)器常數(shù)SysCount:Result=QueryPerformanceCounter(SysCount)程序使用的控件說(shuō)明程序使用VB實(shí)現(xiàn)。首先建立一個(gè)StandardEXE工程,將TVicLPTActiveXControlModule加入到VB的Form中,默認(rèn)名稱是TVicLPTl。程序中添加的全部控件見(jiàn)下表。表5-3并行接口對(duì)等連接測(cè)試程序使用的控件控件名稱控件類型功能說(shuō)明TVicLPTlTVicLPT訪問(wèn)接口的控件frmModeFrame包含optPS2Mode和optECPMode的容器optPS2ModeOptionButton選擇PS/2模式optECPModeOptionButton選擇ECP模式frmlnterruptFrame包含中斷和傳送的控件容器chkInterruptCheckBox控制中斷使能lblAckIntLabel中斷計(jì)時(shí)器,計(jì)數(shù)由nAck產(chǎn)生的中斷txtDataTrsTextBox傳送的數(shù)據(jù)字節(jié)值,發(fā)送后程序控制加1txtDataRcvTextBox接收到的數(shù)據(jù)字節(jié)值cmdTransCommandButton數(shù)據(jù)字節(jié)發(fā)送按鈕chkReadyCheckBox用于設(shè)定接收就緒狀態(tài)cmdReadDataCommandButton讀取數(shù)據(jù)寄存器
cmdWriteDataCommandButton寫(xiě)數(shù)據(jù)寄存器txtDataTextBox數(shù)據(jù)寄存器的讀寫(xiě)數(shù)據(jù)lblDataLabel數(shù)據(jù)寄存器的讀寫(xiě)數(shù)據(jù)的十六進(jìn)制和二進(jìn)制cmdRegisterCommandButton讀取控制寄存器和狀態(tài)寄存器按鈕chkAutoRegisterCheckBox自動(dòng)讀取控制寄存器和狀態(tài)寄存器使能cmdControl()CommandButton陣列,用于改變狀態(tài)寄存器的位lblStatus()Label陣列,用于顯示狀態(tài)寄存器的位Timer1Timer自動(dòng)讀取控制和狀態(tài)寄存器的定時(shí)器程序界面程序設(shè)計(jì)界面如下。圖5-2并行接口對(duì)等連接測(cè)試程序界面程序運(yùn)行后,如果并行接口支持PS/2模式,LPTMode容器中的PS/2選中。右下方的6個(gè)按鈕對(duì)應(yīng)控制寄存器的C0?C5位,可以通過(guò)按鈕分別控制對(duì)應(yīng)位的值,C0?C4分別對(duì)應(yīng)接口的1(nStrobe)、14(nAutoFd)、16(nInit)和17(nSelectIn)引腳,C4為IRQEnable,中斷使能控制,C5位是方向控制位。狀態(tài)寄存器的S2?S7位有定義,S2(IRQ)為中斷狀態(tài)位,S3?S7為接口引腳15(nFault)、13(Select)、12(PError)、10(nAck)和11(Busy)的狀態(tài)。當(dāng)AutoRegisiter選中,狀態(tài)位顯示的更新通過(guò)定時(shí)器自動(dòng)完成,否則需要通過(guò)Regisiter按鈕手動(dòng)更新顯示。ReadData和WriteData按鈕分別用于讀、寫(xiě)數(shù)據(jù)寄存器。下方顯示數(shù)據(jù)寄存器的數(shù)值。TransData容器用于控制中斷和數(shù)據(jù)傳輸,發(fā)送方按TransData按鈕可以發(fā)送數(shù)據(jù)到對(duì)方,接收方需要選中ReadyReceive,使得接收PC機(jī)處于接收就緒狀態(tài)。在數(shù)據(jù)傳送過(guò)程中,發(fā)送方?jīng)]發(fā)送一個(gè)字節(jié),發(fā)送數(shù)據(jù)字節(jié)值自動(dòng)加1。接收方可以觀察中斷計(jì)數(shù)值InterruptCount確認(rèn)中斷的產(chǎn)生,以及接收數(shù)據(jù)值確認(rèn)傳輸?shù)恼_性。程序代碼全程變量DimSRAsByte,CRAsByte,ECRAsByteDimResultAsBooleanDimSysCountFrequencyAsCurrency,SysCount1AsCurrency,SysCount2AsCurrency選擇定時(shí)器控制自動(dòng)更新寄存器,打開(kāi)、關(guān)閉定時(shí)器PrivateSubchkAutoregister_Click()IfchkAutoRegister.Value=0ThenTimer1.Enabled=FalseElseTimer1.Enabled=TrueEndIfEndSub選擇打開(kāi)、關(guān)閉中斷PrivateSubchkInterrupt_Click()IfchkInterrupt.Value=0ThenTVicLPT1.MaskIrqElseTVicLPT1.UnmaskIrqEndIfEndSub設(shè)定、取消接收就緒PrivateSubchkReady_Click()IfchkReady.Value=1ThenTVicLPT1.ControlPortBit(0)=0TVicLPT1.ControlPortBit(1)=1TVicLPT1.ControlPortBit(5)=1chkInterrupt.Value=1TVicLPT1.UnmaskIrqTimer1.Enabled=FalsechkAutoRegister.Value=0ElsechkInterrupt.Value=0TVicLPTl.MaskIrqTimerl.Enabled=TruechkAutoRegister.Value=1EndIfEndSub讀取控制和狀態(tài)寄存器內(nèi)容PrivateSubcmdregister_Click()Timer1_TimerEndSub傳輸字節(jié)到對(duì)方計(jì)算機(jī)PrivateSubcmdTrans_Click()IfTVicLPT1.StatusPortBit(7)=0ThenExitSubTVicLPT1.ControlPortBit(5)=0TVicLPT1.DataPort=Val(txtDataTrs.Text)TVicLPT1.ControlPortBit(0)=1TVicLPT1.ControlPortBit(0)=0IfWaitStatus(100,7,1)ThenTVicLPT1.ControlPortBit(1)=0IfWaitStatus(100,7,0)ThentxtDataTrs.Text=IIf(Val(txtDataTrs.Text)=255,"0”,Str(Val(txtDataTrs.Text)+1))EndIfTVicLPT1.ControlPortBit(1)=1EndIfTVicLPT1.ControlPortBit(5)=1EndSub中斷處理,讀取數(shù)據(jù)并完成握手PrivateSubTVicLPT1_LptInterrupt(ByValDataValueAsInteger,ByValStatusValueAsInteger,_ByValLoTimeStampAsLong,ByValHiTimeStampAsLong)IfTVicLPT1.StatusPortBit(6)=1ThentxtDataRcv.Text=TVicLPT1.DataPortTVicLPT1.ControlPortBit(1)=0txtACKInt.Text=Str(Val(txtACKInt.Text)+1)IfWaitStatus(100,7,0)ThenTVicLPT1.ControlPortBit(1)=1TVicLPT1.ControlPortBit(1)=1EndIfEndSub延時(shí)或等待狀態(tài)寄存器特定位的變化,SValue為0、1之外的其他數(shù)為延時(shí)功能TimeOut:延時(shí)或等待時(shí)間(ms),SNo:狀態(tài)寄存器位序,SValue:期待的變化值PrivateFunctionWaitStatus(TimeOutAsSingle,SNoAsByte,SValueAsByte)DimdelayAsSingleWaitStatus=TrueResult=QueryPerformanceCounter(SysCount1)DoResult=QueryPerformanceCounter(SysCount2)delay=(SysCount2-SysCount1)/SysCountFrequency*1000'msLoopWhiledelay<TimeOutAndTVicLPT1.StatusPortBit(SNo)<>SValueIfdelay>=TimeOutThenWaitStatus=FalseEndFunction操作控制寄存器,Index為控制寄存器位序PrivateSubcmdControl_Click(IndexAsInteger)IfcmdControl(Index).Caption="0"ThencmdCont
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融行業(yè)前臺(tái)咨詢工作總結(jié)
- 營(yíng)銷行業(yè)創(chuàng)新實(shí)踐總結(jié)
- 無(wú)人駕駛技術(shù)的前景展望
- IT行業(yè)銷售員工作總結(jié)
- 電力行業(yè)可再生能源發(fā)展顧問(wèn)工作總結(jié)
- 書(shū)店美容院保安工作經(jīng)驗(yàn)
- 金融行業(yè)中理財(cái)咨詢顧問(wèn)的工作要求
- 旅游行業(yè)導(dǎo)游培訓(xùn)總結(jié)
- 【八年級(jí)下冊(cè)地理湘教版】專項(xiàng)04 時(shí)政地理
- 2024年稅務(wù)師題庫(kù)附參考答案【輕巧奪冠】
- 衛(wèi)生化學(xué)期末考試習(xí)題2
- 瓣周漏護(hù)理查房
- 歷代反腐完整
- 《現(xiàn)代控制理論》(劉豹-唐萬(wàn)生)
- 廣東省佛山市南海區(qū)三水區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末歷史試題(無(wú)答案)
- 重視心血管-腎臟-代謝綜合征(CKM)
- 譯林版小學(xué)英語(yǔ)六年級(jí)上冊(cè)英文作文范文
- 學(xué)術(shù)英語(yǔ)(理工類)
- 淺談“五育并舉”背景下中小學(xué)勞動(dòng)教育的探索與研究 論文
- 大樹(shù)的故事 單元作業(yè)設(shè)計(jì)
- 六年級(jí)道德與法治學(xué)情分析
評(píng)論
0/150
提交評(píng)論