⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.c

📁 两机串口通信 可以传送各种文件
💻 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 + -