IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI Delphi Discussion :

[Kylix] Aidez-moi -> LIAISON SERIE 2 le retour


Sujet :

EDI Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut Aidez-moi -> LIAISON SERIE 2 le retour
    Mon projet consites a recevori les informations reenvoyées par une station météo en liaison série RS232.

    Voci mon code pour lire la liaison série. J'arrive a déterminer le type de trame mais je reçois que de la merde et je ne comprends pas.

    //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;
    }
    Petite note :
    Check sum = the lower byte of the sum of the data send (include header)
    Le checksum c'est pour vérifier sion a bien la trame complète et si elle est correcte.

    J'aimerai que quelqu'un me dise ou est mon erreur. Et en plus j'ai toujours le checksum en erreur.
    si vous voulez je vous passe mon protcole.

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut re
    Laissez moi vos noms et je vous envoi le protocle pasque il prend pas mal de place.
    Merci d'avance si vous pouvez m'aider

Discussions similaires

  1. aidez moi à choisir
    Par lvdnono dans le forum DirectX
    Réponses: 4
    Dernier message: 13/05/2004, 08h20
  2. Réponses: 29
    Dernier message: 11/05/2004, 13h18
  3. Réponses: 2
    Dernier message: 26/03/2004, 09h15
  4. [Kylix] aider moi sur kylix
    Par nabs dans le forum EDI
    Réponses: 1
    Dernier message: 19/03/2004, 14h19
  5. [TP]Liaison série avec TP7 dans fenêtre DOS W2000
    Par Alain81 dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 14/06/2003, 00h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo