在C++Builder中实现I/O端口的读写操作

来源 :硅谷 | 被引量 : 0次 | 上传用户:fooguo3007
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘要]介绍C++Builder在Windows 95/98操作系统平台IO端口没有受到保护的情况下,实现IO端口读写操作的两种方法,在Windows NT/2000/XP操作系统平台IO端口受到保护的情况下,应用WinIO程序库实现IO端口读写的方法。对于应用C++Builder进行硬件开发的编程人员有重要参考价值。
  [关键词]C++Builder IO端口读写 WinIO程序库
  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0910070-02
  
  C++Builder继承了C语言简洁、快速的优点,采用面向对象的软件工程设计方法和可视化界面设计技术,融合了Windows编程、数据库编程、网络编程等技术,使得程序员可以快速高效地开发出高质量的Windows应用程序。但在C++Builder中,不能够使用Turbo C中的outputb和inputb端口读写函数。给工业控制方面的开发带来不便,特别是不利于IO卡的直接输入输出操作。笔者为在C++Builder中实现这个功能专门在Windows的不同版本下进行了尝试取得了成功。现就具体方法介绍如下供C++Builder编程人员参考。
  
  一、在Windows 95/98操作系统平台下实现端口读写操作
  
  共有两种方法,一种为内嵌汇编语言,另一种为使用__emit__函数。
  (一)通过内嵌汇编语言实现端口的读写
  在C++Builder中,汇编语句必须被包含在以关键字asm为起始的一对大括号中:
  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 // 把AL寄存器中的值送到端口
  };
  }
  该函数将无符号字符型8位的数据value写入地址为port的端口上,port的数据类型是unsigned short,16位无符号短整形。
  利用内嵌汇编语言编制端口输入函数如下:
  unsigned char InPort(unsigned short port)
  //port参数为输入端口地址,返回为输入值
  {
  unsigned char value ;
  asm{
  mov dx, port // 把端口地址送到处理器DX寄存器中
  in al, dx // 从DX指定端口中将一数据送到AL寄存器中
  mov value,al // 把AL寄存器中的值赋给value
  };
  return value; //返回端口数据
  }
  函数InPort从地址为port的端口读入一个无符号8位的字符型数据,其其参数只一个,即端口号。返回的数据为unsigned char类型的,为从端口读取的值。
  (二)通过__emit__函数实现端口的读写
  __emit__ 函数一般极少用到。其用法如下:
  void _ _emit_ _(argument, . . .);
  该函数为C++Builder 的一个内部函数,调用的参数为机器语言指令。它在编译的时候,将机器语言指令直接嵌入目标码中,不必借助于汇编语言和汇编编译程序。
  利用__emit__函数编制端口输出函数如下:
  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参数为输入端口地址,返回为输入值
  {
  unsigned char value;
  __emit__(0x8b,0x95,&port) ; // 把端口地址送到处理器DX寄存器中
  __emit__(0x66,0xec); // 从DX指定端口中将一数据送到AL寄存器中
  __emit__(0x88,0x85,&value); // 把AL寄存器中的值赋给value
  return value; //返回端口数据
  }
  由这两种方法所编制的函数注释可以看出,它们每一句的功能都是一样的,只是一个是嵌入了汇编语言,另一个是直接使用机器语言。
  
  二、在Windows NT/2000/XP操作系统平台下实现端口读写操作
  
  上述介绍的实现端口读写操作两种方法,在Windows 95/98下面工作很正常,但是在Windows NT/2000/XP上就会出现非法指令调用的问题。这些非法指令来自于底层对IO端口的直接地址访问。在Windows 95/98时代,这些操作都没有受到保护的,而在Windows NT/2000/XP下就会出现保护问题。为了解决这个问题需要使用第三方提供的WinIO程序库。
  (一)WinIO程序库简介
  WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作。通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保护机制。
  WindowsNT/2000/XP下,WinIO函数库只允许被具有管理者权限的应用程序调用。如果使用者不是以管理者的身份进入的,则WinIO.DLL不能够被安装,也不能激活WinIO驱动器。通过在管理者权限下安装驱动器软件就可以克服这种限制。然而,在这种情况下,ShutdownWinIo函数不能在应用程序结束之前被调用,因为该函数将WinIO驱动程序从系统注册表中删除。
  该函数库提供8个函数功能调用,其中直接对I/O端口操作有4个函数:
  bool _stdcall InitializeWinIo();
  本函数初始化WioIO函数库。
  必须在调用所有其它功能函数之前调用本函数。
  如果函数调用成功,返回值为非零值。
  如果调用失败,则返回值为0。
  void _stdcall ShutdownWinIo();
  本函数在内存中清除WinIO库
  本函数必须在中止应用函数之前或者不再需要WinIO库时调用,
  bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
  使用此函数从一个输入或输出端口读取一个字节/字/双字数据。
  参数:
  wPortAddr输入输出端口地址
  pdwPortVal指向双字变量的指针,接收从端口得到的数据。
  bSize需要读的字节数,可以是1 (BYTE), 2 (WORD) or 4 (DWORD).
  如果调用成功,则返回非零值。
  如果函数调用失败,则函数返回值为零。
  bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
  使用本函数将一个字节/字/双字的数据写入输入或输出接口。
  参数:
  wPortAddr输入输出口地址
  dwPortVal要写入口的数据
  bSize要写的数据个数,可以是 1 (BYTE), 2 (WORD) or 4 (DWORD).
  如果调用成功,则返回非零值。
  如果函数调用失败,则函数返回值为零。
  (二)WinIO程序库的应用
  在C++Builder中应用WinIO程序库需要做如下工作。
  1.首先将 winio.dll, winio.vxd 和 winio.sys三个文件拷贝到用C++Builder开发的工程文件目录下;
  2.在DOS提示符下用 implib 命令创建导入库。implib 命令格式如下:
  implibwinio.libwinio.dll;
  3.将winio.lib 添加到用C++Builder开发的工程中。其操作方法是,在C++BuilderIDE 中选择 Project→Add to project…命令,在弹出的Add to project对话框中“文件类型”下拉列表框中选择Library file (*.lib)项,会出现 .lib文件。选择winio.lib文件并单击“打开”按钮,添加操作成功;
  4.将winio.h中的WINIO_API删除;
  5.在源文件中添加头文件“#include winio.h”;
  6.调用初始化命令函数 InitializeWinIo();
  7.调用库函数GetPortVal、SetPortVal实现端口的输入输出操作;
  8.当所有的端口输入输出操作全部完成,调用库函数ShutdownWinIo
  在内存中清除WinIO库。
  上述的几种方法笔者在不同的应用环境下使用都是正常的没有发现异常现象,其中内嵌汇编语言和使用__emit__函数的方法编制IO端口读写函数,在Windows 98操作系统和C++Builder5.0编程语言环境下使用多年,工作一直很稳定,没有出现任何问题。后来因操作系统升级为Windows XP发现原有的函数不能用了,后在C++Builder6.0编程语言环境下,改用WinIO程序库的输入或输出函数进行端口的直接操作工作一切正常。
其他文献
[摘要]C语言作为当今最为流行的程序设计语言之一,不但成为计算机专业的必修课,而且也越来越多地成为非计算机专业的学习课程。但在《C语言程序设计》课程教学中,许多教师和学生都认为C语言涉及的概念比较复杂,规则繁多,使用灵活,容易出错,教师教学和学生学习都感到困难,并不同程度产生畏难心理。因此,从优化教学方法,强化实践教学,培养学生求知兴趣方面,探讨如何提高《C语言程序设计》课程教学质量。  [关键词
期刊
[摘要]通过对常村煤矿-300m回风大巷光面爆破技术的实践,为该矿在巷道掘进方面积累宝贵的经验-同类巷道,可推广应用c  [关键词]光面爆破 炮眼布置 导向棍 分次起爆  中图分类号:TD-O 文献标识码:A 文章编号:1671-7597(2009)0210096-01    一、概况    洛阳龙门煤业常村煤矿位于偃龙煤田的中西部,井田面积25.41km2,矿井设计生产能力为0.45mt/a,设
期刊
[摘要]“业务流程再造”(BPR)是ERP系统有效实施的保障,是指基于信息技术的、为更好地满足顾客需要,而进行地系统化地组织企业工作流程的相关活动,为企业经营管理提出全新的思路。流程设计是ERP系统实施的重要的工作。梳理现有的业务流程,推进业务流程再造,并对流程进行简化、优化和规范化,做到业务流程系统化和集成化,确保这些业务流程在ERP系统中予以实现,达到信息集成、准确的目的。  [关键词]管理 
期刊
中图分类号:TU1文献标识码:A文章编号:1671-7597(2009)0910088-01    预应力高强混凝土管桩(简称PHC桩),是专业工厂里采用先张法预应力和离心成型工艺,经过蒸压养护而制成的一种空心圆筒体的等截面构件,通过锤击或静压的方法沉入地下作为建(构)筑物的基础。PHC桩在路桥建设施工过程中,会碰到各种质量通病,分析其原因和应对措施主要表现有:    一、沉桩困难,达不到设计标高
期刊
[摘要]由于Microsoft Office辦公套件的广泛应用,以及该软件版本的不断提升,功能不断完善,在Office办公套件平台上开发出的VBA应用程序越来越多,而VBA是一种宏语言,在运行速度上有很大的限制。因此VBA编程的方法直接关系到VBA程序运行的效率,列举一些提高VBA程序运行效率的方法。  [关键词]VBA 对象 宏语言  中图分类号:TP3 文献标识码:A 文童编号:1671-75
期刊
班主任是班级的直接管理者,是做好班级工作和学生思想工作的责任人,是学生个性发展成长的榜样和引路人。做好班主任工作,意义重大而深远。因此作为一名班主任,更应爱岗敬业,以身作则,为人师表,热爱学生,对学生做到严而有度,宽而有节,教而有方,因材施教,保护学生的自。尊心,激发学生的自信心。用自己的爱心和模范行动影响和带动学生,让学生“亲其师,信其道”,只有这样,才能使班级有较强的向心力和凝聚力,形成优良的
期刊
[摘要]随着计算机应用的普及,《Visual Basice语言程序设计》已逐渐成为高等职业技术教育非计算机专业学生的必修课,而计算机的实验教学是我们计算机教学的重点,我们针对vB实验课程本身的特点,结合在教学实践中对vB教学的一些体会,对vB实验课程的教学方法、手段以及提高教学效果的方式等方面的改革进行积极的探索和尝试,以促进vB的教学质量的提高。  [关键词]计算机 VB 实验教学 改革  中图
期刊
[摘要]介绍UML在网络教学课件系统开发中的优势,研究网络教学课件内容分解成各个知识点,来解决课件内容的个性化选择,利用UML技术,实现个性化的网络教学课件系统。  [关键词]网络课件 UML XSL  中图分类号:G43 文献标识码:A 文章编号:1671-7597(2009)0210158-01    一、前言    随着计算机网络技术的快速发展,依托网络,发挥网络丰富的信息资源和不受时空限制
期刊
[摘要]根据信息技术与课程整合的基本要求,提出基于校园网实现语音数字化教学的设计思路,研究开发出一个“数字语音网络教学系统”。教师利用这套系统可在任何一个网络终端建立自己的备课模板,再由管理员建立排课模板,然后带着遥控器,即可在普通教室轻松点播教学所需的高品质的数字音频节目。另外,这套系统还可以实现点对面播音、分区播音、定时播音和学生自主点播学习等,使教学过程实现数字化。  [关键词]数字化 网络
期刊
[摘要]FLASH动画以制作简便、便于播放和传输,在多媒体方面表现力丰富、交互空间广阔等优势,受到广大网络制作者的好评。那么如何使高职院校的学生对于FLASH动画制作感兴趣,并且学好FLASH动画制作的基本技能,是我们教师应该研究的课题。就FLAsH动画以制作的教学问题进行一些探讨。  [关键词]FLASH动画 动画制作 教学设计  中图分类号:G42 文献标识码;A 文章编号:1671-7597
期刊