???? 關(guān)鍵詞:并口,增強(qiáng)型并口,窗口驅(qū)動模式,數(shù)據(jù)采集
1 引 言
在目前一些流行的上位機(jī)和數(shù)據(jù)采集設(shè)備組合的數(shù)據(jù)采集系統(tǒng)中,數(shù)據(jù)采集設(shè)備和上位機(jī)的通訊是一個比較關(guān)鍵的技術(shù)。一般的應(yīng)用系統(tǒng)設(shè)計中,數(shù)據(jù)通訊技術(shù)主要采用串行異步通訊方式,但其傳輸速率受到限制,通常最高波特率設(shè)定在9600bps左右〔1〕。而在一些數(shù)據(jù)采樣率比較高的場合,如每秒20k~2M字節(jié)的數(shù)據(jù)通訊速率,使用串口通訊技術(shù)是遠(yuǎn)遠(yuǎn)達(dá)不到要求的,這就需要使用更為快速的數(shù)據(jù)通訊方案。目前比較合適的通訊技術(shù)還有并口和USB通訊方案。本文主要探討并口的通訊在數(shù)據(jù)采集中的運用。
當(dāng)前許多并口數(shù)據(jù)采集系統(tǒng)都基于Windows98系統(tǒng)平臺,由于該系統(tǒng)可以直接訪問并口硬件資源,在上位機(jī)軟件方面比較容易,因此很少被詳細(xì)而深入地探討。但隨著Windows2000/WinXP操作系統(tǒng)逐漸成為主流的桌面系統(tǒng),而該操作系統(tǒng)為了保證其穩(wěn)定性,主機(jī)的上層應(yīng)用程序?qū)o法直接訪問并口,這就需要在Windows2000新的窗口驅(qū)動模式WDM下,基于Windows2000中現(xiàn)有的驅(qū)動體系,開發(fā)專有的并口數(shù)據(jù)采集設(shè)備驅(qū)動,以支持上位機(jī)采集軟件的開發(fā)和運行。
2 EPP并口通訊
并口通訊技術(shù)經(jīng)歷多年的發(fā)展,現(xiàn)在已經(jīng)形成了統(tǒng)一的1284標(biāo)準(zhǔn)。在這個標(biāo)準(zhǔn)中,目前定義了5種并口通訊模式〔2〕〔3〕,見表1。
其中,EPP和擴(kuò)容并口(Extended ParallelPort,ECP)模式支持雙向數(shù)據(jù)傳輸,數(shù)據(jù)傳輸速率都能夠達(dá)到1Mbyte/s以上,顯然是滿足一般的數(shù)據(jù)采集要求的,這兩種模式是一般并口外設(shè)和主機(jī)廣泛支持的并口工作模式。由于EPP模式的操作時序簡單,本文將其作為首選數(shù)據(jù)通訊模式。
??? 而基于EPP協(xié)議的硬件和通訊設(shè)計,本文主要依據(jù)并口通訊的特點,采用中斷上傳方式,即外設(shè)通過nIntr中斷來通知主機(jī)采集數(shù)據(jù)上傳準(zhǔn)備就緒,主機(jī)捕獲中斷后立即從并口讀取數(shù)據(jù)。
由于并口的頻繁中斷使得系統(tǒng)不穩(wěn)定,因此,在啟用并口中斷的時候,一定要盡量減少并口中斷的頻率,在這里就是要增加每次中斷處理的數(shù)據(jù)傳輸量。一般的方法是外設(shè)采用容量較大的先進(jìn)先出隊列(First InFirst Out,F(xiàn)IFO),并在一次中斷中,將這些數(shù)據(jù)上傳主機(jī)。
基于EPP協(xié)議的硬件設(shè)計已經(jīng)在許多文章得到探討,這里不再贅述。
3 Windows2000下并口數(shù)據(jù)采集的軟件設(shè)計
在Windows2000/WinXP系統(tǒng)中,考慮到系統(tǒng)的穩(wěn)定性,應(yīng)用程序已經(jīng)無法直接訪問和操作并口。同時虛擬設(shè)備驅(qū)動(Virtual Device Driver,VxD)也將為Windows2000下的更為先進(jìn)的窗口驅(qū)動模式體系所取代,因此要在Windows2000/WinXP系統(tǒng)下進(jìn)行并口數(shù)據(jù)采集設(shè)備的軟件開發(fā),就必須進(jìn)行并口設(shè)備的WDM驅(qū)動的開發(fā)。
3.1 Windwos2000驅(qū)動體系
圖1顯示了在Windows2000/WinXP系統(tǒng)中應(yīng)用程序調(diào)用執(zhí)行一個硬件的操作的基本過程,從中我們可以看到驅(qū)動的位置及其所起到的作用。
WDM是微軟公司在Windows NT驅(qū)動程序體系的基礎(chǔ)上,提出的一個新的設(shè)備驅(qū)動程序體系。WDM不僅支持即插即用、電源管理、WMI(WindowsManagement Instrumentation)等功能,它強(qiáng)調(diào)驅(qū)動程序的分層和模塊化,擁有更強(qiáng)的可擴(kuò)展性和可移植性,使用更加靈活,運行更加安全,開發(fā)更加快捷,同時,可以很輕易地移植到不同的平臺上運行。
3.2 WDM驅(qū)動程序的種類和結(jié)構(gòu)
??? WDM的驅(qū)動程序是分層的,一般按照層次分為高層、中間和底層三類〔4〕。顧名思義,高層驅(qū)動程序依賴于中間和底層驅(qū)動程序完成工作,而中間驅(qū)動程序又依賴于底層驅(qū)動程序來完成工作。
高層驅(qū)動程序主要為請求者提供非物理的抽象,并一次轉(zhuǎn)換為特定的設(shè)備請求。比如文件系統(tǒng)驅(qū)動程序(File SystemDriver,F(xiàn)SD)。
中間驅(qū)動程序是驅(qū)動中相對比較豐富的領(lǐng)域,包括了諸如磁盤鏡像、類驅(qū)動程序、微型驅(qū)動程序和過濾器驅(qū)動程序。這些驅(qū)動程序穿插在高層抽象層和低級物理支持之間。其功能多樣,實現(xiàn)方式靈活。
底層驅(qū)動程序主要包括諸如硬件總線的控制器等的驅(qū)動,這些驅(qū)動直接與Windows的硬件抽象層(Hardware Abstract Layer,HAL)和硬件交互,它們包括了物理驅(qū)動程序的概念,這些物理驅(qū)動程序與一個或多個功能驅(qū)動程序發(fā)生作用。
3.3 Windows2000中的并口系統(tǒng)驅(qū)動環(huán)境
Windows2000中已經(jīng)為并口提供了一些默認(rèn)的系統(tǒng)驅(qū)動,其中一個是Parport,另一個是Parclass,它們的執(zhí)行映像文件分別對應(yīng)Parport.sys和Parallel.sys。
Parport是Windows2000提供給并口的系統(tǒng)功能驅(qū)動程序,不可取代,它支持WDM的所有的基本特性,負(fù)責(zé)為每個并行端口創(chuàng)建一個命名的Parport設(shè)備對象,并且為每個Parport設(shè)備對象分配一個工作隊列。同時還與并口設(shè)備類驅(qū)動如Parclass或其他特定的并口設(shè)備功能驅(qū)動程序緊密配合,為它們提供如下的服務(wù)功能:
??? (1)并口使用的資源,如端口、中斷等等資源。
??? (2)總線接口信息。
(3)給其他驅(qū)動提供一些回調(diào)過程的指針,通過這些回調(diào)過程可以控制一個并口設(shè)備。
Parclass是掛接在并口上的并口設(shè)備的類驅(qū)動,它依賴于Parport提供的服務(wù),同時,它也是一個即插即用的并口設(shè)備的總線驅(qū)動。Parclass首先創(chuàng)建一個總線功能設(shè)備對象,它代表一個硬件獨立的Parclass總線控制器,同時為每個掛接在并口上的即插即用設(shè)備在Parclass總線上創(chuàng)建子對象,或者直接為并行端口創(chuàng)建一個遺留設(shè)備對象。
同樣,Parclass也給一些更高層的驅(qū)動程序提供一些回調(diào)過程和內(nèi)部IO控制指令,以控制和訪問Parclass總線下的子設(shè)備。Parclass目前支持對Parclass子設(shè)備的裸訪問,同時支持的并口模式有標(biāo)準(zhǔn)并口、IEEE1284兼容并口、ECP和EPP并口等。
以上兩個驅(qū)動是Windows2000/WinXP系統(tǒng)中為并口以及并口設(shè)備提供的系統(tǒng)驅(qū)動程序,它構(gòu)成了其他并口以及并口設(shè)備驅(qū)動開發(fā)的基礎(chǔ)和環(huán)境。
3.4 并口采集驅(qū)動的設(shè)計
??? 并口數(shù)據(jù)采集驅(qū)動的結(jié)構(gòu)設(shè)計主要如圖2所示。
本文并口數(shù)據(jù)采集驅(qū)動程序結(jié)構(gòu)設(shè)計主要有以下要點:
(1)為了避免驅(qū)動程序設(shè)計過于復(fù)雜,減少驅(qū)動調(diào)用的層次,本驅(qū)動直接構(gòu)建在并口驅(qū)動程序Parport之上,而沒有在Parclass上構(gòu)建本文的驅(qū)動,直接利用Parport提供的基本的并口操作實現(xiàn)本文驅(qū)動的功能。
??? (2)驅(qū)動工作在EPP高速通訊模式。
(3)驅(qū)動不采用輪詢模式去查詢并口,而是等待并口外設(shè)的中斷事件,通知主機(jī)外設(shè)數(shù)據(jù)上傳準(zhǔn)備完畢,驅(qū)動中斷伺服例程或者延遲例程,完成并口設(shè)備采集數(shù)據(jù)的讀取。
(4)本系統(tǒng)沒有數(shù)據(jù)的雙向通訊,對上層應(yīng)用程序和驅(qū)動程序而言,只有驅(qū)動程序到應(yīng)用程序的數(shù)據(jù)流,因此它們之間的通訊模式采用了事件模式,即驅(qū)動在采集數(shù)據(jù)到達(dá)或者數(shù)據(jù)緩沖區(qū)已滿時,通過事件通知上層應(yīng)用程序,再由上層應(yīng)用程序來從驅(qū)動的系統(tǒng)緩沖區(qū)中讀取采集上來的數(shù)據(jù)。
3.5 并口驅(qū)動的實現(xiàn)
并口驅(qū)動的實現(xiàn)主要是按照WDM驅(qū)動的規(guī)范和接口來實現(xiàn),這些接口有層次的分為如下幾個部分:驅(qū)動程序的初始化(DriverEntry入口函數(shù))和卸載例程(DriverUnload)、驅(qū)動設(shè)備的添加例程(AddDevice)和主要IO請求的派發(fā)例程、即插即用(Plug and Play,Pnp)處理例程(其中包括驅(qū)動設(shè)備的啟動、停止和卸載等等子例程)、控制IO子請求的處理例程、電源管理處理例程、WMI和NT事件通知處理例程。驅(qū)動的設(shè)計的和實現(xiàn)在許多書籍和文章上都有詳細(xì)的介紹〔4〕〔5〕,其一般通用的設(shè)計和實現(xiàn)這里不再贅述。這里主要闡述一些與并口操作有著緊密聯(lián)系的關(guān)鍵實現(xiàn)。
3.5.1 并口的獲取和訪問
在Windows2000操作系統(tǒng)中,并口驅(qū)動Parport自動為每個并口生成一個設(shè)備對象,一般最常用的一個并口設(shè)備對象的內(nèi)部設(shè)備名為“\Device\ParllelPort0”,本驅(qū)動就是通過這個內(nèi)部設(shè)備名來獲得并口對象的。同時,應(yīng)該注意在設(shè)備的卸載時刪除相應(yīng)的并口設(shè)備指針。得到這個設(shè)備對象后,就可以通過內(nèi)部控制IO請求和回調(diào)函數(shù)來控制并口操作。具體代碼如下
在獲得并口對象之后就通過底層的Parport驅(qū)動發(fā)送內(nèi)部控制IO IOCTL INTERNAL PARALLEL? PORT? ALLOCATE,或者也可以調(diào)用PARALLEL? PORT? INFORMATION的PPARALLEL? TRY? ALLOCATE? ROUTNE例程來占用并口,這樣驅(qū)動程序就可以獲得并獨占并口的資源,與并口數(shù)據(jù)采集設(shè)備通訊了。
3.5.2 并口模式的設(shè)置
首先這里強(qiáng)調(diào)的是,主機(jī)的并口必須支持EPP模式的通訊方式,具體地說,就是主機(jī)的基本輸入輸出系統(tǒng)(Basic Input Output System,BIOS)中要將并口模式設(shè)置為EPP模式或者EPP+ECP混合模式。在此基礎(chǔ)之上,驅(qū)動程序才能正確設(shè)置并口工作模式。一般在EPP模式下時,驅(qū)動不用設(shè)置并口工作模式,但如果在EPP+ECP工作模式下,則需要驅(qū)動程序檢測并設(shè)置并口工作模式,這時就需要通過向Parport驅(qū)動程序發(fā)送IOCTL INTERNAL PARALLEL SET? CHIP? MODE內(nèi)部控制IO,或調(diào)用TrySetChipMode回調(diào)例程設(shè)置并口為EPP工作模式。同時,應(yīng)注意如果BIOS中設(shè)為EPP+ECP混合模式,在卸載本驅(qū)動設(shè)備后要將并口模式恢復(fù)為原有的模式。
3.5.3 并口中斷的掛接
掛接并口中斷,不推薦直接調(diào)用IoConnectInterrupt例程,而只需要向Parport驅(qū)動程
序發(fā)送內(nèi)部控制IO(IOCTL INTERNAL PARALLEL? CONNECT? INTERRUPT)來掛接所指定中斷例程。
3.5.4 并口驅(qū)動與應(yīng)用程序的通訊
主要的方法就是由上層應(yīng)用程序創(chuàng)建一個事件,然后通過IO MJ DEVICE CONTROL的設(shè)備控制IO將此事件句柄作為一個參數(shù)傳給驅(qū)動程序,之后應(yīng)用程序本身就進(jìn)入等待這個通知事件觸發(fā)的狀態(tài)之中。驅(qū)動程序獲得這個通知事件句柄,將其保存在自己的設(shè)備擴(kuò)展之中,當(dāng)并口有數(shù)據(jù)到達(dá)需要向上層應(yīng)用程序發(fā)送數(shù)據(jù)的時候,就觸發(fā)這個事件,則上層應(yīng)用程序?qū)玫酵ㄖ^而從驅(qū)動中讀取數(shù)據(jù)。
4 結(jié)束語
本文驅(qū)動是在Windows2000設(shè)備驅(qū)動程序開發(fā)包(Device Drivers Kit,DDK)和VC6下開發(fā)完成的,由Numage公司的SoftIce調(diào)試工具調(diào)試通過。
本驅(qū)動程序采用了增強(qiáng)型并口模式作為并口設(shè)備驅(qū)動的工作模式,此模式下并口開發(fā)相對比較容易,而且極大地擴(kuò)展了并口通訊容量和速度。同時,本驅(qū)動構(gòu)建在Windows2000為并口提供的系統(tǒng)功能驅(qū)動Parport之上,通過Parport提供的各項功能來訪問和控制并口,既減少了本驅(qū)動的開發(fā)的難度,又增強(qiáng)了系統(tǒng)的整合性和穩(wěn)定性。目前,實測數(shù)據(jù)采集速率峰值達(dá)到1Mbyte/s以上,穩(wěn)定運行時也可達(dá)到400K~500Kbyte/s的速度,同時,上層的應(yīng)用程序耗用的資源相當(dāng)少,運行平穩(wěn),效果良好,為Windows2000/WinXP系統(tǒng)下開發(fā)并口數(shù)據(jù)采集設(shè)備的軟件系統(tǒng)提供了一些有意義的嘗試和經(jīng)驗。
參考文獻(xiàn)
2 IEEEStd 1284-1994.IEEEStandard Signaling Method fora Bidirectional Parallel Peripheral Interface for Personal Computers.1994
3 宋大雷,張東來,等.IEEE1284標(biāo)準(zhǔn)簡介.電子計算機(jī)與外部設(shè)備,2000,24(1):21~24
4 (美)Art Baker,Jerry Lozano著.Windows2000設(shè)備驅(qū)動程序設(shè)計指南.施 諾,等譯.北京:機(jī)械工業(yè)出版社,2001,9:8~10
5 姜 江,柳 泉,等.基于Windows2000的WDM設(shè)備驅(qū)動程序的開發(fā).應(yīng)用科技,2002,29(7):45~47
評論
查看更多