首页 上一页 1 2 下一页 尾页

VB编程如何直接控制I/O口之一 点击:8174 | 回复:39



如火

    
  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2005-12-05 13:03:00
楼主
一、I/O端口介绍 信号采集与控制是工业控制的最重要组成部分。在工业控制中,通常采集到的信号有两类:一类是电压或电流模拟信号;另一类是开关量或数字脉冲量(开关量、脉冲量都属于数字信号)。通常检测出的信号如果是模拟量的话,必须经过放大、变换变为电压0~10伏或电流0~10mA,这些模拟量必须经过模/数转换器(ADC:Analog-Digital Cnverter)转换成数字量, 才能被计算机所接受。同样输出控制量信号也必须是数字信号,得经过数/模转换器(DAC:Digital-Analog Cnverter),将数字信号转换成模拟信号0~10伏 (或0~+5伏)或变为电流0~10mA, 再送入到控制器去控制生产设备的运行。 而在计算机中,CPU通过总线与输入输出设备相连。系统中的很多其他设备都要通过总线,按照CPU规定的时序分时地与CPU进行指令或数据的传输。因此输入输出设备不能直接与总线相连并占用总线,I/O端口就是在总线和输入输出设备之间进行数据交换的数据中转站,我们与输入输出设备的对话实际上是与I/O端口的对话,下面就详细讲述在Visual BASIC环境下如何进行输出和输入操作。 二、编写操作I/O端口的动态链接库函数 Visual BASIC没有提供直接读写I/O端口的方法,所以只能借助其他语言来编写动态链接库DLL(Dynamic Link Library)或VXD,然后再在Visual BASIC中调用。因此我们不得不先了解如何编写操作I/O端口的动态链接库函数。 1.在汇编语言中,可以用 in、out 指令操作I/O端口,具体示例如下: 输入操作: MOV DX, Port;Port为端口号 IN AL, DX;读入端口数据到AL寄存器 输出操作: MOV DX, Port;Port为端口号 MOV AL, ConByte;ConByte为控制字,将控制字送到AL寄存器 OUT DX, AL;送出控制字到端口 2.在C/C++中,通常用inp和_outp函数操作I/O端口,编写动态链接库我们可以编写如下两个函数,并把它编译生成DLL: /*作用:从指定端口读入一个字节,参数:portid端口号,返回值:读入的字节*/ int _stdcall Inport(short portid) {  return inp(portid); } /*作用:向指定端口写入一个字节,参数:portid端口号*/ void _stdcall Outport(short portid,short value) {  outp(portid, value); } 当需要一次操作两个字节时,我们就必须用到inpw和outpw两个函数,具体用法同inp和outp。 同时需要说明的是,_inp和_outp函数和inp和outp函数用法基本上相同,只是在使用时需要头文件,而且本人推荐使用_inp和_outp,而不是使用inp和outp。因为_inp和_outp在Debug和Release都可以使用,而inp和outp只能用于Release设置。如果在Debug设置时使用inp和outp,编译时不会错,但会产生链接错误。 三、Visual BASIC中操作I/O端口 到此我们就可以在Visual BASIC中通过动态链接库技术间接操作I/O端口了。在Visual Basic中动态链接库必须提前申明,其缺省为公有过程或函数。其格式为: “Declare Sub 过程名 Lib ‘库名’ [Alias ‘别名’] [(参数表)]”,或者“Declare Function 过程名 Lib ‘库名’ [Alias ‘别名’] [(参数表)] As 类型”。例如: Public Declare Function Outport Lib "vcDll.dll" (ByVal portid As Integer, ByVal value As Integer) As Integer //IO输出函数 Public Declare Function Inport Lib "vcDll.dll" (ByVal portid As Integer) As Integer //IO输入函数 这样定义后在程序中就可以直接使用上面定义的函数或过程来操作I/O端口了。 感谢网友大浪淘沙提供,由工控网整理。



龅牙苏

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 45回
  • 年度积分:0
  • 历史总积分:3501
  • 注册:2004年5月27日
发表于:2005-12-05 19:06:00
1楼
这篇文章真不错!顶!

leondandan

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 30回
  • 年度积分:0
  • 历史总积分:38
  • 注册:2004年6月06日
发表于:2005-12-08 07:14:00
2楼
正需要这么一片文章。谢谢楼主

wenjun

  • 精华:0帖
  • 求助:0帖
  • 帖子:27帖 | 629回
  • 年度积分:0
  • 历史总积分:733
  • 注册:2005年2月21日
发表于:2005-12-08 08:03:00
3楼
支行!

zsbs

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 145回
  • 年度积分:1
  • 历史总积分:234
  • 注册:2003年11月27日
发表于:2005-12-09 20:52:00
4楼
文中的汇编语言和C语言对IO的访问,都不能在WIN2000中直接使用,因WIN2000的安全保护机制不允许,除非用底层驱动程序绕过安全保护机制

浪费青春

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 95回
  • 年度积分:0
  • 历史总积分:124
  • 注册:2004年6月01日
发表于:2005-12-15 11:25:00
5楼
好文章,激情如火的好文章不断阿,哈哈,谢谢

薛振框

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2004年3月08日
发表于:2005-12-15 11:32:00
6楼
感谢楼主!!!

山水

  • 精华:4帖
  • 求助:0帖
  • 帖子:128帖 | 2238回
  • 年度积分:0
  • 历史总积分:3675
  • 注册:2004年1月06日
发表于:2005-12-15 11:50:00
7楼

IBL

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 13回
  • 年度积分:0
  • 历史总积分:34
  • 注册:2005年12月22日
发表于:2005-12-22 17:34:00
8楼
十分感谢,文章很好!~

zhongdingjidian

  • 精华:3帖
  • 求助:0帖
  • 帖子:167帖 | 1364回
  • 年度积分:0
  • 历史总积分:2372
  • 注册:2003年5月29日
发表于:2006-01-13 11:33:00
9楼
好文章

王黎明

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2006年2月14日
发表于:2006-02-16 10:06:00
10楼
谢谢! 好!

lostcity.blog.zj.com

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 246回
  • 年度积分:0
  • 历史总积分:350
  • 注册:2005年7月11日
发表于:2006-02-16 15:24:00
11楼
bucuo 


____________________________________
My blog 
http://lostcity.blog.zj.com
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 

canfly

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 195回
  • 年度积分:0
  • 历史总积分:321
  • 注册:2005年5月12日
发表于:2006-04-01 09:44:00
12楼
谢谢了,学习中

canfly

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 195回
  • 年度积分:0
  • 历史总积分:321
  • 注册:2005年5月12日
发表于:2006-04-01 09:52:00
13楼
谢谢了,学习中

大鸟一人

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 152回
  • 年度积分:0
  • 历史总积分:186
  • 注册:2004年4月16日
发表于:2006-04-04 10:58:00
14楼
这个方法基本上过时了,现在很少有机器用win98或winme了。
基本上我是下载一个端口访问的驱动软件,带开发包来用的

alou

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 107回
  • 年度积分:0
  • 历史总积分:410
  • 注册:2004年2月07日
发表于:2006-04-04 17:26:00
15楼
很不错的文章,只是我在考虑,怎么饶过操作系统的内存保护直接读写i/o口,在c++ 中直接加入汇编不知道行不行,

alou

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 107回
  • 年度积分:0
  • 历史总积分:410
  • 注册:2004年2月07日
发表于:2006-04-04 17:28:00
16楼
很不错的文章,只是我在考虑,怎么饶过操作系统的内存保护直接读写i/o口,在c++ 中直接加入汇编不知道行不行,在window 操作系统中好象用编成语言直接读写i/o口一般很难.

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-05-10 11:12:00
17楼
對於 I/O 的限制, 那是在 Windows NT/2K/XP/2003 中都存在的. 跟您所使用的編程語言無關, 純是系統所作之限制, 以提高系統之穩定性. 

WINDOWS2000下的VB6直接端口读写操作 --- WINIO
http://www.daqchina.net/daqchina/download/winio.htm

autoyx.com

  • 精华:0帖
  • 求助:0帖
  • 帖子:32帖 | 634回
  • 年度积分:0
  • 历史总积分:882
  • 注册:2005年9月27日
发表于:2006-05-10 20:11:00
18楼
C++编程预定义标准功能块见:
http://www.autoyx.com/IOAsm/02b.htm

lxxxx1

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2006年5月16日
发表于:2006-05-16 21:44:00
19楼
我使用winio在vb程序中调用winio.dll但老是 InitializeWinIo=false是怎么回事?请教各位

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2006-06-26 20:22:00
20楼
Private Sub Form_Load()
请看一下这个函数返回值怎么不是真是假呢用WINIO不是先用InitializeWinIo函数再用ShutdownWinIo函数吗
    If InitializeWinIo = False Then

        MsgBox "错误,无法开启端口!"

        End

    End If


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页