基于USB接口的虛擬示波器的開發(fā)實現(xiàn)
?。?)DriverExtension→AddDevice指向驅(qū)動程序的AddDevice函數(shù)。PnP管理器將為每個硬件實例調(diào)用一次AddDevice例程。
?。?)DriverStartIo驅(qū)動程序使用標準的IRP(interrupt request package,中斷請求包)排隊。
?。?)MajorFunction驅(qū)動程序可能需要處理幾種類型的IRP,所以,應該設(shè)置與那幾種IRP類型相對應的指針元素,使它們指向相應的派遣函數(shù)。根據(jù)虛擬儀器系統(tǒng)的實際要求,本驅(qū)動程序所要處理的主功能IRP有:
IRP-MJ-CREATE;IRP-MJ-CLOSE;
IRP-MJ-DEVICE-CONTR;IRP-MJ-WRITE;
IRP-MJ-READ;IRP-MJ-SYSTEM-CONTROL;
IRP-MJ-PNP;IRP-MJ-POWER。
在主入口例程中,必須設(shè)置和這些IRP類型相對應的指針元素,使它們指向相應的派遣函數(shù)。
4 客戶服務軟件設(shè)計
整個客戶服務軟件使用VC++編寫,分以下幾個主要模塊設(shè)計。
4.1 驅(qū)動層與應用層通信模塊
如果通信功能塊直接放在應用程序主線程中實現(xiàn),那么,當應用程序與驅(qū)動程序進行數(shù)據(jù)通信時,主界面就會凍結(jié)。為了解決這個問題,我們直接創(chuàng)建一個子線程來單獨完成與驅(qū)動程序的通信任務,讓主界面專心于響應視窗界面的訊息。在子線程中通過調(diào)用Windows API函數(shù)來實現(xiàn)對USB設(shè)備進行IO操作。其中,DeviceIoControl()函數(shù)用于傳送設(shè)備配置信息;CreateFile()用于創(chuàng)建設(shè)備對象;WriteFile()和ReadFile()用于對USB設(shè)備讀寫數(shù)據(jù)。
評論