VB没有提供直接访问低层硬件的控件和方法,一度给对访问硬件感兴趣的编程者带来不便。 目前我们可从网上搜索到支持低层硬件访问的DLL和ActiveX控件,通过它们可读写存储器单 元、端口,甚至控制硬件中断。下面通过两个利用DLL和ActiveX控件示例介绍VB对低层硬件的 访问控制。 一、利用DLL读写端口 若在应用程序中只是简单地读写端口,利用DLL编程实现较为简 便。从http://personal.vsnl.com/sr网站可下载一个免费的32位VBIO.DLL,该连接库允许在VB4、5 或6中使用,共有七个函数和过程,分别为: AnjanDLL的解锁过程 Inp端口读字节函数 Inpw端口读字函数 Out端口写字节过程 Outw端口写字过程 GetLptBaseAddr获取并口基地址的函数 GetComBaseAddr获取串口基地址的函数 一个发声示例程序的窗体,在输入框中键入一频率值并按SoundOn钮,则在PC机的 扬声器中发出指定频率音调,程序中对音调的变化、声音的开关是用VBIO.DLL的过程和函数 访问发声系统的定时器/计数器和控制端口实现的。编程要点: 1.应在Form_Load中加入Anjan 解锁过程。 2.若在模块中声明函数和过程,应去掉private或用Public替代。 3.VBIO.DLL应拷 贝到/windows/system子目录下。
程序清单: OptionExplicit PrivateDeclareSubAnjanLib “vbio.dll"() PrivateDeclareFunctionInpLib “vbio.dll"(ByValport&)AsInteger PrivateDeclareFunctionInpwLib “vbio.dll"(ByValport&)AsLong PrivateDeclareSubOutLib “vbio.dll"(ByValport&,ByValbyt%) PrivateDeclareSubOutwLib “vbio.dll"(ByValport&,ByValwrd&) PrivateDeclareFunctionGetLptBaseAddrLib “vbio.dll"(ByVallpt&)AsInteger PrivateDeclareFunctionGetComBaseAddrLib “vbio.dll"(ByValcom&)AsInteger PublicSubSetFreq(soundHzAsInteger) 设置频率 IfsoundHzThen DimdivisorAsLong divisor=1193180/soundHz计算时间常数 Out&H42,&HB6 8253-5通道2设置为方式3 Out&H42,divisorMod256送时间常数 Out&H42,divisor/256 SpeakerTrue Else SpeakerFalse EndIf EndSub PublicSubSpeaker(sOnAsBoolean)开关声音 DimportValAsInteger portVal=Inp(&H61) IfsOnThen portVal=portV r3 低位为通道2的门控信号 Else次低位为整形与门控制信号 portVal=portValAnd(Not3) EndIf Out&H61,portVal
EndSub PrivateSubForm_Load() Anjan软件解锁 EndSub PrivateSubSoundOff_Click() SpeakerFalse EndSub PrivateSubSoundOn_Click() SetFreqVal(TextHz) EndSub 二、利用ActiveX处理硬件中断
在应用程序中如果需要访问存储单元、端口以及处理硬件中断,使用TVicHW32ActiveX 控件是一很好的选择,该控件是一个共享软件,支持Windows95/98/NT,可从http://www.entechtaiwan.com/tools.htm 处下载。该控件除具备直接访问存储单元和端口的功能外,还提供了丰富的处理并口的属性 和方法,以及处理硬件中断的属性、方法和事件,极大地拓展了VB对低层硬件的访问控制。下 面通过一个显示键盘中断次数和按键扫描码的示例介绍控件的使用过程。 下载TVicHW32压缩软件包并解压到一个目录中,如/HW。把driver子目录下的vichw00.vxd文 件拷贝到/windows/system子目录下,该文件是控件访问硬件的驱动程序,使用控件前先用OpenDriver 打开,最后用Close_Driver方法关闭。 把ocx子目录下的tvichw32.ocx拷贝到/windows/system子目录下,并在DOS命令行状态下键 入以下命令进行注册: regsvr32tvichw32.ocx 在VB环境下通过菜单工程--部件--控件并选择TVicHW32ActiveXControlModule将控 件添加到工具箱中。 相关的属性、方法及事件 方法OpenDriver打开支持访问硬件 的驱动程序vichw.vxd(windows95下) 方法CloseDriver关闭驱动程序 属性ActiveHWAsBool驱动程序打开 则为True;关闭为False 中断事件OnHwInterrupt(ByValHwCounterAsLong, ByValLPT_DataRegAsInteger, ByValLPT_StatusRegAsInteger, ByValScanCodeAsInteger ) 参数 HwCounter:中断次数 LPT_DataReg:如果使用IRQ7, 则为打印并口的数据 LPT_StatusReg:如果使用IRQ7, 则为打印并口的数据 ScanKode:如果使用IRQ1, 则为按键的扫描码 属性IRQNumber指定中断号, 范围IRQ1--15 属性IRQMasked中断非屏蔽则为True; 屏蔽为False。
示例的窗体,程序运行后首先按Open_Driver钮打开驱动程序,然后选择Unmarsk 复选框开放中断,此时每按一次键框中分别显示该键的扫描码和中断次数。处理其他中断只 需更改中断号即可(中断号1—15)。
程序清单: PublicSubShowButtons() Open_Driver.Enabled=NotHwCtrl.ActiveHW Close_Driver.Enabled=HwCtrl.ActiveHW B_Unmask.Enabled=HwCtrl.ActiveHW EndSub PrivateSubForm_Load() ShowButtons EndSub PrivateSubOpen_Driver_Click() HwCtrl.OpenDriver打开驱动程序 IfNotHwCtrl.ActiveHWThen MsgBox(“ThedriverVICHWxxnotfound") Else: HwCtrl.IRQNumber=1中断号为1,键盘中断 EndIf ShowButtons EndSub PrivateSubClose_Driver_Click() HwCtrl.CloseDriver关闭驱动程序 B_Unmask.Value=0 ShowButtons EndSub PrivateSubB_Unmask_Click() IfB_Unmask.Value=0Then HwCtrl.IRQMasked=True Else EndSub  
|