# include # include # include <>
<>
<>
# include # include # include <>
<>
using namespace std;
confirmar_trasmisicion bool (char aux , char a []) bool
iniciar_trasmicion (char a []) bool
issuer (char a []) bool
receptor (char a []);
mandar_primitiva char (char original, char a []);
unsigned short CRC16 (char value);
unsigned short desarmarTrama (char & data, unsigned int frame);
armarTrama unsigned int (char data, unsigned short crc);
rellenar_trama void (char a [], char aux []);
colocar_crc_a_trama string (string aux1);
sacarle_crc_a_trama string (string pattern);
quitar_payload string (string pattern);
confirmar_trasmisicion_trama bool ( char aux [], char a []);
contador_maestro
int = 0;
int main (void)
{int c;
char serial [10] = {"COM1"};
/ / court <<"ingrese el puerto en mayusculas"<
/ / cin>> serial;
int option = 0;
<<"iniciar juego = 1 "<
court cin>> choice;
if (option == 1) {
/ / if (iniciar_trasmicion (serial) == true) {
while (true) {
while (caller (serial)! = false) {}
while (receiver (serial)! = false) {}}
/
} / / else couto <<"la trasmisicion no se pudo completar"<
} if (option = = 2) {
while (true) {
while (receiver (serial)! = false) {}
while (caller (serial)! = false) {}}
}} bool
iniciar_trasmicion (char a [])
{
FILE * dp;
if ((dp = fopen (a, "wt "))== NULL)
{printf (" Could not open the COM port, something happens .. \\ n ") ; return 1;} bool
bo = false;
char aux;
char m;
<<"estableciendo conexion : ingrese la letra E para iniciar conexion"<
court cin>> m;
aux = ma;
<<"esperando confirmacion de recepcion..."<
court fputc (m, dp);
fflush (dp);
fclose (dp);
int counter = 0;
while (contador! = 11)
{if (counter == 10) return false;
if (confirmar_trasmisicion (ma, a) == true) return true;
else confirmar_trasmisicion (ma, a);
counter + +;}
fclose (dp);}
confirmar_trasmisicion bool (char aux, char a []) {
FILE * dp;
if ((dp = fopen (a, "rt "))== NULL)
{printf ("Could not open the COM port, something happens .. \\ n") return 1;}
char c;
c = fgetc (dp);
if (c == 121) { else {court court <<"dato enviado correctamente ACK"<
<<"dato erroneo NACK reenviando dato"<
fclose (dp);
char copy [1] = {aux};
rellenar_trama (a, copy);}
fclose (dp);}
confirmar_trasmisicion_trama bool (char aux [], char a []) {
FILE * dp;
if ((dp = fopen (a, "rt "))== NULL)
{printf (" Could not open the COM port, something passes .. \\ n "); return 1;}
char c;
c = fgetc (dp);
if (c == 121) {court <<"trama enviada correctamente ACK"<
else {court <<"trama erronea NACK reenviando trama"<
fclose (dp) if ((dp = fopen (a, "wt "))== NULL)
{printf (" Could not open the COM port, something happens .. \\ n ") return 1;} string
aux1 = aux;
nueva_trama_rellena_de_crc
string;
colocar_crc_a_trama nueva_trama_rellena_de_crc = ( aux1);
while (nueva_trama_rellena_de_crc.size ()! = 19) {
nueva_trama_rellena_de_crc + = "f";}
int ingresar_dato;
<<"desea dañar la trama? 1= SI 2= NO"<
court cin>> ingresar_dato;
if (ingresar_dato == 1) { the string; court <<"ingrese la nueva trama dañada"<
fflush (SD) fclose (dp); char * pa pa = new char [nueva_trama_rellena_de_crc.size () +1 ]; strcpy (aa, nueva_trama_rellena_de_crc.c_str ()); confirmar_trasmisicion_trama (aa, a);}
else{
fputs(nueva_trama_rellena_de_crc.c_str(), dp);
fflush(dp);fclose(dp);
char *aa;aa=new char [nueva_trama_rellena_de_crc.size()+1];strcpy(aa,nueva_trama_rellena_de_crc.c_str()) ; confirmar_trasmisicion_trama(aa,a);
}
}
fclose(dp);
}
bool emisor(char a[]){
char aux[48];
cout <<"Ingrese el texto que desea enviar,para finalizar ingrese la letra f "<
cin>>aux;
if(aux[0]=='f'
if ((dp = fopen (a, "wt "))== NULL)
{printf (" Could not open the COM port, something happens .. \\ n ") return 1;} string
aux1 = aux;
nueva_trama_rellena_de_crc string;
colocar_crc_a_trama nueva_trama_rellena_de_crc = (aux1);
while (nueva_trama_rellena_de_crc.size ()! = 19) {
nueva_trama_rellena_de_crc + = "f"}
int counter = 0;
court <<"esperando confirmacion de recepcion..."<
fputs (nueva_trama_rellena_de_crc.c_str (), dp);
fflush (dp); fclose (dp);
while (contador! = 11)
{if (counter == 10) return true;
if (confirmar_trasmisicion (' f ', a) == true) {int end
; <<"MODO RECEPTOR: Esperando datos..."<
court cin>> end;
if (end == 1) {system ("exit"); court <<"deberia salirse"<
if (end == 2) {return false ;}}
else
confirmar_trasmisicion ('f', a);
counter + +;
}} else {
FILE * dp;
if ((dp = fopen (a, "wt "))== NULL)
{printf (" Could not open the COM port, something happens .. \\ n ") return 1;} string
aux1 = aux;
nueva_trama_rellena_de_crc string;
nueva_trama_rellena_de_crc = colocar_crc_a_trama (aux1);
while (nueva_trama_rellena_de_crc.size ()! = 19) {
nueva_trama_rellena_de_crc + = "f"}
<<"TRAMA : "<
int ingresar_dato court;
<<"desea dañar la trama? 1= SI 2= NO"<
court cin>> ingresar_dato;
if ( ingresar_dato == 1) {string da; court <<"ingrese la nueva trama dañada"<
fflush(dp);fclose(dp); if(confirmar_trasmisicion_trama(aux,a)==true) {return true;}else {return true;};}
else{
fputs(nueva_trama_rellena_de_crc.c_str(), dp);
fflush(dp);fclose(dp);
if(confirmar_trasmisicion_trama(aux,a)==true) {return true;}else {cout <<"se salio "<
}
}
}
char mandar_primitiva(char primitiva, char a[] ){
FILE *dp;
if ((dp = fopen(a, "wt"))==NULL)
{
printf("No Could not open the COM port, something happens .. \\ n ") return 1;}
fputc (primitive, dp);
fflush (dp); fclose (dp);} void
rellenar_trama (char a [], char aux []) {FILE * dp
;
if ((dp = fopen (a, "wt "))== NULL)
{printf (" Could not open the COM port, something happens .. \\ n ");} string
aux1 = aux;
while (aux1.size ()! = 19) {
aux1 + =" f "}
fputs (aux1.c_str (), dp);
fflush (dp); fclose (dp);}
quitar_payload string (string pattern) {new string
;
for (int i = 0; i
if (isdigit (frame [i])! = false )
{} else if (frame [i]! = 'f' & & frame [0]! = 'f') {back + = pattern [i];}}
return again;}
bool
receptor (char a []) {court
<
contador_maestro + +;
<<"Esperando datos... "<
court FILE * dp;
if ((dp = fopen (a, "rt "))== NULL) {printf (" No Could not open the COM port, something happens .. \\ n ") return 1;} catch
char [20];
fgets (capture, 20, dp);
if (capture [0] == 'f' <<"Enviando confirmacion de recepcion [ACK]"<
//poly = polinomio de crc16 (x16 + x15 + x2 + 1) = 0xA001
unsigned short poly = 0xA001, init_value = 0x0000, exit_value = 0x0000;
unsigned short res;
char i;
<<"sin crc : "<
<<"crc de la trama : "<
res=value;
<<"aux1 : "<
res^=init_value;
<<"crc_generado_del_emisor : "<
for(i=0;i <<"TRAMA CORRECTA"<
if(res & 1){
<<"TRAMA INCORRECTA"<
res>>= 1;
<
res^=poly;
}else{
res>>= 1;
}
}
res^=exit_value;
res^= 0xFFFF;
return res;
}
/ / append the data to crc arming the plot to send
armarTrama unsigned int (char data, unsigned short crc)
{unsigned int res = crc;
res / / court <8;i++){
res + = data;
return res;
} / / returns the CRC that comes out of the frame received and reference, returns the character data received in the plot
unsigned short desarmarTrama (char & data, unsigned int pattern)
{unsigned int crc = plot;
crc>> = 8;
unsigned short res = crc;
crc data = plot-crc;
return (unsigned short) res;
}
string sacarle_crc_a_trama (string frame)
{string again; <<= 8;
for (int i = 0; i << res << endl;
if (isdigit (frame [i])! = False)
{
new + = pattern [i];
}}
return again;}
<<= 8;
colocar_crc_a_trama string (string aux1)
{int sum = 0;
for (int i = 0; i {
char data = aux1 [i];
unsigned int i;
unsigned short inival;
/ / generates the character of
inival crc = CRC16 (data);
/ / court
/ / generate the plot
an unsigned integer unsigned int frame = armarTrama (data, inival)
/ / court
/ / data stores the data that is out of the frame
char data;
/ * we damage plot - to recognize descomentariar
damaged frame frame + = 1;
court
* / unsigned short crc =
desarmarTrama (data, plot);
/ / crc crc stores to compare the plot
/ / court
/ / to know if the frame arrived safely compared with the CRC16 crc of << "El CRC del caracter: " << datos << " es: " << inival << endl;
/ / data received, if they are equal, the plot is But otherwise,
/ / you have to ask the plot back
sum + = CRC16 (data);
court << "trama = " << trama << endl;
}
char poly [65536];
aux1 + = itoa (sum, poly, 10);
return aux1 ;}
<< "trama modificada = " << trama << endl;