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

📄 rs232.cpp

📁 一个微型操作系统源码
💻 CPP
字号:
#include "inout.cpp"
char sid[10];
struct pack
{
char flag;
char source_address[10];
char destination_address[10];
};
/*- Initiliase the RS232 serial card -*/
	#define INP rec
	#define OUTP send

	/* Defines for RS232 communications */
	#define DLL 0 /* divisor latch low byte */
	#define DLH 1 /* divisor latch high byte */
	#define THR 0 /* transmit hold register */
	#define RBR 0 /* recieve buffer register */
	#define IER 1 /* interrupt enable register */
	#define LCR 3 /* line control register */
	#define MCR 4 /* modem control register */
	#define LSR 5 /* line status register */
	#define MSR 6 /* modem status register */
	#define RTS 0x02 /* request to send */
	#define CTS 0x10 /* clear to send */
	#define DTR 0x01 /* data terminal ready */
	#define DSR 0x20 /* data set ready */
	#define RBF 0x01 /* bit 0 of LSR, rec buf full */
	#define THRE 0x20 /* bit 5 of LSR, trans reg 0 */
	#define DISINT 0x00 /* disable interrupts in IER */
	#define ABRG 0x83 /* access baud rate generator */
	/**/
	unsigned int divisorh, divisorl, format, acia[2];

    char rec(unsigned int add)
     {
     _DX=add;
     asm in al,dx
     return(_AL);
     }

     void send(unsigned int add,int val)
     {
     _DX=add;
     _AL=val;
     asm out dx,al
     }
	void rs232_init( com_port, baud_rate, parity, stops, word_size )
	int com_port, baud_rate, word_size, stops;
	char *parity;
	{

		int far *bios = (int far *)0x00400000l;
		acia[0] = *bios; /* pick up address of com1 routine */
		acia[1] = *(bios + 1); /* pick up address of com2 routine */
		OUTP(acia[com_port] + IER, DISINT ); /* disable ints */
		OUTP(acia[com_port] + LCR, ABRG ); /* access baud rate gen*/
		switch( baud_rate ) {
			/* rem case 75, 110, 135, 150, 200, 1800, 19200 */
			case 300 : divisorh = 01; divisorl = 0x80; break;
			case 600 : divisorh = 00; divisorl = 0xc0; break;
			case 1200 : divisorh = 00; divisorl = 0x60; break;
			case 2400 : divisorh = 00; divisorl = 0x30; break;
			case 4800 : divisorh = 00; divisorl = 0x18; break;
			case 9600 : divisorh = 00; divisorl = 0x0c; break;
			//default: printf("\nrs232_init: Error: Baud rate invalid.\n");
			      //	return -1;
		} /* end of switch */
		OUTP(acia[com_port] + DLL, divisorl );
		OUTP(acia[com_port] + DLH, divisorh );
		format = 0; /* This sets bit 6 and 7 to zero */
		if( (streq( parity, "E" ) == 0) || (streq( parity, "O" ) == 0) ) {
			format = format | 0x28; /* set bit 3 and 5 */
			if( streq( parity, "E" ) == 0 )
				format = format | 0x10; /* set bit 4 */
		}
		if( stops == 2 )
			format = format | 0x04;
		switch( word_size ) {
			case 8 : format = format | 0x03; break;
			case 7 : format = format | 0x02; break;
			case 6 : format = format | 0x01; break;
			case 5 : break;
			default: putmsg("\nrs232_init: Unsupported word length.\n");
			    //	return -1;
		} /* end of switch */
		OUTP(acia[com_port] + LCR, format );
		//return 0;
	}

	/* Transmit a single character to RS232 card -*/
	void transmit( byte,comport )
	char byte;
	int comport;
	{
		OUTP(acia[comport] + MCR, (RTS | DTR) ); /* assert RTS and DTR */
	while((INP(acia[comport] + LSR) & THRE)==0) /* trans reg empty? */
			;
		OUTP(acia[comport] + THR, byte ); /* write character to THR */
		OUTP(acia[comport] + MCR, 0 );
	}

	/* Receive a single character from RS232 card */
	char receive(int comport) 	{
		char byte;
		OUTP(acia[comport] + MSR, (RTS | DTR) );
		while((INP(acia[comport]+LSR) & RBF)==0) /* has Data arrived? */
			;
		OUTP(acia[comport] + MCR,0); /* stop all data */
		byte = INP(acia[comport] + RBR); /* get byte RBR */
		return( byte );
	}
int get_port_status(int port)
{
_AH=3;
_DX=port;
asm int 0x14
return _AX;
}

void receive_msg()
{
char ch=1;
rs232_init(0,9600,0,1,8);
//clear(color(0,2));
putchar(13);
while((ch!=26)&&(ch!=0))
{
ch=receive(0);
putchar(ch);
}
putchar(13);
}



void ping(char des_address[10])
{
char *buff;
rs232_init(0,9600,0,1,8);
static pack pack1;
pack1.flag = 0x01;
for(int i = 0;i<10;i++)pack1.source_address[i] = sid[i];
for(i = 0;i<10;i++)pack1.destination_address[i] = des_address[i];
//transmit(pack1.flag,0);
transmit(1,0);
for(i=0;i<10;i++)transmit(pack1.source_address[i],0);
for(i=0;i<10;i++)transmit(pack1.destination_address[i],0);
if(receive(0))putmsg("Destination Found within  1 hops");
else putmsg("Destination Not Found within  1 hops");
putchar(13);
}

void listen()
{
char c[10];
char ch=0;
pack pack1;
rs232_init(0,9600,0,1,8);
for(int j=0;j<10;j++) c[j]=0;
while(ch!=0x01)
{
ch=receive(0);
}
if( ch == 1){
putchar(13);
 putmsg("Pinging  From ");
 x+=15;gotoxy(x,y);
 //putchar(13);
 for(int i=0;i<10;i++)
   {
   ch=receive(0);
   if(ch!=0) putchar(ch);
   }
 putmsg(" To ");
 x+=5;gotoxy(x,y);
 for(j=0;j<10;j++)putchar(c[j]=receive(0));
 if(streq(c,sid)) transmit(1,0);
 else transmit(0,0);
 putchar(13);
 //break;
//}
}
}
void send_msg()
{
char c=0;
rs232_init(0,9600,0,1,8);
//clear(color(0,2));
putchar(13);
while(c!=26)
{
c = getch();
putchar(c);
transmit(c,0);
}
send(0,0);
putchar(13);
}

void set_sid(char *sids)
{
char buf[512];
char dr;
dr=Drive_No;
Drive_No=0x80;
disk.get_sector(49,1,buf);
Drive_No=dr;
for(int i=0;i<10;i++)sid[i] = 0;
for(i=0;i<10&&sids[i];i++)sid[i] = sids[i];
for( i=0;i<10;i++)buf[i] = 0;
for(i=0;i<10&&sid[i];i++)buf[i] = sids[i];
dr=Drive_No;
Drive_No=0x80;
disk.put_sector(49,1,buf);
Drive_No=dr;
}

void set_sid()
{
 char buf[512];
char dr;
dr=Drive_No;
Drive_No=0x80;
disk.get_sector(49,1,buf);
Drive_No=dr;
for(int i=0;i<10;i++)sid[i] = 0;
for(i=0;i<10&&buf[i];i++)sid[i] = buf[i];
}

void get_sid()
{
putmsg("System ID ==>> ");x+=15;
putmsg(sid);
putchar(13);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -