dos下串口中断程序怎么编?

death 2000-08-29 11:17:00
最后能给我个例子,多谢!
...全文
266 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
SCUM 2000-08-30
  • 打赏
  • 举报
回复
fishworm 的方法可以,不过如果过程代码比较多时,就不能直接作成ISR了,否则会当机。
可以在 0Ch 的 ISR 内加一个 busy 标志以解决问题。
满桌烟灰 2000-08-29
  • 打赏
  • 举报
回复
#define BASE 0x3f8
#define DATA 0
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
#define INTNO 0x0c

void interrupt (*oldch1)();
void interrupt far ch1();

void interrupt far ch1()
{
register int id;
unsigned char r_data;
enable();
while (1)
{
id=inportb(BASE+IIR);
if (id==1)
{
outportb(0x20,0x20);
return;
}
switch (id)
{
case 2:
发送数据程序代码;
break;
case 4:
接收数据程序代码;
break;
case 6:
错误处理程序代码;
break;
default:
break;
}
}
outportb(0x20,0x20);
return;
}
主程序中串行口初始化部分:

disable();
outportb(BASE+LCR,0x80);
outportb(BASE+DATA,0x02);
outportb(BASE+IER,0x00);
outportb(BASE+LCR,0x03);以上为设置串行口的波特率

oldch1=getvect(INTNO);保存原串行口中断服务程序地址
setvect(INTNO,ch1);设置新串行口中断服务程序地址
outportb(BASE+IER,0x03);
outportb(BASE+MCR,0X08);
outportb(0x21,inportb(0x21)&INTON);允许串行口中断

程序结束时的处理:
setvect(INTNO,oldch1);
outportb(0x21,inportb(0x21)|~INTON);
outportb(BASE+MCR,0);
outportb(BASE+IER,0);
inportb(BASE+LSR);
inportb(BASE+MSR);


69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧