PCM-16xx系列工業(yè)多串口卡可以應用于傳統(tǒng)的RS-232/422/485串行通訊領域,快速擴充PC機標準COM通訊端口的數(shù)量。兼容PC/104規(guī)范,即插即用;集成4個串行通訊端口;同一PC可安裝多達8塊同型號卡;RS-232端口最高速率可達921.6Kbps;PCM-16xx系列工業(yè)多串口卡提供2~8個RS-232/422/485通訊端口,每個端口的通訊速率可以高達921.64Kbps。多串口卡采用工業(yè)級設計,每一個通訊端口都集成防浪涌30KV ESD保護,可選的高速電氣隔離保護。同一PC最多可安裝8塊同一型號的PCM-16xx工業(yè)多串口卡。
上傳時間: 2013-11-08
上傳用戶:zl5712176
PCM-8416AS是一款功能強大的高分辨率多功能PC/104數(shù)據(jù)采集卡,提供有16路模擬信號輸入、2路模擬信號輸出、8路數(shù)字量輸入、8路數(shù)字量輸出、2個定時/計數(shù)器,單塊卡即可滿足工業(yè)應用中常用的采集與控制功能擴展。
上傳時間: 2013-10-28
上傳用戶:hn891122
關鍵詞 串口擴展,多路通信,數(shù)據(jù)采集摘 要本文檔介紹了采用 Actel Flash 架構的FPGA 實現(xiàn)擴展多路串口功
上傳時間: 2013-11-13
上傳用戶:13160677563
基于單片機的陶瓷窯多點溫度檢測系統(tǒng):摘 要:系統(tǒng)以51單片機為核心,利用K型熱電偶作為傳感器,對陶瓷窯中多點溫度進行監(jiān)控,通過串行通信,可供PC機上繪制溫度變化曲線圖的技術人員分析問題,并設計了新穎的冷端補償電路和通用查表法,本系統(tǒng)成本低,測溫精度高,可靠實用.關鍵詞:單片機;串行通信;冷端溫度補償;VB 在燒結陶瓷時,火候的控制對陶瓷的質量、色澤有直接的影響,進一步影響陶瓷成品的價格,而長期以來控制火候的工作就依靠工人師傅的經(jīng)驗,本文設計了一種多點溫度實時監(jiān)控系統(tǒng),它能在Pc機上實時顯示測量點的溫度而且如果溫度超過設定的臨界值時,就發(fā)出信號報警,并且可以通過Pc機繪制同一個時刻不同點或者是不同時刻同一點的溫度變化曲線.這樣能有助于發(fā)現(xiàn)問題并解決問題,為節(jié)約成本和提高生產(chǎn)率、生產(chǎn)質量做出貢獻.
上傳時間: 2013-10-16
上傳用戶:lhuqi
高壓雙管反激變換器的設計:介紹一種雙管反激的電路拓撲,分析了其工作原理,給出了一些關鍵技術參數(shù)的計算公式,設計并研制成功的30W 380V AC5 0H z/510V DC/+15.1 V DC(1A )、+5.2VDC(2A)輔助開關電源具有功率密度高、變換效率高、可靠性高等優(yōu)良的綜合性能。該變換器在高電壓輸人情況下有重要的應用價值。【關 鍵 詞 】變換器,輔助開關電源,雙管反激 [Abstract】 A n e wt opologyfo rd oubles witchfl ybackc onverteris in troduced.Th eo perationp rincipleis a nalyzeda nds ome for mulas for calculating key parameters for the topology are presented. The designed and produced auxiliary switching power supply,i. e. 30W 380V AC5 0H z/5 10V DC/+15.1 V DC《1A )、+5.2 V DC《2A ),hase xcellentc omprehensivep erformances sucha sh ighp owerd ensity, hi ghc onversione fficiencya ndh ighr eliability.Th isc onverterh asim portanta pplicationv aluef orh igh input voltag [Keywords ]converter,au xiliary switchingp owers upply,do ubles witchf lybac
上傳時間: 2013-11-01
上傳用戶:Ants
多功能高集成外圍器件6. 1 多功能高集成外圍器件82371PCI的英文名稱:Peripheral Component Interconnect (外圍部件互聯(lián)PCI總線);82371是PCI總線組件。ISA是:Industry Standard Architecture(工業(yè)標準體系結構)IDE是 (Integrated Device Electronics)集成電路設備簡稱PIIX4PIIX4器件(芯片)的特點1、是一種支持Pentium和PentiumII微處理器的部件。2、82371對ISA橋來說,是一種多功能PCI總線。3、對可移動性和桌面深綠色環(huán)境均提供支持。4、電源管理邏輯。5、被集成化的IDE控制器。6、增強了性能的DMA控制器。(7)基于兩個82C59的中斷控制器。(8)基于82C54芯片的定時器。(9)USB(Universal Serial Bus)通用串行總線。(10)SMBus系統(tǒng)管理總線。(11)實時時鐘(12)順應Microsoft Win95所需的功能其芯片的邏輯框圖如圖6-1所示。 PIIX4芯片邏輯框圖6.1.1 概述PIIX4芯片是一個多功能的PCI器件,圖6-2 是82371在系統(tǒng)中扮演的角色。(續(xù)上圖)1. PCI與EIO之間的橋(PIIX4芯片)橋是不對程的,是各類不同標準總線與PCI總線連接,82371AB橋也可理解為一種總線轉換譯碼器和控制器,橋內包含復雜的協(xié)議總線信號和緩沖器。(1).在PCI系統(tǒng)內,當PIIX4操作時,它總是作為系統(tǒng)內各種模塊的主控設備,如USB和DMA控制器、IDE總線和分布式DMA的主控設備等,而且總是以ISA主控設備的名義出現(xiàn)。(2). 在向ISA總線或IDE總線進行傳送操作的傳送周期期間作為從屬設備使用,并對內部寄存器譯碼。PIIX4芯片(橋)的配置(1).可以把PIIX4芯片配置成整個ISA總線,或ISA總線的子集,也可擴展成EIO總線。在使用EIO總線時,可以把未使用的信號配置成通用的輸入和輸出。(2).PIIX4可直接驅動5個ISA插槽;(3).能提供字節(jié)-交換邏輯、I/O的恢復支持、等待狀態(tài)的生成以及SYSCLK的生成。(4).提供X-BUS鍵盤控制器芯片、BIOS芯片、實時時鐘芯片、二級微程序器等的選擇。2. IDE接口(總線主控設備的權利和同步DMA方式)IDE接口為4個IDE的設備提供支持,比如IDE接口的硬盤和CD-ROM等。注意:目前硬盤接口有5類:IDE、SCSI、Fibre Channel、IEEE1394和USB等。IDE口幾乎在PC機最多,因為便宜。SCSI多用于服務器和集群機。IDE的PIO IDE速率:14MB/s;而總線主控設備IDE的速率:33MB/s在PIIX4芯片的IDE系統(tǒng)內,配有兩個各次獨立的IDE信號通道。3. 具有兼容性的模塊—DMA、定時器/計數(shù)器、中斷控制器等(1)在PIIX4內的兩各82C37 DMA控制器經(jīng)邏輯的組合,產(chǎn)生7個獨立的可編程通道。通道[0:3]是通過與8個二進位的硬件連線實現(xiàn)的。通過以字節(jié)為單位的計數(shù)進行傳送。而通道[5:7]是通過16個二進位的連線實現(xiàn)的,以字為單位的計數(shù)進行傳送。(2)DMA控制器還能通過PCI總線,處理舊的DMA的兩個不同的方法提供支持。(3)計數(shù)/定時器模塊在功能上與82C54等價。(4)中斷控制器與ISA兼容,其功能是兩個82C59的功能之和。
上傳時間: 2013-11-19
上傳用戶:3到15
用單片機制作多功能莫爾斯碼電路:用單片機制作多功能莫爾斯碼電路莫爾斯電碼通信有著悠久的歷史,盡管它已被現(xiàn)代通信方式所取代,但在業(yè)余無線電通信和特殊的專業(yè)場合仍具有重要的地位,這是因為等幅電碼通信的抗干擾能力是其它任何一種通信方式都無法相比的。在短波波段用幾瓦的功率即可進行國際間的通信,收發(fā)射設備簡單易制成本低廉,所以深受業(yè)余無線電愛好者的喜愛,是業(yè)余無線電高手必備的技能。要想熟練掌握莫爾斯電碼的收發(fā)技術除了持之以恒的毅力外,還需要相關的設備。設計本電路的目的就是給愛好者提供一個實用和訓練的工具。 一、功能簡介 本電路可以配合自動鍵體和手動鍵體,產(chǎn)生莫爾斯碼控制信號,設有16種速度,從初學者到操作高手都能適用。監(jiān)聽音調也有16種,均可以通過功能鍵進行選擇。可以按程序中設定好的呼號自動呼叫,設有聽抄練習功能,聽抄練習有短碼和混合碼兩種模式,分別對10個數(shù)字和常用的38個混合碼模擬隨機取樣,產(chǎn)生分組報碼,供愛好者提高抄收水平之用,速度低4檔的聽抄練習是專為初學者所設,內容是時間間隔較長的單字符。設有PTT開關鍵,可以決定是否控制發(fā)射機工作,不需要反復通斷控制線。無論當前處于呼叫狀態(tài)還是聽抄狀態(tài)只要電鍵接點接通則自動轉到人工發(fā)報程序。4分鐘內不使用電路將自動關閉電源,只有按復位鍵才能重新開始工作。先按住聽抄練習鍵復位則進入短碼練習狀態(tài),其它功能不變。從開機到自動關機執(zhí)行每個功能都有不同的莫爾斯碼提示音。本電路具有較強的抗高低頻干擾的能力和使用方便的大電流開關接口,以適應不同的發(fā)射設備。 二、硬件電路原理硬件電路如圖1所示。設計電路的目的在于方便實用,以免在緊張的操作中失誤,所以除了聽抄練習鍵外其它鍵沒有定義復用功能。各鍵的作用在圖中已經(jīng)標出。PTT控制在每次復位時處于關閉狀態(tài),每按動一次PTT功能鍵則改變一次狀態(tài),這樣可以使用軟件開關控制發(fā)射。 PTT處于控制狀態(tài)時發(fā)光二極管隨控制信號閃亮。考慮到自制設備及淘汰軍用設備與高檔設備控制電流的不同,PTT開關管采用了2SC2073,可以承受500mA的電流,同時還增加了無極性PTT開關電路,無論外部被控制的端口直流極性如何加到VT3的極性始終不變,供有興趣的愛好者實驗。應該注意,如果被控制的負載是感性,則電感兩端必須并聯(lián)續(xù)流二極管,除自制設備外成品機在這方面一般沒有什么問題。手動鍵只有一個接點,接通后產(chǎn)生連續(xù)的音頻和發(fā)射控制信號。在本電路中手動鍵的輸入端是P1.5 ,程序不斷檢測P1.5電平,當按鍵按下時P1.5電平為0,程序轉入手動鍵子程序。 自動鍵的接點分別接到P1.3和P1.4 ,同樣當程序檢測到有接點閉合時便自動產(chǎn)生“點”或“劃”。音頻信號從P輸出,經(jīng)VT1放大后推動揚聲器發(fā)音。單片機的I/O口在輸入狀態(tài)下阻抗較高,容易受到高低頻信號干擾,所以在每個輸入端口和三極管的be端并聯(lián)電阻和高頻旁路電容,確保在較長的電鍵連線和大功率發(fā)射時電路工作穩(wěn)定。圖2是印刷電路版圖,尺寸為110mmX85mm,揚聲器用粘合劑直接粘接在電路版有銅箔的面。 三、軟件設計方法 “點”時間長度是莫爾斯電碼中的基本時間單位。按規(guī)定“劃”的時間長度不小于三個“點”,同字符中“點”與“劃”的間隔不小于一個“點”,字符之間不小于一個“劃”,詞與詞之間不應小于五個“點”。在本程序中用條件轉移指令來產(chǎn)生“點”時間長度。通過速度功能鍵功可以設置16種延時參數(shù)。用T0中斷產(chǎn)生監(jiān)聽音頻信號,并將中斷設為優(yōu)先級,保證在聽覺上純正悅耳。T1用于自動關機計時,如果不使用任何功能四分鐘后將向PCON 位寫1,單片機進入休眠狀態(tài),此時耗電量僅有幾個微安。自動鍵的“點”或“劃”以及手動鍵的連續(xù)發(fā)音都是子程序的反復調用。P1.2對地短接時自動呼叫可設定為另一內容。為了便于熟悉匯編語言的讀者對發(fā)音內容進行修改,這里介紹發(fā)音字符的編碼方法。莫爾斯碼的信息與計算機中二進制恰好相同,我們可以用0表示“點”,用1表示“劃”。提示音、自動呼叫、聽抄內容等字符是預先按一定編碼方式存儲在程序中的常數(shù)。每個字符的莫爾斯碼一般是由1至6位“點”、“劃”組成,也就是發(fā)音次數(shù)最多6次。程序中每個字符占用1個字節(jié),字符時間間隔不占用字節(jié),但更長的延時或發(fā)音結束信息占用一個字節(jié)。我們用字節(jié)的低三位表示字節(jié)的性質,對于5次及5次以下發(fā)音的字符我們用存儲器的高5位存儲發(fā)音信息,發(fā)音順序由高位至低位,用低3位存儲發(fā)音次數(shù),發(fā)音時將數(shù)據(jù)送入累加器A,先得到發(fā)音次數(shù),然后使A左環(huán)移,對E0進行位尋址,判斷是發(fā)“點”還是“劃”,環(huán)移次數(shù)由發(fā)音次數(shù)決定。對于6次發(fā)音的字符不能完全按照上述編碼規(guī)則,否則會出現(xiàn)信息重疊,如果是6次發(fā)音且最后一次是“劃”我們把發(fā)音次數(shù)定義為111B,因為這時第6次位尋址得到的是1。如果第6次發(fā)音是“點”,那么這個字符的低三位定義為000B。字符間隔時間由程序自動產(chǎn)生,更長的時間隔或結束標志由字節(jié)低三位110B來定義,高半字節(jié)表示字符間隔的倍數(shù),例如26H表示再加兩倍時間間隔。如果字節(jié)為06H則表示讀字符程序結束,返回主程序。更詳細的內容不再贅述,讀者可閱讀源程序。四、使用注意事項手動鍵的操作難度相對大一些,時間節(jié)拍全由人掌握,其特點是發(fā)出的電碼帶有“人情味”。自動鍵的“點”、“劃”靠電路產(chǎn)生,發(fā)音標準,容易操作,而且可以達到相當快的速度,長時間工作也不易疲勞。在干擾較大、信號微弱的條件下自動鍵碼的辨別程度好于手動鍵碼。初學者初次使用手動鍵練習發(fā)報要有老師指導,且不可我行我素,一旦養(yǎng)成不正確的手法則很難糾正。在電臺上時常聽到一些讓對方難以抄收的電碼,這可能會使對方反感而拒絕回答。使用自動鍵也應在一定的聽抄基礎上再去練習。在暫時找不老師的情況下可多練習聽力,這對于今后能夠發(fā)出標準正確的電碼非常有益。
上傳時間: 2013-10-31
上傳用戶:sdq_123
多路電壓采集系統(tǒng)一、實驗目的1.熟悉可編程芯片ADC0809,8253的工作過程,掌握它們的編程方法。2.加深對所學知識的理解并學會應用所學的知識,達到在應用中掌握知識的目的。 二、實驗內容與要求1.基本要求通過一個A/D轉換器循環(huán)采樣4路模擬電壓,每隔一定時間去采樣一次,一次按順序采樣4路信號。A/D轉換器芯片AD0809將采樣到的模擬信號轉換為數(shù)字信號,轉換完成后,CPU讀取數(shù)據(jù)轉換結果,并將結果送入外設即CRT/LED顯示,顯示包括電壓路數(shù)和數(shù)據(jù)值。2. 提高要求 (1) 可以實現(xiàn)循環(huán)采集和選擇采集2種方式。(2)在CRT上繪制電壓變化曲線。 三、實驗報告要求 1.設計目的和內容 2.總體設計 3.硬件設計:原理圖(接線圖)及簡要說明 4.軟件設計框圖及程序清單5.設計結果和體會(包括遇到的問題及解決的方法) 四、總體設計設計思路如下:1) 4路模擬電壓信號通過4個電位器提供0-5V的電壓信號。2) 選擇ADC0809芯片作為A/D轉換器,4路輸入信號分別接到ADC0809的IN0—IN4通道,每隔一定的時間采樣一次,采完一路采集下一路,4路電壓循環(huán)采集。3) 利用3個LED數(shù)碼管顯示數(shù)據(jù),1個數(shù)碼管用來顯示輸入電壓路數(shù),3個數(shù)碼管用來顯示電壓采樣值。4) 延時由8253定時/計數(shù)器來實現(xiàn)。 五、硬件電路設計根據(jù)設計思路,硬件主要利用了微機實驗平臺上的ADC0809模數(shù)轉換器、8253定時/計數(shù)器以及LED顯示輸出等模塊。電路原理圖如下:1.基本接口實驗板部分1) 電位計模塊,4個電位計輸出4路1-5V的電壓信號。2) ADC0809模數(shù)轉換器,將4路電壓信號接到IN0-IN3,ADD_A、ADD_B、ADD_C分別接A0、A1、A2,CS_AD接CS0時,4個采樣通道對應的地址分別為280H—283H。3) 延時模塊,8253和8255組成延時電路。8255的PA0接到8253的OUT0,程序中查詢計數(shù)是否結束。硬件電路圖如圖1所示。 圖1 基本實驗板上的電路圖實驗板上的LED顯示部分實驗板上主要用到了LED數(shù)碼管顯示電路,插孔CS1用于數(shù)碼管段碼的輸出選通,插孔CS2用于數(shù)碼管位選信號的輸出選通。電路圖如圖2所示。
上傳時間: 2013-11-06
上傳用戶:sunchao524
這里介紹的一款多功能編程器,功能強大,支持大多數(shù)常用的EPROM, EEPROM, FLASH, I2C,PIC, MCS-51,AVR, 93Cxx等系列芯片(超過400種)。硬件成本較低,性價比很高。既適合于電子和電腦愛好者使用,也適合家電維修人員維修家電和單片機開發(fā)人員使用。圖1為多功能編程器的主機,中間是32腳ZIF(零插力)鎖緊插座, 用于27系列、28系列、29系列、39/49系列等BIOS芯片。左邊是25芯并口插座,通過并口電纜連接計算機并口。左下方是電源插座。32腳ZIF插座下方是12位的DIP開關,對EPROM芯片進行讀寫等操作前,需將此開關撥至相應位置。具體開關位置可以參照軟件提示。鎖緊插座右側依次排列3個DIP8插座和一個DIP18插座,分別用于25系列、24系列、93系列存儲器和PIC系列單片機等;綠色電源指示燈(Power)用于指示編程器電源狀態(tài);紅色指示燈(Vpp)用于指示芯片Vpp電源狀態(tài);黃色指示燈(Vcc)用于指示芯片編程狀態(tài)。 一、 主要功能: ★ 可用此編程器升級、維修電腦主板,顯卡等BIOS芯片。可支持3.3V低電壓BIOS芯片。 ★ 用來寫網(wǎng)卡啟動芯片:用于組建無盤站寫網(wǎng)卡啟動芯片或制作硬盤還原卡等。 ★ 可用于復印機、傳真機、打印機主板維護和維修。★ 可用于讀寫用來寫汽車儀表、安全氣囊、里程表數(shù)據(jù)。★ 可用于維修顯示器、彩電、VCD、DVD 上面的存儲芯片。可修改開機畫面。 ★ 用來開發(fā)單片機: 通過添加不同適配器,可以支持 MCS-51 系列, AVR 系列和 PIC 系列的MCU。 ★ 用來寫大容量存儲芯片:大容量的存儲芯片,一般在衛(wèi)星接收機上使用較多,可以用編程器直接來升級或改寫。 二、電路簡介圖2是這臺編程器的完整電路圖,可以看到編程器電路由完全分離的兩部分組成:串行部分和并行EPROM部分電路。限于篇幅,原理部分不再詳述。對原理感興趣的讀者可以參考本文配套文件包中的“電路原理參考.PDF”文件。圖2三、電路板設計與制作 圖3是編程器參考元件布局圖,雙面PCB尺寸為160X100毫米,厚度1.6毫米。具體的PCB設計可以參考配套文件中的“PCB參考設計.PDF”。這個文件中包括電路板的頂層和低層布線和頂層絲印層。如果業(yè)余自制電路板,建議使用雙面感光電路板制作,以確保精度。
標簽: 多功能編程器
上傳時間: 2013-10-14
上傳用戶:問題問題
有兩種方式可以讓設備和應用程序之間聯(lián)系:1. 通過為設備創(chuàng)建的一個符號鏈;2. 通過輸出到一個接口WDM驅動程序建議使用輸出到一個接口而不推薦使用創(chuàng)建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創(chuàng)建一個惟一的、獨立于語言的訪問設備的方法。一個應用程序使用Win32APIs來調用設備。在某個Win32 APIs和設備對象的分發(fā)函數(shù)之間存在一個映射關系。獲得對設備對象訪問的第一步就是打開一個設備對象的句柄。 用符號鏈打開一個設備的句柄為了打開一個設備,應用程序需要使用CreateFile。如果該設備有一個符號鏈出口,應用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統(tǒng)本調用希望打開一個設備。這個設備必須有一個符號鏈,以便應用程序能夠打開它。有關細節(jié)查看有關Kdevice和CreateLink的內容。在上述調用中第一個參數(shù)中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數(shù)不是Windows 98/2000中驅動程序(.sys文件)的路徑。是到設備對象的符號鏈。如果使用DriverWizard產(chǎn)生驅動程序,它通常使用類KunitizedName來構成設備的符號鏈。這意味著符號鏈名有一個附加的數(shù)字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應用程序需要被覆蓋的I/O,第六個參數(shù)(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設備信息集,該信息集包含了特殊類中的所有設備接口信息。應用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設備接口的抽象。它的成員函數(shù)DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設備。下面用一個小例子來顯示這些類最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface( GUID* pClassGuid, DWORD instance, PDWORD pError){ CDeviceInterfaceClass DevClass(pClassGuid, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; CDeviceInterface DevInterface(&DevClass, instance, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; cout << "The device path is " << DevInterface.DevicePath() << endl; HANDLE hDev; hDev = CreateFile( DevInterface.DevicePath(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDev == INVALID_HANDLE_VALUE) *pError = GetLastError(); return hDev;} 在設備中執(zhí)行I/O操作一旦應用程序獲得一個有效的設備句柄,它就能使用Win32 APIs來產(chǎn)生到設備對象的IRPs。下面的表顯示了這種對應關系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設備類成員的Close和CleanUp:CreateFile使內核為設備創(chuàng)建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調用CleanUp。當沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調用Close。如果被打開的設備不支持指定的功能,則調用相應的Win32將引起錯誤(無效功能)。以前為Windows95編寫的VxD的應用程序代碼中可能會在打開設備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導致沒有特權的用戶企圖打開這個設備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數(shù)轉換成IRP域的方法依賴于設備對象的屬性。當設備設置DO_DIRECT_IO標志,I/O管理器將buff鎖住在存儲器中,并且創(chuàng)建了一個存儲在IRP中的MDL域。一個設備可以通過調用Kirp::Mdl來存取MDL。當設備設置DO_BUFFERED_IO標志,設備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或寫操作獲得buff地址。當設備不設置DO_BUFFERED_IO標志也不設置DO_DIRECT_IO,內核設置IRP 的UserBuffer域來對應ReadFile或WriteFile中的buff參數(shù)。然而,存儲區(qū)并沒有被鎖住而且地址只對調用進程有效。驅動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調用,buffer參數(shù)的轉換依賴于特殊的I/O控制代碼,它不在設備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構造控制代碼。這個宏的其中一個參數(shù)指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數(shù):Method Input Buffer Parameter Output Buffer Parameter METHOD_BUFFERED KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代碼指明METHOD_BUFFERED,系統(tǒng)分配一個單一的緩沖來作為輸入與輸出。驅動程序必須在向輸出緩沖放數(shù)據(jù)之前拷貝輸入數(shù)據(jù)。驅動程序通過調用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統(tǒng)緩沖拷貝數(shù)據(jù)到提供給Ring 3級調用者使用的緩沖中。驅動程序必須在結束前存儲拷貝到IRP的Information成員中的數(shù)據(jù)個數(shù)。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數(shù)呈現(xiàn)不同的含義。參數(shù)InputBuffer被拷貝到一個系統(tǒng)緩沖,這個緩沖驅動程序可以通過調用KIrp::IoctlBuffer。參數(shù)OutputBuffer被映射到KMemory對象,驅動程序對這個對象的訪問通過調用KIrp::Mdl來實現(xiàn)。對于METHOD_OUT_DIRECT,調用者必須有對緩沖的寫訪問權限。注意,對METHOD_NEITHER,內核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調用進程有效。這里是一個用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現(xiàn)在使用一個DeviceIoControl調用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執(zhí)行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設備拷貝串到里面并將拷貝的資結束設置到FirmwareRevSize中。在驅動程序中,代碼看起來如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){ ULONG fwLength=0; switch ( I.IoctlCode() ) { case IOCTL_MYDEV_GET_FIRMWARE_REV: fwLength = strlen(FIRMWARE_REV)+1; if (I.IoctlOutputBufferSize() >= fwLength) { strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV); I.Information() = fwLength; return I.Complete(STATUS_SUCCESS); } else { } case . . . } }
上傳時間: 2013-10-17
上傳用戶:gai928943