版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、在C + +Builder中實現(xiàn)I/O端口的讀寫 操作C+Builder繼承了 C語言簡潔、快速的優(yōu)點,米用面向?qū)ο?的軟件工程設(shè)計方法和可視化界面設(shè)計技術(shù),融合了 Windows編 程、數(shù)據(jù)庫編程、網(wǎng)絡(luò)編程等技術(shù) ,使得程序員可以快速高效地 開發(fā)出高質(zhì)量的Windows應(yīng)用程序。但在C+Builder中,不能夠 使用 Turbo C 中的 outputb 和 inputb 端口讀寫函數(shù)。給工業(yè)控 制方面的開發(fā)帶來不便 ,特別是不利于 IO 卡的直接輸入輸出操 作。筆者為在 C+Builder中實現(xiàn)這個功能專門在 Windows的不 同版本下進(jìn)行了嘗試取得了成功?,F(xiàn)就具體方法介紹如下供 C+B
2、uilder 編程人員參考。一、在 Windows 95/98 操作系統(tǒng)平臺下實現(xiàn)端口讀寫操作 共有兩種方法 ,一種為內(nèi)嵌匯編語言 , 另一種為使用 _emit_ 函數(shù)。(一)通過內(nèi)嵌匯編語言實現(xiàn)端口的讀寫asm 匯編語句 1利用內(nèi)嵌匯編語言編制端口輸出函數(shù)如下void OutPort(unsigned short port,unsigned char value)/port 參數(shù)為輸出端口地址 ,value 參數(shù)為輸出值 asm mov dx , port /把端口地址送到處理器 DX寄存器中mov al , value / 把value 送到處理器 AL寄存器中 out dx , al /
3、 把AL寄存器中的值送到端口;該函數(shù)將無符號字符型 8 位的數(shù)據(jù) value 寫入地址為 port 的端口上 ,port 的數(shù)據(jù)類型是 unsigned short,16 位無符號短整 形。利用內(nèi)嵌匯編語言編制端口輸入函數(shù)如下 : unsigned char InPort(unsigned short port) /port 參數(shù)為輸入端口地址 , 返回為輸入值unsigned char value ;asmmov dx, port /把端口地址送到處理器 DX寄存器中in al, dx / 從DX指定端口中將一數(shù)據(jù)送到AL寄存器中mov value,al / 把AL寄存器中的值賦給 valu
4、e;return value; / 返回端口數(shù)據(jù)函數(shù) InPort 從地址為 port 的端口讀入一個無符號 8 位的字 符型數(shù)據(jù) , 其其參數(shù)只一個 , 即端口號。返回的數(shù)據(jù)為 unsigned char 類型的 , 為從端口讀取的值。(二)通過_emit_ 函數(shù)實現(xiàn)端口的讀寫_emit_ 函數(shù)一般極少用到。其用法如下 :void _ _emit_ _(argument, . . .);該函數(shù)為 C+Builder 的一個內(nèi)部函數(shù) , 調(diào)用的參數(shù)為機(jī)器 語言指令。 它在編譯的時候 , 將機(jī)器語言指令直接嵌入目標(biāo)碼中 , 不必借助于匯編語言和匯編編譯程序。利用_emit_ 函數(shù)編制端口輸出函數(shù)
5、如下 :void OutPort(unsigned short port,unsigned char value)/port 參數(shù)為輸出端口地址 ,value 參數(shù)為輸出值_emit_(0x8b,0x95,&port); /把端口地址送到處理器EDX寄存器中_emit_(0x8a,0x85,&value);/ 把 value 送到處理器 AL寄存器中_emit_(0x66,0xee); /把AL寄存器中的值送到端口利用_emit_函數(shù)編制端口輸入函數(shù)如下 :unsigned char InPort(unsigned short port)/port 參數(shù)為輸入端口地址 , 返回為輸入值unsi
6、gned char value;_emit_(0x8b,0x95,&port) ; /把端口地址送到處理器DX寄存器中_emit_(0x66,0xec); /從DX指定端口中將一數(shù)據(jù)送到AL寄存器中_emit_(0x88,0x85,&value);/ 把 AL寄存器中的值賦給valuereturn value; / 返回端口數(shù)據(jù)由這兩種方法所編制的函數(shù)注釋可以看出 , 它們每一句的功 能都是一樣的 , 只是一個是嵌入了匯編語言 , 另一個是直接使用 機(jī)器語言。二、在 Windows NT/2000/XP 操作系統(tǒng)平臺下實現(xiàn)端口讀寫 操作上述介紹的實現(xiàn)端口讀寫操作兩種方法 , 在 Windows
7、 95/98 下面工作很正常 , 但是在 WindowsNT/2000/XP 上就會出現(xiàn)非法指 令調(diào)用的問題。這些非法指令來自于底層對10端口的直接地址訪問。在 Windows95/98 時代 , 這些操作都沒有受到保護(hù)的 , 而在 Windows NT/2000/XP 下就會出現(xiàn)保護(hù)問題。為了解決這個問題 需要使用第三方提供的 Win 10程序庫。(一)Win 10程序庫簡介Win 10程序庫允許在32位的Windows應(yīng)用程序中直接對I/O 端口和物理內(nèi)存進(jìn)行存取操作。 通過使用一種內(nèi)核模式的設(shè)備驅(qū) 動器和其它幾種底層編程技巧,它繞過了 Windows系統(tǒng)的保護(hù)機(jī) 制。WindowsNT/
8、2000/XP下,Win 10函數(shù)庫只允許被具有管理者 權(quán)限的應(yīng)用程序調(diào)用。如果使用者不是以管理者的身份進(jìn)入的 , 則WinIO.DLL不能夠被安裝,也不能激活 Win 10驅(qū)動器。通過在 管理者權(quán)限下安裝驅(qū)動器軟件就可以克服這種限制。然而 , 在這 種情況下 ,ShutdownWinIo 函數(shù)不能在應(yīng)用程序結(jié)束之前被調(diào)用 , 因為該函數(shù)將 WinlO驅(qū)動程序從系統(tǒng)注冊表中刪除。該函數(shù)庫提供 8個函數(shù)功能調(diào)用 ,其中直接對 I/0 端口操作 有 4 個函數(shù) :bool _stdcall InitializeWinIo();本函數(shù)初始化WiolO函數(shù)庫。 必須在調(diào)用所有其它功能函數(shù)之前調(diào)用本函數(shù)
9、。 如果函數(shù)調(diào)用成功 , 返回值為非零值。如果調(diào)用失敗 , 則返回值為 0。void _stdcall ShutdownWinIo();本函數(shù)在內(nèi)存中清除WinlO庫本函數(shù)必須在中止應(yīng)用函數(shù)之前或者不再需要Win IO庫時調(diào)用 ,bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);使用此函數(shù)從一個輸入或輸出端口讀取一個字節(jié) / 字/ 雙字 數(shù)據(jù)。參數(shù):wPortAddr 輸入輸出端口地址pdwPortVal 指向雙字變量的指針 , 接收從端口得到的數(shù)據(jù)。 bSize 需要讀的字節(jié)數(shù) ,可以是 1 (BY
10、TE), 2 (WORD)or 4 (DWORD).如果調(diào)用成功 , 則返回非零值。 如果函數(shù)調(diào)用失敗 , 則函數(shù)返回值為零。bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);使用本函數(shù)將一個字節(jié) /字/ 雙字的數(shù)據(jù)寫入輸入或輸出接 口。參數(shù):wPortAddr 輸入輸出口地址dwPortVal 要寫入口的數(shù)據(jù)bSize 要寫的數(shù)據(jù)個數(shù) ,可以是 1 (BYTE), 2 (WORD) or 4 (DWORD).如果調(diào)用成功 , 則返回非零值。 如果函數(shù)調(diào)用失敗 , 則函數(shù)返回值為零。(二)Win 10程序
11、庫的應(yīng)用在C+Builder中應(yīng)用 WinlO程序庫需要做如下工作。1. 首先將 winio.dll, winio.vxd和 winio.sys 三個文件拷貝到用 C+Builder 開發(fā)的工程文件目錄下 ;2. 在DOS提示符下用implib命令創(chuàng)建導(dǎo)入庫。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)項, 會出現(xiàn) .lib文件。選擇 winio.lib 文件并單擊“打開”按鈕 , 添加操作成功 ;4. 將 winio.h 中的 WINIO_API刪除;5. 在源文件中添加頭文件“ #include winio.h”;6. 調(diào)用初始化命令函數(shù) InitializeWinIo();7. 調(diào)用庫函數(shù) GetPortVal 、SetPortVal 實現(xiàn)端口的輸入輸 出操作 ;8. 當(dāng)所有的端口輸入輸出操作全部完成 , 調(diào)用庫函數(shù)ShutdownWinIo在內(nèi)存中清除WinIO庫。上述的幾種方法筆者在不同的應(yīng)用環(huán)境下使用都是正常的 沒有發(fā)現(xiàn)異?,F(xiàn)象 , 其中內(nèi)嵌匯編語言和使用 _emi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個人教育培訓(xùn)資金延期使用合同4篇
- 二零二五年度高端建筑涂料工程分包合同標(biāo)準(zhǔn)版3篇
- 二零二五年度個人肖像權(quán)授權(quán)使用合同音樂MV個人形象使用4篇
- 清潔能源技術(shù)轉(zhuǎn)讓合同
- 快遞合作合同
- 二零二五年度集體土地承包經(jīng)營權(quán)轉(zhuǎn)讓合同范本3篇
- 2025版水電節(jié)能改造與咨詢服務(wù)協(xié)議3篇
- 代收款協(xié)議書范本
- 決策咨詢常年顧問服務(wù)合同
- VIP會員儲值卡銷售協(xié)議
- 2024年產(chǎn)權(quán)管理部年終工作總結(jié)例文(3篇)
- 《血管性血友病》課件
- 高三日語一輪復(fù)習(xí)日語助詞「に」和「を」的全部用法課件
- 機(jī)場地勤勞動合同三篇
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 《用銳角三角函數(shù)解決問題(3)》參考課件
- 訂婚協(xié)議書手寫模板攻略
- 風(fēng)水學(xué)的基礎(chǔ)知識培訓(xùn)
- 施工組織設(shè)計方案針對性、完整性
- 2002版干部履歷表(貴州省)
- 第21課《鄒忌諷齊王納諫》對比閱讀 部編版語文九年級下冊
評論
0/150
提交評論