<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > Windows 中斷程序設計

Windows 中斷程序設計

作者: 時(shí)間:2012-10-19 來(lái)源:網(wǎng)絡(luò ) 收藏

掛住/解掛向量的時(shí)機很重要。主窗口第一次被創(chuàng )建時(shí)會(huì )傳送它WM-CREATE消息,這時(shí)是掛住向量的最好時(shí)機。退出時(shí)需解掛向量,否則可能崩潰。主窗口接收到WM-DE-STROY之后進(jìn)行解掛工作,是最適合的。解掛向量可先用INT35H,0204H功能將老的向量保存,退出時(shí)用INT35H,0205H恢復。

五、編程實(shí)現

有了DPMI的支持,我們就可以很方便地處理數據采集、串行通信等工業(yè)過(guò)程中的實(shí)時(shí)事件。下面以3.1平臺下中斷方式實(shí)現的串行通信為例,說(shuō)明中斷程序的編制和實(shí)現。為便于參考,給出了詳細的代碼。開(kāi)發(fā)平臺BC3.1/BC4.5,其本身支持0.9版的DPMI,無(wú)需運行其它支持DPMI的軟件。編程語(yǔ)言C,可與C++混合編譯。

初始化COM1,9600波特率,每字符8bits,1個(gè)停止位,中斷接收,查詢(xún)發(fā)送。

//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當前狀態(tài)并保存

outportb(0x21,s82590xe8); //初始化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; //靜態(tài)局部變量

char rechar=0; //每中斷一次,i自動(dòng)加1

rechar=inportb(0x3f8); //從數據口讀出發(fā)送過(guò)來(lái)的數據

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號保護模式中斷向量

//設置新的保護模式中斷服務(wù)例程

void InitCom(void)

{

asm{

cli

mov ax,204h

mov bl,0ch

int 31h

sti

}

old-vector=MK-FP(-CX,-DX);//保存

asm{ cli //設置新的0x0c中斷服務(wù)例程

mov ax,205h

mov bl,0ch

mov cx,seg datareceive

mov dx,offset datareceive

int 31h

sti

}

InitCom1();

}

//恢復8259狀態(tài)

//恢復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

}

}

在窗口第一次被創(chuàng )建時(shí)會(huì )傳送它WM-CREATE消息,這時(shí)調用InitCom()即可。在主窗口關(guān)閉時(shí),即主窗口中收到WM-DESTROY消息時(shí),調用RestoreComm()恢復原來(lái)的狀態(tài)。

這樣在對串口初始化,設置中斷服務(wù)例程后,通信事件發(fā)生時(shí),會(huì )立即跳入中斷子程序中執行,越過(guò)系統的消息隊列,達到實(shí)時(shí)處理通信事件的目的。而數據處理模塊可通過(guò)全局標志flag訪(fǎng)問(wèn)全局的數據通信緩沖區獲取實(shí)時(shí)數據。這種實(shí)現方式與基于消息機制的通信API實(shí)現相比具有實(shí)時(shí)性強的特點(diǎn),因為它超過(guò)Windows系統的兩極消息機制。

上述程序已在實(shí)際系統中得到應用。在Windows 3.1支持下,同時(shí)運行三個(gè)Windows任務(wù):服務(wù)器SERVER(內有實(shí)時(shí)串行通信,多個(gè)網(wǎng)絡(luò )數據子服務(wù)),客戶(hù)CLIENT,FOXPRO數據庫系統。整個(gè)系統運行良好。切換到WIN95平臺下(支持0.9版DPMI),系統也運行良好。

參考文獻

1 張豫夫、曹建文譯.【澳】Barry Kauler著(zhù).Windows匯編語(yǔ)言及系統.北京大學(xué)出版社,1995

2 趙人任等譯.【美】Mike Klein者.Windows程序員使用指南(一).北京:清華出版社,1995

3 劉林、陳紅編譯.80386硬件與接口技術(shù).北京:北京希望電腦公司,1991


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: Windows 中斷 程序設計

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>