




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在C + +Builder中实现I/O端口的读写 操作C+Builder继承了 C语言简洁、快速的优点,米用面向对象 的软件工程设计方法和可视化界面设计技术,融合了 Windows编 程、数据库编程、网络编程等技术 ,使得程序员可以快速高效地 开发出高质量的Windows应用程序。但在C+Builder中,不能够 使用 Turbo C 中的 outputb 和 inputb 端口读写函数。给工业控 制方面的开发带来不便 ,特别是不利于 IO 卡的直接输入输出操 作。笔者为在 C+Builder中实现这个功能专门在 Windows的不 同版本下进行了尝试取得了成功。现就具体方法介绍如下供 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);使用此函数从一个输入或输出端口读取一个字节 / 字/ 双字 数据。参数:wPortAddr 输入输出端口地址pdwPortVal 指向双字变量的指针 , 接收从端口得到的数据。 bSize 需要读的字节数 ,可以是 1 (BY
10、TE), 2 (WORD)or 4 (DWORD).如果调用成功 , 则返回非零值。 如果函数调用失败 , 则函数返回值为零。bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);使用本函数将一个字节 /字/ 双字的数据写入输入或输出接 口。参数: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 开发的工程文件目录下 ;2. 在DOS提示符下用implib命令创建导入库。implib 命令格式如下 :implibwinio.libwinio.dll;3. 将 winio.lib 添加到用 C+Builder 开发的工程中。其操作方法是,在 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库。上述的几种方法笔者在不同的应用环境下使用都是正常的 没有发现异常现象 , 其中内嵌汇编语言和使用 _emi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化经纪合同委托合同
- 借款合同延期还款协议书
- 工程机械施工承包合同
- 全新代收款合同
- 勘测技术服务合同
- 茶艺师练习测试卷
- 气象局气象科普教育基地建设预案
- Java程序设计基础 课件 第1章 Java语言概述
- 房屋续签租赁合同范本
- (16)-专题16 现代文阅读
- 榜样的力量有一种力量叫榜样的力量课件
- 防控医疗纠纷课件
- 搅拌站的施工方案
- 陕西省扶风县法门小学-小学班主任带班方略【课件】
- 2025年超高功率大吨位电弧炉项目建议书
- 宠物殡葬创新创业
- 2025年第三届天扬杯建筑业财税知识竞赛题库附答案(801-900题)
- 2024年黑龙江出版集团招聘笔试真题
- 2024年4月27日浙江省事业单位招聘考试《职业能力倾向测验》真题及答案
- 【初中历史】辽宋夏金元时期经济的繁荣 课件 2024-2025学年统编版七年级历史下册
- 2025-2030中国橄榄球行业市场全景调研及投资价值评估咨询报告
评论
0/150
提交评论