//on boucle indéfiniment
cout<<"Debut de la lecture"<<endl;
for(;
{
//on lit le port pour obtenir le 1er FF
NbCarLu=0;
NbOctets = read(hCom,&c,1);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
if(c==0xff)
{
TrameRecu[0]=c;
//on lit le port pour obtenir le 2ème FF
NbOctets = read(hCom,&c,1);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
if(c==0xff)
{ TrameRecu[1]=c;break;}
}
}
cout<<"Réception du début de la trame"<<endl;
//on lit le port pour obtenir le 3ème bytes
NbOctets = read(hCom,&c,1);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
TrameRecu[2]=c;
for(int oyo=0;oyo<3;oyo++)printf("%02X", TrameRecu[oyo]);
cout<<endl;
///////////////////////////////////////////////////////////////////////////
// ANALYSE DE LA TRAME //
/////////////////////////////////////////////////////////////////////////
switch(TrameRecu[2])
{
case 0x00:
cout<<"Trame Wind"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp, 8 );
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=11);
for(int k=3;k<11;k++)TrameRecu[k]=TrameTemp[k];
////////////////////////////////Verifie l'etat de la batterie////////////////////////////////////
Etat_Battery = (TrameRecu[3] & 0x40);
if(Etat_Battery)cout<<"Faible\n\n"<<endl;
////////////////////////////////Analyse des données//////////////////////////////////////////////
Wind_Direction = Wind_Direction + ((TrameRecu[4] & 0x0f)*1);
Wind_Direction = Wind_Direction + (((TrameRecu[4] & 0xf0)>>4)*10);
Wind_Direction = Wind_Direction + ((TrameRecu[5] & 0x0f)*100);
//verifie la validité de la valeur instantané du vent + affichage
if((TrameRecu[3] & 0x10) == 0x10);
else
{
//Gust_Wind_Speed = Gust_Wind_Speed + (TrameRecu[5] & 0x0f)*0,1;
Gust_Wind_Speed = Gust_Wind_Speed + (((TrameRecu[5] & 0xf0)>>4)*1);
Gust_Wind_Speed = Gust_Wind_Speed + (TrameRecu[6] & 0x0f)*10;
}
////////////////////////////////Affichage des données////////////////////////////////////////////
cout<<"Direction du vent: "<<Wind_Direction<<" degres"<<endl;
cout<<"Vitesse du vent: "<<Gust_Wind_Speed<<" m/sec"<<endl;
break;
case 0x01:
////////////////////////////// Verifie la longeur de trame//////////////////////////////////////
cout<<"Trame \"Rain\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,13);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=16);
if(NbCarLu!=16)
{
cout<<"Trame \"Rain\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"Rain\" confirmé"<<endl;
}
for(int k=3;k<11;k++)TrameRecu[k]=TrameTemp[k];
/////////////////////////////Verifie l'etat de la batterie/////////////////////////////////////
Etat_Battery = (TrameRecu[3] & 0x40);
if(Etat_Battery)cout<<"Faible\n\n"<<endl;
/////////////////////////////////Analyse des données//////////////////////////////////////////
if((TrameRecu[3] & 0x10) == 0x10);
else
{
Vit_Precip = Vit_Precip + ((TrameRecu[4] & 0x0f)*1);
Wind_Direction = Vit_Precip + (((TrameRecu[4] & 0x0f)>>4)*10);
Vit_Precip = Vit_Precip + ((TrameRecu[5] & 0x0f)*100);
}
//verifie la validité du pluviometre + affichage
if((TrameRecu[3] & 0x20) == 0x20);
else
{
//Pluvio = Pluvio + (((TrameRecu[5] & 0x0f)>>4)*0.1);
Pluvio = Pluvio + (TrameRecu[6] & 0x0f)*1;
Pluvio = Pluvio + (((TrameRecu[6] & 0x0f)>>4)*10);
Pluvio = Pluvio + (TrameRecu[7] & 0x0f)*100;
Pluvio = Pluvio + (((TrameRecu[7] & 0x0f)>>4)*1000);
}
////////////////////////////////Affichage des données//////////////////////////////////////////
break;
case 0x02:
// Verifie la longeur de trame
cout<<"Trame \"ThermoHygro\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,6);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=9);
if(NbCarLu!=9)
{
cout<<"Trame \"ThermoHygro\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"ThermoHygro\" confirmé"<<endl;
}
if((TrameRecu[5] & 0x40) == 0x40);
else
{
//Temp = Temp + (TrameRecu[4] & 0x0f)*0.1;
Temp = Temp + (((TrameRecu[4] & 0x0f)>>4)*1);
Temp = Temp + (TrameRecu[5] & 0x0f)*10;
Temp = Temp + (((TrameRecu[5] & 0x03)>>4)*100);
//Verifie le signe
if((TrameRecu[5] & 0x80) == 0x80)Temp = Temp * (-1);
}
//Calcul Hum
Hum = Hum + ((TrameRecu[6] & 0x0f)*1);
Hum = Hum + (((TrameRecu[6] & 0x0f)>>4)*10);
break;
case 0x03:
// Verifie la longeur de trame
cout<<"Trame \"Mushroom\" detecte\n\n"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,6);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=9);
if(NbCarLu!=9)
{
cout<<"Trame \"Mushroom\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"Mushroom\" confirmé"<<endl;
}
//verifie la validité de temp + affichage
if((TrameRecu[5] & 0x40) == 0x40);
else
{
//Temp = Temp + (TrameRecu[4] & 0x0f)*0.1;
Temp = Temp + (((TrameRecu[4] & 0x0f)>>4)*1);
Temp = Temp + (TrameRecu[5] & 0x0f)*10;
Temp = Temp + (((TrameRecu[5] & 0x03)>>4)*100);
//Verifie le signe
if((TrameRecu[5] & 0x80) == 0x80)Temp = Temp * (-1);
}
//Calcul Hum
Hum = Hum + ((TrameRecu[6] & 0x0f)*1);
Hum = Hum + (((TrameRecu[6] & 0x0f)>>4)*10);
break;
case 0x04:
// Verifie la longeur de trame
cout<<"Trame \"ThermoOnly\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,4);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=7);
if(NbCarLu!=7)
{
cout<<"Trame \"ThermoOnly\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"ThermoOnly\" confirmé"<<endl;
}
//verifie la validité de temp + affichage
if((TrameRecu[5] & 0x40) == 0x40);
else
{
//Temp = Temp + (TrameRecu[4] & 0x0f)*0.1;
Temp = Temp + (((TrameRecu[4] & 0x0f)>>4)*1);
Temp = Temp + (TrameRecu[5] & 0x0f)*10;
Temp = Temp + (((TrameRecu[5] & 0x03)>>4)*100);
//Verifie le signe
if((TrameRecu[5] & 0x80) == 0x80)Temp = Temp * (-1);
}
break;
case 0x05:
// Verifie la longeur de trame
cout<<"Trame \"ThermoHygroBaro\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,10);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=13);
if(NbCarLu!=13)
{
cout<<"Trame \"ThermoHygroBaro\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"ThermoHygroBaro\" confirmé"<<endl;
}
if((TrameRecu[5] & 0x40) == 0x40);
else
{
//Temp = Temp + (TrameRecu[4] & 0x0f)*0.1;
Temp = Temp + (((TrameRecu[4] & 0x0f)>>4)*1);
Temp = Temp + (TrameRecu[5] & 0x0f)*10;
Temp = Temp + (((TrameRecu[5] & 0x03)>>4)*100);
//Verifie le signe
if((TrameRecu[5] & 0x80) == 0x80)Temp = Temp * (-1);
}
//Calcul Hum
Hum = Hum + ((TrameRecu[6] & 0x0f)*1);
Hum = Hum + (((TrameRecu[6] & 0x0f)>>4)*10);
break;
case 0x06:
// Verifie la longeur de trame
cout<<"Trame \"Minute\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,2);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=5);
if(NbCarLu!=5)
{
cout<<"Trame \"Minute\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"Minute\" confirmé"<<endl;
}
if((TrameRecu[5] & 0x40) == 0x40);
else
{
//Temp = Temp + (TrameRecu[4] & 0x0f)*0.1;
Temp = Temp + (((TrameRecu[4] & 0x0f)>>4)*1);
Temp = Temp + (TrameRecu[5] & 0x0f)*10;
Temp = Temp + (((TrameRecu[5] & 0x03)>>4)*100);
//Verifie le signe
if((TrameRecu[5] & 0x80) == 0x80)Temp = Temp * (-1);
}
//Calcul Hum
Hum = Hum + ((TrameRecu[6] & 0x0f)*1);
Hum = Hum + (((TrameRecu[6] & 0x0f)>>4)*10);
//Calcul de Sea Level
//Pression = Pression + (((TrameRecu[10] & 0x0f)>>4)*0.1);
Pression = Pression + (TrameRecu[11] & 0x0f)*1;
Pression = Pression + (((TrameRecu[11] & 0x0f)>>4)*10);
Pression = Pression + (TrameRecu[12] & 0x0f)*100;
Pression = Pression + (((TrameRecu[12] & 0x03)>>4)*1000);
break;
case 0x0e:
// Verifie la longeur de trame
cout<<"Trame \"Clock\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,6);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=9);
if(NbCarLu!=9)
{
cout<<"Trame \"Clock\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"Clock\" confirmé"<<endl;
}
break;
case 0x0f:
// Verifie la longeur de trame
cout<<"Trame \"ThermoHygroBaro2\" detecte"<<endl;
do
{
NbOctets = read(hCom,&TrameTemp,11);
if(NbOctets==-1)
{
throw EXErreurLect();
return 0;
}
NbCarLu=NbCarLu+NbOctets;
}while(NbCarLu!=14);
if(NbCarLu!=14)
{
cout<<"Trame \"ThermoHygroBaro2\" non conforme\n\n"<<endl;
break;
}
else
{
cout<<"Trame \"ThermoHygroBaro2\" confirmé"<<endl;
}
break;
default :
cout<<"Trame non conforme (switch)"<<endl;
break;
}
Partager