📄 ars232a.cpp
字号:
//---------------------------------------//
// 工程文件: ARON.PRJ
// 程序: RS232A.CPP
// 功能: 串行通讯控制函数集
// 时间: 97,9,15
//---------------------------------------//
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
#include<bios.h>
#include<io.h>
#include<fcntl.h>
#include<ctype.h>
#include<string.h>
#include "adps.h"
extern char *combuf;
extern int comerror,sendcount,receivecount;
extern int sendready;
extern DPS *head;
extern int COMREGBASE;
extern int COMINTRNO;
extern int COMOPEN;
extern int COMCLOSE;
//------------------------------------------//
// 函数: InitCom()
// 功能: 初始化串口
// 入口参数:
// 出口参数:
//------------------------------------------//
void InitCom()
{
outport(COMREGBASE+3,0x80); //设置波特率=9600BPS
outport(COMREGBASE,0x0b);
outport(COMREGBASE+1,0x00);
outport(COMREGBASE+3,0x03); //设置数据格式:1起始位,8数据位,1停止位
outport(COMREGBASE+4,0x08); //置OUT2有效,允许请求中断
}
//------------------------------------------//
// 函数: SetComIntr()
// 功能: 设置串口中断地址
// 入口参数:
// 出口参数:
//------------------------------------------//
void SetComIntr()
{
union REGS inregs,outregs;
struct SREGS segs;
void interrupt far ComHandler(void);
inregs.h.ah=0x25; //设置串口中断服务程序
inregs.h.al=COMINTRNO;
inregs.x.dx=FP_OFF(ComHandler);
segs.ds=FP_SEG(ComHandler);
intdosx(&inregs,&outregs,&segs);
outport(0x021,inport(0x021)&COMOPEN); //开放8259相应串口中断IR4/IR3
}
//------------------------------------------//
// 函数: CloseComIntr()
// 功能: 关串口中断
// 入口参数:
// 出口参数:
//------------------------------------------//
void ComIntrClose()
{
outport(COMREGBASE+1,0x00); //置OUT2无效,关请求中断
}
//------------------------------------------//
// 函数: SendByte()
// 功能: 从串口发送一字节
// 入口参数:
// 出口参数:
//------------------------------------------//
void SendByte(char byte)
{
outport(COMREGBASE,byte&0x0ff); //发送一字节数据
outport(COMREGBASE+1,0x03); //允许收发中断
}
//------------------------------------------//
// 函数: ComHandler()
// 功能: 串口中断服务程序
// 入口参数:
// 出口参数:
//------------------------------------------//
void interrupt far ComHandler(void)
{
int linestatus,modemstatus,interruptflag;
char receivebyte;
do {
interruptflag=inport(COMREGBASE+2)&0x07; //读中断标志寄存器,清发送寄存器空中断标志
switch(interruptflag)
{
case 0x02: //发送寄存器空引起的中断
sendcount++; //修改计数
break;
case 0x04: //接收数据寄存器满引起的中断
receivebyte=inport(COMREGBASE)&0x00ff; //读接收数据寄存器,清中断标志
combuf[receivecount]=receivebyte;
receivecount++; //修改计数
sendready=1; //可以发送
break;
}
}while((interruptflag&0x01)==0); //循环直到所有串口中断请求被处理完
outport(0x20,0x20); //向8259发EOI
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -