在C++Builder中實現I/O端口的讀寫操作_第1頁
在C++Builder中實現I/O端口的讀寫操作_第2頁
在C++Builder中實現I/O端口的讀寫操作_第3頁
在C++Builder中實現I/O端口的讀寫操作_第4頁
在C++Builder中實現I/O端口的讀寫操作_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、在C + +Builder中實現I/O端口的讀寫 操作C+Builder繼承了 C語言簡潔、快速的優(yōu)點,米用面向對象 的軟件工程設計方法和可視化界面設計技術,融合了 Windows編 程、數據庫編程、網絡編程等技術 ,使得程序員可以快速高效地 開發(fā)出高質量的Windows應用程序。但在C+Builder中,不能夠 使用 Turbo C 中的 outputb 和 inputb 端口讀寫函數。給工業(yè)控 制方面的開發(fā)帶來不便 ,特別是不利于 IO 卡的直接輸入輸出操 作。筆者為在 C+Builder中實現這個功能專門在 Windows的不 同版本下進行了嘗試取得了成功?,F就具體方法介紹如下供 C+B

2、uilder 編程人員參考。一、在 Windows 95/98 操作系統平臺下實現端口讀寫操作 共有兩種方法 ,一種為內嵌匯編語言 , 另一種為使用 _emit_ 函數。(一)通過內嵌匯編語言實現端口的讀寫asm 匯編語句 1利用內嵌匯編語言編制端口輸出函數如下void OutPort(unsigned short port,unsigned char value)/port 參數為輸出端口地址 ,value 參數為輸出值 asm mov dx , port /把端口地址送到處理器 DX寄存器中mov al , value / 把value 送到處理器 AL寄存器中 out dx , al /

3、 把AL寄存器中的值送到端口;該函數將無符號字符型 8 位的數據 value 寫入地址為 port 的端口上 ,port 的數據類型是 unsigned short,16 位無符號短整 形。利用內嵌匯編語言編制端口輸入函數如下 : unsigned char InPort(unsigned short port) /port 參數為輸入端口地址 , 返回為輸入值unsigned char value ;asmmov dx, port /把端口地址送到處理器 DX寄存器中in al, dx / 從DX指定端口中將一數據送到AL寄存器中mov value,al / 把AL寄存器中的值賦給 valu

4、e;return value; / 返回端口數據函數 InPort 從地址為 port 的端口讀入一個無符號 8 位的字 符型數據 , 其其參數只一個 , 即端口號。返回的數據為 unsigned char 類型的 , 為從端口讀取的值。(二)通過_emit_ 函數實現端口的讀寫_emit_ 函數一般極少用到。其用法如下 :void _ _emit_ _(argument, . . .);該函數為 C+Builder 的一個內部函數 , 調用的參數為機器 語言指令。 它在編譯的時候 , 將機器語言指令直接嵌入目標碼中 , 不必借助于匯編語言和匯編編譯程序。利用_emit_ 函數編制端口輸出函數

5、如下 :void OutPort(unsigned short port,unsigned char value)/port 參數為輸出端口地址 ,value 參數為輸出值_emit_(0x8b,0x95,&port); /把端口地址送到處理器EDX寄存器中_emit_(0x8a,0x85,&value);/ 把 value 送到處理器 AL寄存器中_emit_(0x66,0xee); /把AL寄存器中的值送到端口利用_emit_函數編制端口輸入函數如下 :unsigned char InPort(unsigned short port)/port 參數為輸入端口地址 , 返回為輸入值unsi

6、gned char value;_emit_(0x8b,0x95,&port) ; /把端口地址送到處理器DX寄存器中_emit_(0x66,0xec); /從DX指定端口中將一數據送到AL寄存器中_emit_(0x88,0x85,&value);/ 把 AL寄存器中的值賦給valuereturn value; / 返回端口數據由這兩種方法所編制的函數注釋可以看出 , 它們每一句的功 能都是一樣的 , 只是一個是嵌入了匯編語言 , 另一個是直接使用 機器語言。二、在 Windows NT/2000/XP 操作系統平臺下實現端口讀寫 操作上述介紹的實現端口讀寫操作兩種方法 , 在 Windows

7、 95/98 下面工作很正常 , 但是在 WindowsNT/2000/XP 上就會出現非法指 令調用的問題。這些非法指令來自于底層對10端口的直接地址訪問。在 Windows95/98 時代 , 這些操作都沒有受到保護的 , 而在 Windows NT/2000/XP 下就會出現保護問題。為了解決這個問題 需要使用第三方提供的 Win 10程序庫。(一)Win 10程序庫簡介Win 10程序庫允許在32位的Windows應用程序中直接對I/O 端口和物理內存進行存取操作。 通過使用一種內核模式的設備驅 動器和其它幾種底層編程技巧,它繞過了 Windows系統的保護機 制。WindowsNT/

8、2000/XP下,Win 10函數庫只允許被具有管理者 權限的應用程序調用。如果使用者不是以管理者的身份進入的 , 則WinIO.DLL不能夠被安裝,也不能激活 Win 10驅動器。通過在 管理者權限下安裝驅動器軟件就可以克服這種限制。然而 , 在這 種情況下 ,ShutdownWinIo 函數不能在應用程序結束之前被調用 , 因為該函數將 WinlO驅動程序從系統注冊表中刪除。該函數庫提供 8個函數功能調用 ,其中直接對 I/0 端口操作 有 4 個函數 :bool _stdcall InitializeWinIo();本函數初始化WiolO函數庫。 必須在調用所有其它功能函數之前調用本函數

9、。 如果函數調用成功 , 返回值為非零值。如果調用失敗 , 則返回值為 0。void _stdcall ShutdownWinIo();本函數在內存中清除WinlO庫本函數必須在中止應用函數之前或者不再需要Win IO庫時調用 ,bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);使用此函數從一個輸入或輸出端口讀取一個字節(jié) / 字/ 雙字 數據。參數:wPortAddr 輸入輸出端口地址pdwPortVal 指向雙字變量的指針 , 接收從端口得到的數據。 bSize 需要讀的字節(jié)數 ,可以是 1 (BY

10、TE), 2 (WORD)or 4 (DWORD).如果調用成功 , 則返回非零值。 如果函數調用失敗 , 則函數返回值為零。bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);使用本函數將一個字節(jié) /字/ 雙字的數據寫入輸入或輸出接 口。參數:wPortAddr 輸入輸出口地址dwPortVal 要寫入口的數據bSize 要寫的數據個數 ,可以是 1 (BYTE), 2 (WORD) or 4 (DWORD).如果調用成功 , 則返回非零值。 如果函數調用失敗 , 則函數返回值為零。(二)Win 10程序

11、庫的應用在C+Builder中應用 WinlO程序庫需要做如下工作。1. 首先將 winio.dll, winio.vxd和 winio.sys 三個文件拷貝到用 C+Builder 開發(fā)的工程文件目錄下 ;2. 在DOS提示符下用implib命令創(chuàng)建導入庫。implib 命令格式如下 :implibwinio.libwinio.dll;3. 將 winio.lib 添加到用 C+Builder 開發(fā)的工程中。其操作方法是,在 C+BuilderlDE 中選擇 Project f Add to project命令,在彈出的Add to project對話框中“文件類型”下拉列表框中選擇 Lib

12、rary file (*.lib)項, 會出現 .lib文件。選擇 winio.lib 文件并單擊“打開”按鈕 , 添加操作成功 ;4. 將 winio.h 中的 WINIO_API刪除;5. 在源文件中添加頭文件“ #include winio.h”;6. 調用初始化命令函數 InitializeWinIo();7. 調用庫函數 GetPortVal 、SetPortVal 實現端口的輸入輸 出操作 ;8. 當所有的端口輸入輸出操作全部完成 , 調用庫函數ShutdownWinIo在內存中清除WinIO庫。上述的幾種方法筆者在不同的應用環(huán)境下使用都是正常的 沒有發(fā)現異常現象 , 其中內嵌匯編語言和使用 _emi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論