有兩種方式可以讓設(shè)備和應(yīng)用程序之間聯(lián)系:1. 通過為設(shè)備創(chuàng)建的一個符號鏈;2. 通過輸出到一個接口WDM驅(qū)動程序建議使用輸出到一個接口而不推薦使用創(chuàng)建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創(chuàng)建一個惟一的、獨(dú)立于語言的訪問設(shè)備的方法。一個應(yīng)用程序使用Win32APIs來調(diào)用設(shè)備。在某個Win32 APIs和設(shè)備對象的分發(fā)函數(shù)之間存在一個映射關(guān)系。獲得對設(shè)備對象訪問的第一步就是打開一個設(shè)備對象的句柄。
用符號鏈打開一個設(shè)備的句柄為了打開一個設(shè)備,應(yīng)用程序需要使用CreateFile。如果該設(shè)備有一個符號鏈出口,應(yīng)用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統(tǒng)本調(diào)用希望打開一個設(shè)備。這個設(shè)備必須有一個符號鏈,以便應(yīng)用程序能夠打開它。有關(guān)細(xì)節(jié)查看有關(guān)Kdevice和CreateLink的內(nèi)容。在上述調(diào)用中第一個參數(shù)中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數(shù)不是Windows 98/2000中驅(qū)動程序(.sys文件)的路徑。是到設(shè)備對象的符號鏈。如果使用DriverWizard產(chǎn)生驅(qū)動程序,它通常使用類KunitizedName來構(gòu)成設(shè)備的符號鏈。這意味著符號鏈名有一個附加的數(shù)字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應(yīng)用程序需要被覆蓋的I/O,第六個參數(shù)(Flags)必須或上FILE_FLAG_OVERLAPPED。
使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設(shè)備信息集,該信息集包含了特殊類中的所有設(shè)備接口信息。應(yīng)用程序能有用CdeviceInterfaceClass類的一個實(shí)例來獲得一個或更多的CdeviceInterface類的實(shí)例。CdeviceInterface類是一個單一設(shè)備接口的抽象。它的成員函數(shù)DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設(shè)備。下面用一個小例子來顯示這些類最基本的使用方法: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;}
在設(shè)備中執(zhí)行I/O操作一旦應(yīng)用程序獲得一個有效的設(shè)備句柄,它就能使用Win32 APIs來產(chǎn)生到設(shè)備對象的IRPs。下面的表顯示了這種對應(yīng)關(guān)系。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 需要解釋一下設(shè)備類成員的Close和CleanUp:CreateFile使內(nèi)核為設(shè)備創(chuàng)建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當(dāng)這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調(diào)用CleanUp。當(dāng)沒有任何用戶級和核心級的對文件對象的訪問的時(shí)候,I/O管理器調(diào)用Close。如果被打開的設(shè)備不支持指定的功能,則調(diào)用相應(yīng)的Win32將引起錯誤(無效功能)。以前為Windows95編寫的VxD的應(yīng)用程序代碼中可能會在打開設(shè)備的時(shí)候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因?yàn)樗鼘?dǎo)致沒有特權(quán)的用戶企圖打開這個設(shè)備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數(shù)轉(zhuǎn)換成IRP域的方法依賴于設(shè)備對象的屬性。當(dāng)設(shè)備設(shè)置DO_DIRECT_IO標(biāo)志,I/O管理器將buff鎖住在存儲器中,并且創(chuàng)建了一個存儲在IRP中的MDL域。一個設(shè)備可以通過調(diào)用Kirp::Mdl來存取MDL。當(dāng)設(shè)備設(shè)置DO_BUFFERED_IO標(biāo)志,設(shè)備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或?qū)懖僮鳙@得buff地址。當(dāng)設(shè)備不設(shè)置DO_BUFFERED_IO標(biāo)志也不設(shè)置DO_DIRECT_IO,內(nèi)核設(shè)置IRP 的UserBuffer域來對應(yīng)ReadFile或WriteFile中的buff參數(shù)。然而,存儲區(qū)并沒有被鎖住而且地址只對調(diào)用進(jìn)程有效。驅(qū)動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調(diào)用,buffer參數(shù)的轉(zhuǎn)換依賴于特殊的I/O控制代碼,它不在設(shè)備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構(gòu)造控制代碼。這個宏的其中一個參數(shù)指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應(yīng)的能獲得輸入緩沖與輸出緩沖的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)分配一個單一的緩沖來作為輸入與輸出。驅(qū)動程序必須在向輸出緩沖放數(shù)據(jù)之前拷貝輸入數(shù)據(jù)。驅(qū)動程序通過調(diào)用KIrp::IoctlBuffer獲得緩沖地址。在完成時(shí),I/O管理器從系統(tǒng)緩沖拷貝數(shù)據(jù)到提供給Ring 3級調(diào)用者使用的緩沖中。驅(qū)動程序必須在結(jié)束前存儲拷貝到IRP的Information成員中的數(shù)據(jù)個數(shù)。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數(shù)呈現(xiàn)不同的含義。參數(shù)InputBuffer被拷貝到一個系統(tǒng)緩沖,這個緩沖驅(qū)動程序可以通過調(diào)用KIrp::IoctlBuffer。參數(shù)OutputBuffer被映射到KMemory對象,驅(qū)動程序?qū)@個對象的訪問通過調(diào)用KIrp::Mdl來實(shí)現(xiàn)。對于METHOD_OUT_DIRECT,調(diào)用者必須有對緩沖的寫訪問權(quán)限。注意,對METHOD_NEITHER,內(nèi)核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調(diào)用進(jìn)程有效。這里是一個用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調(diào)用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執(zhí)行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅(qū)動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設(shè)備拷貝串到里面并將拷貝的資結(jié)束設(shè)置到FirmwareRevSize中。在驅(qū)動程序中,代碼看起來如下所示: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 . . . } }
標(biāo)簽:
驅(qū)動程序
應(yīng)用程序
接口
上傳時(shí)間:
2013-10-17
上傳用戶:gai928943
RS-232-C 是PC 機(jī)常用的串行接口,由于信號電平值較高,易損壞接口電路的芯片,與TTL電平不兼容故需使用電平轉(zhuǎn)換電路方能與TTL 電路連接。本產(chǎn)品(轉(zhuǎn)接器),可以實(shí)現(xiàn)任意電平下(0.8~15)的UART串行接口到RS-232-C/E接口的無源電平轉(zhuǎn)接, 使用非常方便可靠。
什么是RS-232-C 接口?采用RS-232-C 接口有何特點(diǎn)?傳輸電纜長度如何考慮?答: 計(jì)算機(jī)與計(jì)算機(jī)或計(jì)算機(jī)與終端之間的數(shù)據(jù)傳送可以采用串行通訊和并行通訊二種方式。由于串行通訊方式具有使用線路少、成本低,特別是在遠(yuǎn)程傳輸時(shí),避免了多條線路特性的不一致而被廣泛采用。 在串行通訊時(shí),要求通訊雙方都采用一個標(biāo)準(zhǔn)接口,使不同 的設(shè)備可以方便地連接起來進(jìn)行通訊。 RS-232-C接口(又稱 EIA RS-232-C)是目前最常用的一種串行通訊接口。它是在1970 年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、 調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”該標(biāo)準(zhǔn)規(guī)定采用一個25 個腳的 DB25 連接器,對連接器的每個引腳的信號內(nèi)容加以規(guī)定,還對各種信號的電平加以規(guī)定。(1) 接口的信號內(nèi)容實(shí)際上RS-232-C 的25 條引線中有許多是很少使用的,在計(jì)算機(jī)與終端通訊中一般只使用3-9 條引線。(2) 接口的電氣特性 在RS-232-C 中任何一條信號線的電壓均為負(fù)邏輯關(guān)系。即:邏輯“1”,-5— -15V;邏輯“0” +5— +15V 。噪聲容限為2V。即 要求接收器能識別低至+3V 的信號作為邏輯“0”,高到-3V的信號 作為邏輯“1”(3) 接口的物理結(jié)構(gòu) RS-232-C 接口連接器一般使用型號為DB-25 的25 芯插頭座,通常插頭在DCE 端,插座在DTE端. 一些設(shè)備與PC 機(jī)連接的RS-232-C 接口,因?yàn)椴皇褂脤Ψ降膫魉涂刂菩盘?只需三條接口線,即“發(fā)送數(shù)據(jù)”、“接收數(shù)據(jù)”和“信號地”。所以采用DB-9 的9 芯插頭座,傳輸線采用屏蔽雙絞線。(4) 傳輸電纜長度由RS-232C 標(biāo)準(zhǔn)規(guī)定在碼元畸變小于4%的情況下,傳輸電纜長度應(yīng)為50 英尺,其實(shí)這個4%的碼元畸變是很保守的,在實(shí)際應(yīng)用中,約有99%的用戶是按碼元畸變10-20%的范圍工作的,所以實(shí)際使用中最大距離會遠(yuǎn)超過50 英尺,美國DEC 公司曾規(guī)定允許碼元畸變?yōu)?0%而得出附表2 的實(shí)驗(yàn)結(jié)果。其中1 號電纜為屏蔽電纜,型號為DECP.NO.9107723 內(nèi)有三對雙絞線,每對由22# AWG 組成,其外覆以屏蔽網(wǎng)。2 號電纜為不帶屏蔽的電纜。
2. 什么是RS-485 接口?它比RS-232-C 接口相比有何特點(diǎn)?答: 由于RS-232-C 接口標(biāo)準(zhǔn)出現(xiàn)較早,難免有不足之處,主要有以下四點(diǎn):(1) 接口的信號電平值較高,易損壞接口電路的芯片,又因?yàn)榕cTTL 電平不兼容故需使用電平轉(zhuǎn)換電路方能與TTL 電路連接。(2) 傳輸速率較低,在異步傳輸時(shí),波特率為20Kbps。(3) 接口使用一根信號線和一根信號返回線而構(gòu)成共地的傳輸形式, 這種共地傳輸容易產(chǎn)生共模干擾,所以抗噪聲干擾性弱。(4) 傳輸距離有限,最大傳輸距離標(biāo)準(zhǔn)值為50 英尺,實(shí)際上也只能 用在50 米左右。針對RS-232-C 的不足,于是就不斷出現(xiàn)了一些新的接口標(biāo)準(zhǔn),RS-485 就是其中之一,它具有以下特點(diǎn):1. RS-485 的電氣特性:邏輯“1”以兩線間的電壓差為+(2—6) V 表示;邏輯“0”以兩線間的電壓差為-(2—6)V 表示。接口信號電平比RS-232-C 降低了,就不易損壞接口電路的芯片, 且該電平與TTL 電平兼容,可方便與TTL 電路連接。2. RS-485 的數(shù)據(jù)最高傳輸速率為10Mbps3. RS-485 接口是采用平衡驅(qū)動器和差分接收器的組合,抗共模干能力增強(qiáng),即抗噪聲干擾性好。4. RS-485 接口的最大傳輸距離標(biāo)準(zhǔn)值為4000 英尺,實(shí)際上可達(dá) 3000 米,另外RS-232-C接口在總線上只允許連接1 個收發(fā)器, 即單站能力。而RS-485 接口在總線上是允許連接多達(dá)128 個收發(fā)器。即具有多站能力,這樣用戶可以利用單一的RS-485 接口方便地建立起設(shè)備網(wǎng)絡(luò)。因RS-485 接口具有良好的抗噪聲干擾性,長的傳輸距離和多站能力等上述優(yōu)點(diǎn)就使其成為首選的串行接口。 因?yàn)镽S485 接口組成的半雙工網(wǎng)絡(luò),一般只需二根連線,所以RS485接口均采用屏蔽雙絞線傳輸。 RS485 接口連接器采用DB-9 的9 芯插頭座,與智能終端RS485接口采用DB-9(孔),與鍵盤連接的鍵盤接口RS485 采用DB-9(針)。3. 采用RS485 接口時(shí),傳輸電纜的長度如何考慮?答: 在使用RS485 接口時(shí),對于特定的傳輸線經(jīng),從發(fā)生器到負(fù)載其數(shù)據(jù)信號傳輸所允許的最大電纜長度是數(shù)據(jù)信號速率的函數(shù),這個 長度數(shù)據(jù)主要是受信號失真及噪聲等影響所限制。下圖所示的最大電纜長度與信號速率的關(guān)系曲線是使用24AWG 銅芯雙絞電話電纜(線 徑為0.51mm),線間旁路電容為52.5PF/M,終端負(fù)載電阻為100 歐 時(shí)所得出。(曲線引自GB11014-89 附錄A)。由圖中可知,當(dāng)數(shù)據(jù)信 號速率降低到90Kbit/S 以下時(shí),假定最大允許的信號損失為6dBV 時(shí), 則電纜長度被限制在1200M。實(shí)際上,圖中的曲線是很保守的,在實(shí) 用時(shí)是完全可以取得比它大的電纜長度。 當(dāng)使用不同線徑的電纜。則取得的最大電纜長度是不相同的。例 如:當(dāng)數(shù)據(jù)信號速率為600Kbit/S 時(shí),采用24AWG 電纜,由圖可知最 大電纜長度是200m,若采用19AWG 電纜(線徑為0。91mm)則電纜長 度將可以大于200m; 若采用28AWG 電纜(線徑為0。32mm)則電纜 長度只能小于200m。
標(biāo)簽:
232
RS
串行接口
電平
上傳時(shí)間:
2013-10-11
上傳用戶:時(shí)代電子小智