miércoles, 19 de enero de 2011

chat por puerto serial r-232

#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
using namespace std;
bool confirmar_trasmisicion(char aux, char a[]);
bool iniciar_trasmicion(char a[]);
bool emisor(char a[]);
bool receptor(char a[]);
char mandar_primitiva(char primitiva,char a[]);
unsigned short CRC16(char value);
unsigned short desarmarTrama(char& dato, unsigned int trama);
unsigned int armarTrama(char dato, unsigned short crc);
void rellenar_trama(char a[], char aux[]);
string colocar_crc_a_trama(string aux1);
string sacarle_crc_a_trama(string trama);
string quitar_payload(string trama);
bool confirmar_trasmisicion_trama(char aux[], char a[]);

int contador_maestro=0;
int main(void)
{
int c;
char serial[10]={"COM1"};
//cout<<"ingrese el puerto en mayusculas"<//cin>>serial;
int opcion=0;
cout<<"iniciar juego = 1 "<cin>>opcion;
if(opcion==1)
{
//if(iniciar_trasmicion(serial)==true){
while(true){
while(emisor(serial)!=false){}
while(receptor(serial)!=false){}
}
//}
//else cout<<"la trasmisicion no se pudo completar"<
}
if(opcion==2)
{
while(true){
while(receptor(serial)!=false){}
while(emisor(serial)!=false){}


}

}
}


bool iniciar_trasmicion( char a[] )
{



FILE *dp;
if ((dp = fopen(a, "wt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
bool bo=false;
char aux;
char ma;
cout<<"estableciendo conexion : ingrese la letra E para iniciar conexion"<
cin>>ma;
aux=ma;
cout<<"esperando confirmacion de recepcion..."<fputc( ma, dp);
fflush(dp);
fclose(dp);
int contador =0;
while(contador!=11)
{
if(contador==10)return false;
if(confirmar_trasmisicion(ma,a)==true)return true;
else confirmar_trasmisicion(ma,a);
contador++;
}
fclose(dp);
}

bool confirmar_trasmisicion(char aux, char a[])
{
FILE *dp;
if ((dp = fopen(a, "rt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
char c;
c=fgetc(dp);
if(c==121){cout<<"dato enviado correctamente ACK"< else{cout<<"dato erroneo NACK reenviando dato"< fclose(dp);
char copia[1]={aux};
rellenar_trama(a,copia);
}
fclose(dp);
}
bool confirmar_trasmisicion_trama(char aux[], char a[])
{
FILE *dp;
if ((dp = fopen(a, "rt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
char c;
c=fgetc(dp);
if(c==121){cout<<"trama enviada correctamente ACK"< else{cout<<"trama erronea NACK reenviando trama"< fclose(dp);if ((dp = fopen(a, "wt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
string aux1=aux;

string nueva_trama_rellena_de_crc;
nueva_trama_rellena_de_crc = colocar_crc_a_trama( aux1);


while(nueva_trama_rellena_de_crc.size()!=19){

nueva_trama_rellena_de_crc+="f";

}
int ingresar_dato;
cout<<"desea dañar la trama? 1= SI 2= NO"< cin>>ingresar_dato;
if(ingresar_dato==1){string da;cout<<"ingrese la nueva trama dañada"<>da;nueva_trama_rellena_de_crc=da; 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);}
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'||aux[0]=='F'){FILE *dp;
if ((dp = fopen(a, "wt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}


string aux1=aux;
string nueva_trama_rellena_de_crc;
nueva_trama_rellena_de_crc = colocar_crc_a_trama( aux1);


while(nueva_trama_rellena_de_crc.size()!=19){

nueva_trama_rellena_de_crc+="f";

}
int contador =0;
cout<<"esperando confirmacion de recepcion..."<
fputs(nueva_trama_rellena_de_crc.c_str(), dp);
fflush(dp);fclose(dp);

while(contador!=11)
{
if(contador==10)return true;
if(confirmar_trasmisicion('f',a)==true){
int finalizar;cout<<"MODO RECEPTOR: Esperando datos..."<
cin>>finalizar;
if(finalizar==1){system("exit");cout<<"deberia salirse"< if(finalizar==2) {return false;}
}
else confirmar_trasmisicion('f',a);
contador++;
}

}

else{
FILE *dp;
if ((dp = fopen(a, "wt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
string aux1=aux;
string nueva_trama_rellena_de_crc;
nueva_trama_rellena_de_crc = colocar_crc_a_trama( aux1);

while(nueva_trama_rellena_de_crc.size()!=19){

nueva_trama_rellena_de_crc+="f";

}
cout<<"TRAMA : "< int ingresar_dato;
cout<<"desea dañar la trama? 1= SI 2= NO"< cin>>ingresar_dato;
if(ingresar_dato==1){string da;cout<<"ingrese la nueva trama dañada"<>da;nueva_trama_rellena_de_crc=da; fputs(nueva_trama_rellena_de_crc.c_str(), dp);
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 se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
fputc(primitiva, dp);
fflush(dp);fclose(dp); }

void rellenar_trama(char a[], char aux[] ){
FILE *dp;
if ((dp = fopen(a, "wt"))==NULL)
{
printf("No se pudo abrir el puerto COm , algo pasa ..\n");}
string aux1=aux;
while(aux1.size()!=19){

aux1+="f";

}

fputs(aux1.c_str(), dp);
fflush(dp);fclose(dp);
}
string quitar_payload(string trama){
string nuevo;
for(int i=0;i if(isdigit(trama[i])!=false)
{}else if(trama[i]!='f'&&trama[0]!='f'){nuevo+=trama[i];}
}


return nuevo;
}

bool receptor(char a[]){
cout< contador_maestro++;
cout<<"Esperando datos... "< FILE *dp;
if ((dp = fopen(a, "rt"))==NULL){printf("No se pudo abrir el puerto COm , algo pasa ..\n");return 1;}
char capturar[20];
fgets(capturar,20,dp);
if(capturar[0]=='f'||capturar[0]=='F'){cout<<"Enviando confirmacion de recepcion [ACK]"<else {
string nuevo;
nuevo = quitar_payload(capturar);
cout<<"sin crc : "<cout<<"crc de la trama : "<string aux1=colocar_crc_a_trama(nuevo);
cout<<"aux1 : "<string crc_generado_del_emisor=sacarle_crc_a_trama(aux1);
cout<<"crc_generado_del_emisor : "<if(sacarle_crc_a_trama(capturar)==crc_generado_del_emisor){cout<<"TRAMA CORRECTA"<else {cout<<"TRAMA INCORRECTA"<cout<fclose(dp);
return true;
}


}
unsigned short CRC16(char value){
//poly = polinomio de crc16 (x16 + x15 + x2 + 1) = 0xA001
unsigned short poly = 0xA001, init_value = 0x0000, exit_value = 0x0000;
unsigned short res;
char i;

res=value;

res^=init_value;

for(i=0;i<8;i++){
if(res & 1){
res>>= 1;
res^=poly;
}else{
res>>= 1;
}
}

res^=exit_value;
res^= 0xFFFF;
return res;
}

//anexa el dato al crc armando la trama para enviar
unsigned int armarTrama(char dato, unsigned short crc)
{
unsigned int res = crc;
res <<= 8;
//cout << res << endl;
res += dato;
return res;
}

//retorna el CRC que sale de la trama recibida y por referencia, dato devuelve el caracter recibido en la trama
unsigned short desarmarTrama(char& dato, unsigned int trama)
{
unsigned int crc = trama;
crc >>= 8;
unsigned short res = crc;
crc <<= 8;
dato = trama-crc;

return (unsigned short) res;
}

string sacarle_crc_a_trama(string trama)
{string nuevo;
for(int i=0;i if(isdigit(trama[i])!=false)
{

nuevo+=trama[i];

}
}


return nuevo;
}


string colocar_crc_a_trama(string aux1)
{

int sumatoria=0;
for(int i=0;i {



char datos = aux1[i];
unsigned int i;
unsigned short inival;
//genera el crc del caracter
inival = CRC16(datos);

// cout << "El CRC del caracter: " << datos << " es: " << inival << endl;

//genera la trama en un entero sin signo
unsigned int trama = armarTrama(datos, inival);
//cout << "trama = " << trama << endl;

//data almacena el dato que se saca de la trama
char data;


/*dañamos trama -- descomentariar para reconocer trama dañada
trama += 1;
cout << "trama modificada = " << trama << endl;
*/
unsigned short crc = desarmarTrama(data, trama);
//crc almacena el crc para comparar la trama

// cout << "dato en trama: " << data << ", CRC en trama:" << crc << endl;

//para sabes si la trama llego bien se compara crc con el CRC16 del
//dato recibido, si son iguales, la trama esta bien, de lo contrario,
//hay que pedir la trama de nuevo
sumatoria+=CRC16(data);
cout<<" sumatoria : "<< sumatoria< }
char poli[65536];
aux1+=itoa(sumatoria,poli,10);
return aux1;

}

0 comentarios:

Publicar un comentario

Tu comentario será moderado la primera vez que lo hagas al igual que si incluyes enlaces. A partir de ahi no ser necesario si usas los mismos datos y mantienes la cordura. No se publicarán insultos, difamaciones o faltas de respeto hacia los lectores y comentaristas de este blog.