Cita:
/* programa transfer.c
(c) Vicente Garceran Hernandez 1992
PROGRAMA DE TRANSFERENCIA DE DATOS ENTRE DOS ORDENADORES
UTILIZANDO CONTROL POR SOFTWARE.
------------------------------------------------------
PARAMETRO DE LA COMUNICACION
9600 BAUDIOS
SIN PARIDAD
2 BIT DE PARADA
8 BITS DE DATOS
------------------------------------------------------
*/
/* DIRECTIVAS DEL PREPROECSADOR*/
#define TRUE 1
#define PARAM 0 x E7 /*PARAMETROS COMUNICACION: 1110
0111 = E7H*/
#include <dos.h>
#include <stdio.h>
#include <io.h>
#include <fcnt1.h>
/*DEFINICION DE LAS FUNCIONES*/
void inicia_puerto();
char estado_puerto();
void envia_byte();
char lee_byte();
void etx_puerto();
void envia_nombre_archivo();
void lee_nombre_archivo();
void envia_archivo();
void recibe_archivo();
int port;
main(void)
while (TRUE)
{
system("cls");
printf("MENU DEL PROGRAMA DE TRANSMISION");
printf("________________________________");
printf(" tE-ENVIAR ARCHIVO.n");
printf(" tR-RECIBIR ARCHIVO.n");
printf/" tX-SALIR DEL PROGRAMA.n");
swicht(toupper(getche()))
{
case'E': envia_archivo();
break;
case'R': recibe_archivo();
break;
case'X': exit(0);
}
}
/*================FIN del main()==========*/
void inicia_puerto()/*INICIAL EL PUERTO COM, SEGUN PARAM*/
union REGS regs;
regs.h.ah=0x00;
regs.x.dx=port;
regs.h.al=PARAM;
int86(0x14, ®s, ®s);
/*================FIN de inicia_puerto()==========*/
char estado_puerto()/*LEE EL ESTADO DEL PUERTO COM*/
union REGS regs;
regs.h.ah=0x03;
regs.x.dx=port;
int86(0x14, ®s, ®s);
if(regs.h.ah & 0x80) printf("\t TIEMPO EXCEDISO n");
if(regs.h.ah & 0x40) printf("\t TSR VACIO");
if(regs.h.ah & 0x20) printf("\t THR VACIO");
if(regs.h.ah & 0x10) printf("\t INTERRUPCION");
if(regs.h.ah & 0x08) printf("\t ERROR DE TRAMA");
if(regs.h.ah & 0x04) printf("\t ERROR DE PARIDAD");
if(regs.h.ah & 0x02) printf("\t ERROR DE SOBRECARGA");
return(regs.h.ah);
}
/*=================FIN de estado_puerto()============*/
void enivia_byte(byte)/*ENVIA CARACTER POR EL PUERTO SERIE*/
char byte;
{
union REGS regs;
regs.h.ah = 0x01;
regs.h.dx=port;
regs.h.al=byte;
int86(0x14, ®s, ®s);
if(regs.h.ah & 0x80)
{
printf("\t ERROR DE TRANSMISION");
exit(1);
}
}
/*===============FIN de enviar_byte()============*/
char lee_byte()/*LEE CARACTER DE PUERTO SERIE*/
{
union REGS regs;
/*PRUEBA QUE SE HA RECIBIDO UN CARACTER*/
while(!(estado_puerto() &0x01))
if(kbhit())/*TERMINA SI SE PULSA UNA TECLA*/
{
getch();
exit(1);
}
regs.h.ah=0x02;
regs.x.dx=port;
int86(0x14, ®s, ®s);
if(regs.h.ah & 0x80)
{
prinft("\t ERROR DE LECTURA");
exit(1);
}
return(regs.h.al);
}
/*===============FIN de lee_byte===============*/
void ext_puerto()/*ESPERA RECIBIR CARACTER ETX*/
char c;
c=lee_byte();
if(c!='@')
{
printf("\t DATO NO RECIBIDO... FIN TRANSMISION n");
exit(1);
}
/*==========FIN de etx_puerto()===============*/
void envia_nombre_archivo(ena)/*ENVIA EL NOMBRE DEL ARCHIVO*/
char *ena;
printf("\t TRANSMITIENDO ARCHIVO: %s\n" ena);
do
{
envia_byte('|');/* emviar caracter STX*/
}
while(!kbhit() && !(estado_puerto() & OXFF));
if(kbhit())
{
getch();
printf("\t TECLA PULSADA...FIN DE TRANSMISION n);
exit(1);
}
etx_puerto();/*espera caracter EXT*/
while(*ena)
{
envia_byte(*ena++);
etx_puerto();
}
envia_byte('0'); /* envia caracter nulo*/
}
/*=================FIN de envia_nombre_archivo()==========*/
void lee_nombre_archivo(lna)/*LEEEL NOMBRE DEL ARCHIVO*/
char *lna;
{
printf(\t ESPERA RECIBIR NOMBRE DE ARCHIVO\N");
while (lee_byte() !='|');
envia_byte('@')
while((*lna==lee_byte()))
{
if(*lna !='|')
{
lna++;
envia_byte('@')
}
}
/*=============FIN de lee_nombre_archivo()============*/
viod envia_nombre_archivo()/*OPCIONEN ENVIAR ARCHIVO*/
{
FILE *fp;
char n_archivo[12];
int handle;
int i;
long unsigned int if;
union
{
char byte_archivo[3];
long unsigned int file;
}
longitud;
/*PREGUNTA NUMERO DEL PUERTO SERIE COM*/
printf ("\n NUEMRO DE PUERTO SERIO (COM1=0, COM2=1, ...):");
scanf("%i", sport);
inicia_puerto();/*INICIO DE PUERTO*/
system("cls");
/*PREGUNTA NOMBRE DEL ARCHIVO A ENVIAR*/
printf("\n NOMBRE DEL ARCGHIVO A ENVIAR:");
while(kbhit());
gets(n_archivo);
if((fp=fopen(n_archivo. "rb"))==NULL)
{
perror ("\n error de acceso");
exit(1);
}
envia_nombre_archivo(n_archivo);
etx_puerto();/*ESPERAR EL SIMBOLO DE RECONOCIMIENTO*/
/*OBTIENE LA LONGITUD DEL ARCHIVO*/
handle=open("n_archivo", O_RDONLY);
longitud.file=filelength(handle);
close(handle);
/*ENVIAR LONGITUD DEL ARCHIVO*/
for(i=0; i<3;i++)
{
envia_byte(longitud.byte_archivo(i));
ext_puerto();
}
/*ENVIAR UNO A UNO LOS BYTES DEL ARCHIVO*/
for(lf=1;lf<longitud.file+1;lf++)
{
envia_byte(getc(fp));
etx_puerto();
}
fclose(fp);
}
/*================FIN de enviar_archivo()==========*/
void recibe_archivo()/*OPCION R: RECIBE ARCHIVO*/
{
FILE *fp;
char byte;
int i;
long unsigned int lf;
char n_archivo[12];
union
{
char byte_archivo[3];
long unsigned int file;
}
longitud;
printf ("\n NUEMRO DE PUERTO SERIO (COM1=0, COM2=1, ...):");
scanf("%i", sport);
inicia_puerto();
/*LEE EL NOMBRE DEL ARCHIVO*/
lee_nombre_archivo(n_archivo);
printf("\n ARCHIVO A LEER: %s", n_archivo);
remove(n_archivo);
if((fp=fopen(n_archivo. "wb"))==NULL)
{
perror("n error de acceso");
exit(1);
}
/*LEE LA LONGITUD DEL ARCHIVO*/
for (i=0; i<3, i++)
{
longitud.byte_archivo[i]=lee_byte();
envia_byte('@')
}
/*LEE CADA BYTE DEL ARCHIVO*/
for(lf=logitud.file; lf<0;lf--)
{
byte=lee_byte();
putc(byte, fp);
if(ferror(fp))
{
printf("\n error al escribir el archivo");
exit(1);
}
envia_byte('@')
}
fclose(fp);
}
/*==============FIN de recibir_archivo()==========*/
(c) Vicente Garceran Hernandez 1992
PROGRAMA DE TRANSFERENCIA DE DATOS ENTRE DOS ORDENADORES
UTILIZANDO CONTROL POR SOFTWARE.
------------------------------------------------------
PARAMETRO DE LA COMUNICACION
9600 BAUDIOS
SIN PARIDAD
2 BIT DE PARADA
8 BITS DE DATOS
------------------------------------------------------
*/
/* DIRECTIVAS DEL PREPROECSADOR*/
#define TRUE 1
#define PARAM 0 x E7 /*PARAMETROS COMUNICACION: 1110
0111 = E7H*/
#include <dos.h>
#include <stdio.h>
#include <io.h>
#include <fcnt1.h>
/*DEFINICION DE LAS FUNCIONES*/
void inicia_puerto();
char estado_puerto();
void envia_byte();
char lee_byte();
void etx_puerto();
void envia_nombre_archivo();
void lee_nombre_archivo();
void envia_archivo();
void recibe_archivo();
int port;
main(void)
while (TRUE)
{
system("cls");
printf("MENU DEL PROGRAMA DE TRANSMISION");
printf("________________________________");
printf(" tE-ENVIAR ARCHIVO.n");
printf(" tR-RECIBIR ARCHIVO.n");
printf/" tX-SALIR DEL PROGRAMA.n");
swicht(toupper(getche()))
{
case'E': envia_archivo();
break;
case'R': recibe_archivo();
break;
case'X': exit(0);
}
}
/*================FIN del main()==========*/
void inicia_puerto()/*INICIAL EL PUERTO COM, SEGUN PARAM*/
union REGS regs;
regs.h.ah=0x00;
regs.x.dx=port;
regs.h.al=PARAM;
int86(0x14, ®s, ®s);
/*================FIN de inicia_puerto()==========*/
char estado_puerto()/*LEE EL ESTADO DEL PUERTO COM*/
union REGS regs;
regs.h.ah=0x03;
regs.x.dx=port;
int86(0x14, ®s, ®s);
if(regs.h.ah & 0x80) printf("\t TIEMPO EXCEDISO n");
if(regs.h.ah & 0x40) printf("\t TSR VACIO");
if(regs.h.ah & 0x20) printf("\t THR VACIO");
if(regs.h.ah & 0x10) printf("\t INTERRUPCION");
if(regs.h.ah & 0x08) printf("\t ERROR DE TRAMA");
if(regs.h.ah & 0x04) printf("\t ERROR DE PARIDAD");
if(regs.h.ah & 0x02) printf("\t ERROR DE SOBRECARGA");
return(regs.h.ah);
}
/*=================FIN de estado_puerto()============*/
void enivia_byte(byte)/*ENVIA CARACTER POR EL PUERTO SERIE*/
char byte;
{
union REGS regs;
regs.h.ah = 0x01;
regs.h.dx=port;
regs.h.al=byte;
int86(0x14, ®s, ®s);
if(regs.h.ah & 0x80)
{
printf("\t ERROR DE TRANSMISION");
exit(1);
}
}
/*===============FIN de enviar_byte()============*/
char lee_byte()/*LEE CARACTER DE PUERTO SERIE*/
{
union REGS regs;
/*PRUEBA QUE SE HA RECIBIDO UN CARACTER*/
while(!(estado_puerto() &0x01))
if(kbhit())/*TERMINA SI SE PULSA UNA TECLA*/
{
getch();
exit(1);
}
regs.h.ah=0x02;
regs.x.dx=port;
int86(0x14, ®s, ®s);
if(regs.h.ah & 0x80)
{
prinft("\t ERROR DE LECTURA");
exit(1);
}
return(regs.h.al);
}
/*===============FIN de lee_byte===============*/
void ext_puerto()/*ESPERA RECIBIR CARACTER ETX*/
char c;
c=lee_byte();
if(c!='@')
{
printf("\t DATO NO RECIBIDO... FIN TRANSMISION n");
exit(1);
}
/*==========FIN de etx_puerto()===============*/
void envia_nombre_archivo(ena)/*ENVIA EL NOMBRE DEL ARCHIVO*/
char *ena;
printf("\t TRANSMITIENDO ARCHIVO: %s\n" ena);
do
{
envia_byte('|');/* emviar caracter STX*/
}
while(!kbhit() && !(estado_puerto() & OXFF));
if(kbhit())
{
getch();
printf("\t TECLA PULSADA...FIN DE TRANSMISION n);
exit(1);
}
etx_puerto();/*espera caracter EXT*/
while(*ena)
{
envia_byte(*ena++);
etx_puerto();
}
envia_byte('0'); /* envia caracter nulo*/
}
/*=================FIN de envia_nombre_archivo()==========*/
void lee_nombre_archivo(lna)/*LEEEL NOMBRE DEL ARCHIVO*/
char *lna;
{
printf(\t ESPERA RECIBIR NOMBRE DE ARCHIVO\N");
while (lee_byte() !='|');
envia_byte('@')
while((*lna==lee_byte()))
{
if(*lna !='|')
{
lna++;
envia_byte('@')
}
}
/*=============FIN de lee_nombre_archivo()============*/
viod envia_nombre_archivo()/*OPCIONEN ENVIAR ARCHIVO*/
{
FILE *fp;
char n_archivo[12];
int handle;
int i;
long unsigned int if;
union
{
char byte_archivo[3];
long unsigned int file;
}
longitud;
/*PREGUNTA NUMERO DEL PUERTO SERIE COM*/
printf ("\n NUEMRO DE PUERTO SERIO (COM1=0, COM2=1, ...):");
scanf("%i", sport);
inicia_puerto();/*INICIO DE PUERTO*/
system("cls");
/*PREGUNTA NOMBRE DEL ARCHIVO A ENVIAR*/
printf("\n NOMBRE DEL ARCGHIVO A ENVIAR:");
while(kbhit());
gets(n_archivo);
if((fp=fopen(n_archivo. "rb"))==NULL)
{
perror ("\n error de acceso");
exit(1);
}
envia_nombre_archivo(n_archivo);
etx_puerto();/*ESPERAR EL SIMBOLO DE RECONOCIMIENTO*/
/*OBTIENE LA LONGITUD DEL ARCHIVO*/
handle=open("n_archivo", O_RDONLY);
longitud.file=filelength(handle);
close(handle);
/*ENVIAR LONGITUD DEL ARCHIVO*/
for(i=0; i<3;i++)
{
envia_byte(longitud.byte_archivo(i));
ext_puerto();
}
/*ENVIAR UNO A UNO LOS BYTES DEL ARCHIVO*/
for(lf=1;lf<longitud.file+1;lf++)
{
envia_byte(getc(fp));
etx_puerto();
}
fclose(fp);
}
/*================FIN de enviar_archivo()==========*/
void recibe_archivo()/*OPCION R: RECIBE ARCHIVO*/
{
FILE *fp;
char byte;
int i;
long unsigned int lf;
char n_archivo[12];
union
{
char byte_archivo[3];
long unsigned int file;
}
longitud;
printf ("\n NUEMRO DE PUERTO SERIO (COM1=0, COM2=1, ...):");
scanf("%i", sport);
inicia_puerto();
/*LEE EL NOMBRE DEL ARCHIVO*/
lee_nombre_archivo(n_archivo);
printf("\n ARCHIVO A LEER: %s", n_archivo);
remove(n_archivo);
if((fp=fopen(n_archivo. "wb"))==NULL)
{
perror("n error de acceso");
exit(1);
}
/*LEE LA LONGITUD DEL ARCHIVO*/
for (i=0; i<3, i++)
{
longitud.byte_archivo[i]=lee_byte();
envia_byte('@')
}
/*LEE CADA BYTE DEL ARCHIVO*/
for(lf=logitud.file; lf<0;lf--)
{
byte=lee_byte();
putc(byte, fp);
if(ferror(fp))
{
printf("\n error al escribir el archivo");
exit(1);
}
envia_byte('@')
}
fclose(fp);
}
/*==============FIN de recibir_archivo()==========*/