思索网:WWW.4SO.NET
网站首页
设为首页
加入收藏
社区论坛
联系我们
网站地图
发现个人价值
提高企业内涵
一切源于思索
首页
企业之家
公关文秘
免费论文
网上办公指南
操作系统
多媒体应用
现代教学
下载中心
专题报道
推荐文章
评论
English Article
IT资讯
网页设计
网站运营
编程开发
平面设计
网络安全
工具下载
站内搜索
最新文章
热门文章
论坛
栏目列表
工科论文
管理学论文
公共管理论文
经济学论文
法律论文
政治学论文
会计审计论文
艺术论文
其它类论文
证券金融论文
论文指导
财政税收论文
工商管理论文
财务管理论文
计算机论文
医学论文
哲学论文
教育论文
电子商务
首页
>
免费论文
>
计算机论文
> 用BorlandC++3.1实现外设与Windows应用程序实时通信
用BorlandC++3.1实现外设与Windows应用程序实时通信
日期:
2006-06-10 04:12:01
来源:
请您记住思索网的网址:
http://www.4so.net
[加入收藏夹]
摘要该文提出了一种在Windows3.1保护模式下,通过动态连接库(DLL)生成中断服务程序代码,实现外设与Windows应用程序实时通信的有效方法。
一、前言
计算机
的日益普及和
计算机
技术日益成熟,使得
计算机
在工业控制监测中的应用渐渐深入。但工业应用不同于其它方面,它要求有较强的实时性。现在有很多的DOS软件在运行过程中通过挂接外部中断方式实现DOS应用软件与外设的实时通信,这种方法实现起来十分简单。而在Windows中应用程序能否也能够利用外部硬中断实现外设与Windows应用程序的实时通信呢?答案是肯定的。这里的关键是要解决好中断代码与Windows应用程序相互之间交换信息的问题。
从外设发送异步的硬中断,通过中断处理程序传递一条信息给Windows应用程序。这时可以初始化相关端口,准备好数据,然后进行数据传送,从而做到实时通信。
实现Windows应用程序响应外部中断的方法有很多,如Microsoft
公司
自己开发的SDK、DDK软件包,使用嵌入式汇编等等。本文将介绍一种在BC++3.1的基础上利用Windows3.1拥有的一些功能实现Windows实时通信的实例。
二、中断代码的位置
在Windows中,几乎所有的异步事件都是由中断处理程序来管理的。中断处理程序包含在设备驱动程序中,由Windows在环境初始化中安装。例如,KEYBOARD.DRV、MOUSE.DRV和COMM.DRV均含有中断处理程序,以处理相应的键盘、鼠标和串行口的异步中断。可以仿照标准设备驱动程序,编写中断处理代码,以响应外设的通信请求,从而完成一次实时通信。
中断代码既可以包含在应用程序的可执行代码中,也可以包含在动态连接库(DLL)中。包含在应用程序中的代码只能在一个程序中使用,而在动态连接库中的代码则可以在Windows系统中所有的应用程序所共享。这样不仅在整个Windows系统中只有一个中断代码的副本,提高了内存的使用效率,更重要的是可以防止由于同时存在多个中断代码的副本而发生冲突。本文将在DLL中编制中断处理程序。
当动态连接库被装入时,要调用DLL库的入口点LibMain(),利用这一点可以执行一些初始化工作,可以分配一些内存块,可以初始化一些全局变量或者静态变量,可以安装中断服务程序的代码等等。例如:
voidinterrupt(oldIsr)(--CPPARGS)
/*旧的中断服务程序地址*/
LibMain(HANDLEhInstance,WORDwDataSeg,WORDcbHeapSize,L
PSTR
lpszCmdLine)
{
…
oldIsr=getvect(IRQNum);
/*IRQNum指中断号*/
setvect(IRQNum,newIsr);
/*newIsr指新中断服务程序代码*/
return(1);
}
函数setvect()既可在实模式下,也可在保护模式下设置中断处理向量。
上述代码也可以放在一个由用户设置的引出(export)函数中,在应用程序中用户可以调用此引出函数来安装中断服务程序代码。
由于中断可以在任何时刻发生,中断代码必须驻留在内存中,并且在应用程序运行的过程中一直处于某一固定内存中。这一点无论是在实模式还是在保护模式下都是一致的。
在DLL的模块定义文件中应注意:
1.CODE语句为固定代码段,即FIXED;
2.EXPORTS语句要引出被应用程序和其它DLL用作入口点的函数。
三、通信机制
编写实时通信例程关键在于必须认识到,异步事件对应用程序的触发是异步发生的,不在Windows的消息处理机制和多任务范围内。为了使通信例程能够正确地工作,通信例程必须通知Windows有异步事件发生,且不能打断应用程序的任务管理或消息流。要作到这一点,通信例程必须通过调用PostMessage或PostAppMessage函数向应用程序的消息队列中加入一条消息。
需要注意的是,在DLL中调用PostMessage(HWNDhwnd,…)时,必须先确定hwnd的实际值,可以通过使用引出函数的办法来实现,如下所示:
staticHWNDhWndApp;
voidFARPASCALSetIsrWin(HWNDhwnd)
{
hWndApp=hwnd;
}
然后在应用程序的窗口函数中,对WM-CREATE消息进行处理时调用此函数来初始化DLL中的静态变量hWndApp:
CASEWM-CREATE:
…
SetIsrWin(hwnd);/*hwnd指应用程序窗口句柄*/
定义一个在应用程序中使用的消息:
#defineISRM-RUPTWM-USER+255最后在DLL中的中断服务程序代码中,调用PostMessage即可完成Windows应用程序和中断服务程序代码相互的信息交流:
voidinterruptnewIsr(--CPPARGS)
{
…
PostMessage(hWndApp,WM-RUPT,wParam,lParam);
…
}
四、程序实例
本示例先安装在DLL中的外中断服务代码,通过386/AT总线上的中断申请线(IRQ12)外触发,由中断服务代码发送一条消息WM-RUPT通知Windows应用程序外设有实时通信请求,应用程序收到这条消息后,在窗口用户区显示一条信息,表明已和外设联络上,并同时鸣叫一声喇叭。
程序分为两部分:DLL库代码和Windows应用程序代码。
1.DLL库代码
/*----------*
*interruptincludefile,namedhandle.h*
*----------*/
voidFARPASCALSetIsrWin(HWNDhwnd);
voidFARPASCALSetIRQNum(unsignedcharIRQ);
/*----------*
*moduledefinationfile,namedhandle.def*
*----------*/
LIBRARYHANDLE
EXETYPESWINDOWS
STUB'WINSTUB.EXE'
CODEPRELOADFIXED
DATAPRELOADSINGLE
HEAPSIZE1024
EXPORTS
WEP
@1RESIDENTNAME
SetIRQNum@3
/*----------*
*interruptserviceprogramindll,namedhandle.dll*
本文地址:
http://www.4so.net/thesis/chiphead/54775.html
将本页加入收藏夹
将地址复制到剪贴板发送给好友
若发现本文有误或版权问题点击这里
热门信息
相关文章
[
计算机论文
]
网络办公自动化系统开发分析
[
计算机论文
]
中小企业办公自动化系统的设计与
[
计算机论文
]
学生档案管理系统
[
计算机论文
]
三维连续网络结构增强金属基复合
[
计算机论文
]
ASP技术访问WEB数据库
[
计算机论文
]
智能网络存储方案
[
计算机论文
]
基于网络的视频通讯系统(txx17)
[
计算机论文
]
计算机网络中的交换技术(txx15)
[
计算机论文
]
论网络教育中个别化学习和协作学
[
计算机论文
]
网络经济与中国企业发展
用BootSkin换Windows XP启动画面so easy
方便快捷 要买书不妨先用Bookinfo查一查
妙用Boot文件管理系统启动菜单
用BOOT.INI实现系统多用途启动
文章评论
收藏本文
打印本文
关闭窗口