📄 message.c
字号:
#include<stdio.h>
#include<dos.h>
#include<string.h>
/*8250端口地址*/
#define RSR 0x3f8 /*收发寄存器*/
#define IER 0x3f9 /*中断允许寄存器*/
#define IIR 0x3fa /*中断识别寄存器*/
#define LCR 0x3fb /*线路控制寄存器*/
#define MCR 0x3fc /*MODEM控制寄存器*/
#define LSR 0x3fd /*线路状态寄存器*/
#define MSR 0x3fe /*MODEM状态寄存器*/
/*8259端口地址*/
#define IMR 0x21 /*中断屏蔽寄存器*/
#define EOI 0x20 /*中断结束*/
/*传输类型*/
#define GCH '1' /*接收字符*/
#define SCH '2' /*发送字符*/
#define GFI '3' /*接收文件*/
#define SFI '4' /*发送文件*/
char send[128]; /*用来存放要发送的字符*/
char get[128]; /*用来存放接收到的字符*/
int m=0; /*send[]的下标*/
int n=0; /*get[]的下标*/
int type; /*确定传输类型*/
int end; /*确定是否结束*/
char size; /*块文件的大小*/
FILE *fsend; /*指向要发送的文件的指针*/
FILE *fget; /*指向接收到的文件的指针*/
void interrupt far IntPro(); /*中断服务程序说明*/
void (interrupt far *mode)(); /*mode用来保存原中断向量*/
void Init8250(){ /*初始化8250*/
outportb(LCR,0x80); /*置DLAB=1*/
outportb(0x3f8,0x01); /*设波特率为9600*/
outportb(0x3f9,0x00);
outportb(LCR,0x0b); /*数据位8位,1位停止位,奇校验*/
if(type==GCH||type==GFI){ /*在接受时中断*/
outportb(IER,0x01);
}
else if(type==SCH||type==SFI){ /*在发送时中断*/
outportb(IER,0x02);
}
outportb(MCR,0x0b); /*OUT2,DTR,RTS为1*/
}
void Init8259(){ /*初始化8259*/
char i;
disable();
setvect(0x0c,IntPro); /*设置新中断向量*/
i=inportb(0x21); /*开放IRQ4*/
i=i&0xef;
outportb(0x21,i);
enable();
}
void InitScreen(){ /*初始化屏幕和显示功能选择*/
char c;
int i=0;
char fname[20];
printf("\nPlease choose number:");
printf("\n **********************************************");
printf("\n 1.receive character");
printf("\n 2.send character");
printf("\n 3.receive file ");
printf("\n 4.send file ");
printf("\n **********************************************\n");
c=getch();
if(c=='1'){
printf("\n receiving characters...\n");
}
else if(c=='2'){
printf("\nInput characters you want to send: \n");
gets(send);
}
else if(c=='3'){
printf("\nInput receive filename:");
gets(fname);
printf("\nreceive file (Binary):%s",fname);
if((fget=fopen(fname,"wb"))==NULL){
printf("\nCannot open file");
exit(0);
}
else printf("\n receiveing file...");
}
else if(c=='4'){
i=1;
printf("\nInput send filename:");
gets(fname);
printf("\nsend file (Binary):%s",fname);
if((fsend=fopen(fname,"rb"))==NULL){
printf("\nCannot open file");
exit(0);
}
printf("\n sending file...");
while(i<=119&& !feof(fsend)){
send[i]=fgetc(fsend);
i++;
}
size=i;
send[0]=size;
}
else {
printf("\ncharacter invalidation!");
exit(0);
}
type=c;
}
void SendChar(){ /*发送字符*/
outportb(RSR,send[m]);
if(send[m]=='\0'){ /*发送完毕*/
printf("\n sending finish!\n");
outportb(IER,0x0); /*屏蔽发送中断*/
end=1;
m=0;
}
else {
m++;
}
}
void RecChar(){ /*接收字符*/
get[n]=inportb(RSR);
printf("%c",get[n]);
if(get[n]=='\0'){ /*接收完毕*/
printf("\n receiving finish!");
outportb(IER,0x0); /*屏蔽接收中断*/
end=1;
n=0;
}
else n++;
}
void SendFile(){ /*发送二进制文件,每块120个字符(包括size)*/
int i=1;
outportb(RSR,send[m]);
if(m==(size-1)){
if(size==120){
while(i<=119&& !feof(fsend)){
send[i]=fgetc(fsend);
i++;
}
size=i;
send[0]=size;
m=0;
}
else { /*如果size值小于块的确定值120,则说明传输的是最后一块*/
printf("\nfile sending finish!");
outportb(IER,0x0);
fclose(fsend);
end=1;
}
}
else {
m++;
}
}
void RecFile(){ /*接收二进制文件*/
int i=1;
get[n]=inportb(RSR);
if(n==0){
size=get[n];
}
if(n==(size-1)){
while(i<=n){
fputc(get[i],fget);
i++;
}
if(size!=120){
printf("\nfile receiving finish!");
outportb(IER,0x0);
fclose(fget);
end=1;
}
n=0;
}
else {
n++;
}
}
void interrupt far IntPro(){ /*中断服务程序*/
char i;
disable();
i=inportb(IIR); /*判断是发送中断还是接收中断*/
if(i==0x2){ /*发送中断*/
switch(type){
case SCH: SendChar();break;
case SFI: SendFile();break;
default : break;
}
}
else { /*接收中断*/
switch(type){
case GCH: RecChar();break;
case GFI: RecFile();break;
default : break;
}
}
outportb(EOI,0x20);
enable();
}
void main(){
int flag=1;
char ch;
mode=getvect(0x0c); /*保存原中断向量*/
while(flag){
m=0;
n=0;
end=0;
InitScreen();
Init8250();
Init8259();
while(!end); /*当没有接收完或发送完就继续运行*/
printf("\n\n\n Are you want to continue(Y/N)? ");
ch=getch();
if((ch=='y'||ch=='Y')){flag=1;}
else flag=0;
}
setvect(0x0c,mode); /*恢复原向量*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -