📄 st1.c
字号:
#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <process.h>
#include <malloc.h>
#define IBUFFLEN 4096
#define OBUFFLEN 4096
#define SERIAL 0xEF
void InitCOM(void);
void OpenCOM(void);
void CloseCOM(void);
void interrupt asyncint();
void interrupt (*asyncoldvect)();
int fComInited=0;
int fBusyCom=0;
unsigned char ModeStatus=0;
unsigned char LineStatus=0;
unsigned char IBuffer[IBUFFLEN];
unsigned short rpI=0;
unsigned short wpI=0;
unsigned char OBuffer[OBUFFLEN];
unsigned short rpO=0;
unsigned short wpO=0;
int read_char(void);
void send_char (unsigned int unCh);
/*void InitialPort()*/
void InitCOM()
{
outportb(0x3FB,0x80); /****线路控制寄存器LCR***/
outportb(0x3F8,0x01); /*******baud 9600********/
outportb(0x3F9,0x00);
outportb(0x3FB,0x03); /****帧格式:1位停止位,8位数据位,无校验位****/
//outportb(0x3FC,0x1f);
outportb(0x3FC,0x08);
//outportb(0x3FC,0x18|0x1b); /****MODEM控制寄存器****/
//outportb(0x3F9,0x0f); /**允许接收中断***/
outportb(0x3F9,0x03);
}
void OpenCOM()
{
unsigned char ucTemp,ch;
if(fComInited)
return;
fComInited=1;
disable();//关中断xin
InitCOM();
asyncoldvect=getvect(0x0c); //保存原串行口中断服务程序地址
//disable();//关中断
outportb(0x3f8,0x00);//clear send interrupt
inportb(0x3f8);
inportb(0x3fe);
inportb(0x3fb);
inportb(0x3fa);
//outportb(0x3fc,0x08|0x0b);//
//outportb(0x3f9,0x01); //
ucTemp=inportb(0x21)&SERIAL;//,读中断屏蔽寄存器,允许串口1中断(COM1中断在8259中是4号中断)
outportb(0x21,ucTemp);
setvect(0x0c,asyncint); //设置新串行口中断服务程序地址
enable();
}
void CloseCOM(void)
{
if(fComInited==0)
return;
fComInited=0;
disable();
outportb(0x3f9,0x00);
outportb(0x3fc,0x00);
outportb(0x21,inportb(0x21)&~SERIAL);//串口中断被屏蔽
enable();
setvect(0x0c,asyncoldvect);
}
void interrupt asyncint()
{
int temp;
while(((temp=inportb(0x3fa))&0x01)==0)
{
switch(temp&0x0f)
{
case 0: ModeStatus=inportb(0x3fe);
break;
case 2: //send data
if(fBusyCom==0)
break;
if(rpO==wpO)
{
fBusyCom=0;
break;
}
outportb(0x3f8,OBuffer[rpO++]);
rpO%=OBUFFLEN;
break;
case 4: //receive data
IBuffer[wpI++]=inportb(0x3f8);
if(wpI==(rpI?rpI:IBUFFLEN))
wpI--;
else
wpI%=IBUFFLEN;
break;
case 6:
LineStatus=inportb(0x3fd);
break;
}
}
outportb(0x20,0x20);
}
int read_char(void)
{
int temp;
if(rpI==wpI)
return -1;
temp=IBuffer[rpI];
rpI=(rpI+1)%IBUFFLEN;
return temp;
}
void send_char (unsigned int unCh)
{
disable();
if(fBusyCom)
{
OBuffer[wpO++]=unCh;
if(wpO==(rpO?rpO:OBUFFLEN))
{
wpO--;
}
else
wpO%=OBUFFLEN;
}
else
outportb(0x3f8,unCh);
fBusyCom=1;
enable();
}
void main() /********主函数*********/
{
int unch;
unsigned char data;
short bExit_Flag=0;
OpenCOM();
fprintf(stdout,"\n\nReady to Receive DATA\n""press [ESC] to quit ...\n\n");
do
{
if(kbhit())
{
unch=getch();
switch(unch)
{
case 0x1b: bExit_Flag=1;
break;
default :break;
}
if(!bExit_Flag)
send_char(unch);
}
unch=read_char();
if(unch!=-1)
{
printf("%c",unch);
}
}
while(!bExit_Flag);
CloseCOM();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -