计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

Windows 中断程序设计(2)

2013-06-01 01:23
导读:五、编程实现 有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以Windows3.1平台下中断方式实现的串行通信为例

五、编程实现
有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以Windows3.1平台下中断方式实现的串行通信为例,说明中断程序的编制和实现。为便于参考,给出了详细的代码。开发平台BC3.1/BC4.5,其本身支持0.9版的DPMI,无需运行其它支持DPMI的软件。编程语言C,可与C++混合编译。
初始化COM1,9600波特率,每字符8bits,1个停止位,中断接收,查询发送。
//windows asy communication
//by Li Xiuming
//last modified on June 25,1996
#include〈windows.h〉
#include〈dos.h〉
void interrupt far DataReceive();
void interrupt far (*old-vector)();
unsigned char datacom-r[1024],datacom-s[1024];
int inflag=0;
unsigned int s8259;
int InitCom1()

{ //串口1初使化
s8259=inportb(0x21); //读入8259当前状态并保存
outportb(0x21,s8259&0xe8); //初始化8259,允许0x0c号中断
outportb(0x3fb,0x83);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00);
outportb(0x3fb,0x03);
outportb(0x3fc,0x08); //允许中断信号送到8259A,以便能中断
outportb(0x3f9,0x01); //0x01,中断允许
return 1;
}
void interrupt far DataReceive()
{ //中断接收子程序
static int i=0; //静态局部变量
char rechar=0; //每中断一次,i自动加1
rechar=inportb(0x3f8); //从数据口读出发送过来的数据
if(inflag==0)
{
if(rechar!=?s? &&i==0) //帧起始
{
i=0;
goto ll;
}
datacom-r[i++]=rechar; //存入datacom-r[](通信缓冲区)
if(rechar==?e?) //帧结束
{
inflag=1;
i=0;
}
}
ll:outportb(0x20,0x20); //回送中断结束标志
}
//调用DPMI
//保存旧的0CH号保护模式中断向量
//设置新的保护模式中断服务例程
void InitCom(void)
{
asm{
cli
mov ax,204h
mov bl,0ch
int 31h
sti 大学排名
}
old-vector=MK-FP(-CX,-DX);//保存
asm{ cli //设置新的0x0c中断服务例程
mov ax,205h
mov bl,0ch
mov cx,seg datareceive
mov dx,offset datareceive
int 31h
sti
}
InitCom1();
}
//恢复8259状态
//恢复0CH保护模式向量
void RestoreComm(void)
{
outportb(0x21,s8259);
asm{
cli
mov ax,205h
mov bl,0ch
mov cx,seg old-vector
mov dx,offset old-vector
int 31h
sti
}
}
在窗口第一次被创建时会传送它WM-CREATE消息,这时调用InitCom()即可。在主窗口关闭时,即主窗口中收到WM-DESTROY消息时,调用RestoreComm()恢复原来的状态。
这样在对串口初始化,设置中断服务例程后,通信事件发生时,会立即跳入中断子程序中执行,越过系统的消息队列,达到实时处理通信事件的目的。而数据处理模块可通过全局标志flag访问全局的数据通信缓冲区获取实时数据。这种实现方式与基于消息机制的Windows通信API实现相比具有实时性强的特点,因为它超过Windows系统的两极消息机制。
上述程序已在实际系统中得到应用。在Windows 3.1支持下,同时运行三个Windows任务:服务器SERVER(内有实时串行通信,多个网络数据子服务),客户CLIENT,FOXPRO数据库系统。整个系统运行良好。切换到WIN95平台下(支持0.9版DPMI),系统也运行良好。

参考文献
1 张豫夫、曹建文译.【澳】Barry Kauler著.Windows汇编语言及系统程序设计.北京大学出版社,1995
2 赵人任等译.【美】Mike Klein者.Windows程序员使用指南(一).北京:清华出版社,1995
3 刘林、陈红编译.80386硬件与接口技术.北京:北京希望电脑公司,1991

上一篇:浅析计算机在城市给水系统中的应用 下一篇:局域网的安全性分析