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

C++Builder Discussion :

TComport - Envoyer information et attendre reponse


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut TComport - Envoyer information et attendre reponse
    bonjour,

    j'utilise le composant TComport 2.64 :

    je souhaiterai envoyer 12 bits en une fois par le port com.
    ou 2 caracteres ascii representant cette serie de 12 bits.
    mais je dois attendre le retour d'une réponse de la machine avec laquelle je communique pour pouvoir envoyer les 12 bits suivant.
    et puis comment recuperer les informations qui me sont retournés par l'autre machine.

    quel serait la meilleur facon de proceder.
    j'avais penser des events ... mais ensuite j'ai decouvert WriteAsync.

    merci d'avance.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Salut,
    Voici comment j'utilise TComPort en Half duplex

    Cette fonction est appelée sous interrupt par TComport
    et elle reçoit dans ce cas un string délimité par un caratère SOT en début et EOT en fin à définir dans TComDataPacket Ca dépend du matériel avec lequel on dialogue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool          ComDataRxEnd, ComDataBusy; //initialisés à False
    AnsiString	ComDataRxBuf;
     
    void __fastcall TMainWin::ComDataPacketPacket(TObject *Sender, const AnsiString Str)
    {
    ComDataRxBuf = Str;
    ComDataRxEnd = True;
    return;
    }
    Cette autre fonction s'occupe de la transmission, de l'attente de la réponse et traite ce qui a été reçu ou renvoit un code d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    bool TMainWin::ComDataPacketSend(const AnsiString Str)
    {
    if(ComDataBusy==True) {
    	Application->MessageBox("Ligne de communication occupée",PROGRAM_NAME);
        return False;
        }
    ComDataBusy = True;							/* TRANSMISSION         */
    ComDataRxEnd = False;
    ComDataRxBuf = "";
    ComPort->ClearBuffer(True,True);
    ComPort->WriteStr(Str);
                                                /* WAITING             */
    for(len3000; len>0 && ComDataRxEnd==False; len--) {
         Application->ProcessMessages();
         Sleep(1);
         }
                                                /* RECEIVE ANALYSING    */
    if(len<=0) {
    	ComDataBusy = False;
        Application->MessageBox("Temps d'attente de réception dépassé",PROGRAM_NAME);
        return False;
        }
    // ICI Traitement du buffer réception
    ComDataBusy = False;
    return True;
    }
    J'espère que ca pourra t'aider
    Cordialement

    Dominique

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    merci de ta reponse Dominique, ca m'aide a mieux comprendre maintenant. la solution que tu m'a fournit est tres bien . mais j'ai remarqué que tu as utilisé une boucle et un sleep pour attendre la réponse. Je voudrai savoir pourquoi tu n'a pas utilisé la fonction WaitForEvent de TComport.
    Apparement cette fonction avec la fonction TimeOut et la classe TComTimeOut. permet une gestion facile de ce genre de communication. Si tu as une solution qui utilise TComTimeOut et WaitForEvent ce serai cool.

    Merci encore de ton aide

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    C'est bien vrai que dans 2 têtes il y a plus que dans 1 ...
    Ca me parait être une solution plus "propre", je suis loin de tout connaître dans TComPort, je l'utilise seulement depuis qques semaines.
    Je vais essayer quand j'aurai quelque temps.
    J'espère que cette solution ne bloque pas la gestion des autres événements car dans la mienne, ce n'est pas le cas.
    Merci aussi de cette remarque
    Dominique

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    Si quelqu'un sait comment utiliser les evenementiels avec TComPort
    son aide serai la bienvenue.
    merci.

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Voilà comment on peut se servir de WaitForEvent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void __fastcall TForm1::Button9Click(TObject *Sender)
    {
     unsigned char donnee_envoyee[4] = {0x00, 0x01, 0x00, 0xFF};
     
     ComPort1->Events = TComEvents(); /* clear tous les évenements */
     ComPort1->Connected = true;
     
     TComEvents Ev;
     Ev << evRxChar;
     ComPort1->WaitForEvent (Ev, 0, WaitInfinite);
     /* attendre l'evenement OnRxChar pour faire la suite */
     
     ComPort1->Write (donnee_envoyee, 4);
     ComPort1->ClearBuffer (false, true);
     ComPort1->Connected = false;
    }
    Le principe : Le tableau donnee_envoyee contient des valeurs. Mais d'abord, avant d'ouvrir le port il faut que la propriété Events soit vide. Ensuite on ouvre le port puis on attend de recevoir un événement OnRxChar pour envoyer "donnee_envoyee".

    Mais pendant l'attente de l'événement, ton application est gelée. Et le WaitInfinite fait que celle ci reste gelée. Sinon remplace WaitInfinite par une valeur en ms et l'application te rendra la main si cette valeur est dépassée. La seule inconnu dont je ne suis pas sur c'est le '0' dans WaitForEvent. D'après la doc :
    StopEvent parameter is Win API event that cancels wait operation if application turns it on.
    Je ne suis pas sûr de mon '0' !?

    Bien sur ceci est un exemple, il faut le modifier car attendre un événement OnRxChar n'est peut être pas la bonne solution. Il faudrait jouer sur les événements evCTS et evRTS côté emetteur et récepteur, enfin c'est toi qui voit !?

    Voilà
    A bientôt
    Vincent
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    super merci.

    Encore une chose,
    exemple je met 3000 ms a la place de waitInfinite.
    Nous sommes bien d'accord. que 2 choses peuvent arriver lors de l'envoi de donnée :
    1. je recois une réponse de retour=> event evRxChar
    OU
    2. le time out est ecoulé.

    comment pourrai-je savoir si l'une ou l'autre est arrivé.
    une fonction spécial est-elle appelé ?
    est-il possible de faire appel à une fonction automatiquement ?
    si oui comment ?

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    En faisant un simple test. Bon on reprend l'exemple, simplifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     ComPort1->Events = TComEvents(); /* clear tous les évenements */
     ComPort1->Connected = true;
     
     /* envoyer la commande */
     
     TComEvents Ev;
     Ev << evRxChar;
     ComPort1->WaitForEvent (Ev, 0, 3000);
     /* attendre l'evenement OnRxChar ou 3 secondes pour faire la suite */
     
      if(Ev.Contains(evRxChar))
       {
        Form1->Caption = "OnRxChar";
        ComPort1->Read (donnee, 2);
       }
      else
       Form1->Caption = "temps écoulée";
     
     ComPort1->Connected = false;
    Donc dans ton cas, tu envois une commande 12 bits ensuite le programme attends, si les 3 secondes sont dépassées le correspondant est abscent, sinon on reçoit un évenement OnRxChar qui veut dire qu'un octet ou plus est arrivé donc une donnée. On peut lire : (je prends l'exemple ou tu reçois une réponses de 12 bits également)
    "ComPort1->Read (donnee, 2);" Lit 2 octets du buffer et les places dans donnee, "donnee" étant un tableau de caractère de 2 éléments. On peut maintenant traiter la donnée.

    En placant une boucle au bon endroit ça devrait aller pour gerer tout ton dialogue. Voilà si tu as d'autre(s) question(s).

    Vincent
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    je vais tester tous ca.
    UN TRES GRAND MERCI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Attendre reponse WCF Ria Services
    Par chris81 dans le forum Silverlight
    Réponses: 7
    Dernier message: 01/09/2010, 19h08
  2. ouvrir popup attendre reponse puis fermer popup
    Par NoobX dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/09/2006, 18h04
  3. Réponses: 2
    Dernier message: 21/06/2006, 14h14
  4. Envoyer des informations à un service Web en javascript
    Par gingman dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/03/2006, 10h46
  5. Réponses: 3
    Dernier message: 28/10/2005, 10h01

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