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

Composants VCL Delphi Discussion :

Créer une fonction avec TcomPort


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Créer une fonction avec TcomPort
    Bonjour à tous,

    Pour les besoins d'une application, je souhaite créer une fonction qui me permettra de communiquer avec un Modem via les commandes Hayes (AT) et, qui aura pour seul paramètre d'entrée une commande modem AT et qui renverra la réponse de celui-ci.

    Exemple

    Function ATCommand(AT : string):string;


    J'utilise le composant TComPort (ver 2.63) mais je bute sur les WaitForEvent. L'événement OnRxChar fonctionne correctement mais ne correspond pas aux besoins de cette fonction (enfin, je pense).

    Pouvez-vous m'apporter votre aide ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 745
    Points : 25 671
    Points
    25 671
    Par défaut
    Si tu envoies une trame, et que tu attends la réponse, le OnRxChar peut être utilisé, dans ta fonction, tu fais un Sleep(1) dans une boucle, une fois que OnRxChar est terminé, tu arrête la boucle (via un boolean ?)

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Une Solution au problème
    Merci pour votre réponse.

    J'ai trouvé une solution à mon problème. Vous la trouverez ci-dessous pour ceux qui auront un problème similaire.

    ********************************************************

    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
    Function TForm1.ATCommand(AT_Hayes : string):string;
    Var Reponse : String;
    Begin
          //********** Envoi Commandes AT et réception  ***********
          ComPort1.Events := [];            // do not create monitoring thread
          ComPort1.Connected := True;       // Ouvre le port COM
          Events := [evRxChar];          // Définition de l'événement à surveiller
          ComPort1.ClearBuffer(True,True); // Vide les buffers
     
          If length(AT_Hayes)=0 then AT_Hayes:='AT';
          ComPort1.WriteStr(AT_Hayes);     // Envoi de la commande AT
           // On attend l'événement OnRxChar
     
           try
              ComPort1.WaitForEvent(Events, 0, WaitInfinite); 
              if evRxChar in Events then
                  // Resultat dans la variable Reponse
                 ComPort1.ReadStr(Reponse,ComPort1.InputCount);  // RECEPTION
                 finally
             ComPort1.Connected := False;                   // Ferme le port COM
           end;
     
          //***** TRAITEMENT DE LA REPONSE MODEM **********
     
         ATCommand := Trim(Reponse);
     
    End;

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Commandes Hayes
    Bonjour,
    A la lecture de ton code je suis un peu surpris. Il a été testé et fonctionne ?
    Notamment parce que la réponses du modem aux commandes HAYES est de longueur variable suivant la commande, c'est souvent "OK" mais c'est aussi des chaînes de caractères beaucoup plus longues.
    "evRxChar" se produisant à la réception du premier caractère la réception de l'intégralité de la commande parait douteuse à minima aléatoire. Mais bon il y a longtemps que j'ai abandonné la transmission par port série ...

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut La suite
    Citation Envoyé par gaby277 Voir le message
    Bonjour,
    A la lecture de ton code je suis un peu surpris. Il a été testé et fonctionne ?
    Notamment parce que la réponses du modem aux commandes HAYES est de longueur variable suivant la commande, c'est souvent "OK" mais c'est aussi des chaînes de caractères beaucoup plus longues.
    "evRxChar" se produisant à la réception du premier caractère la réception de l'intégralité de la commande parait douteuse à minima aléatoire. Mais bon il y a longtemps que j'ai abandonné la transmission par port série ...
    Ce n'est que la partie qui "capte" la réponse du modem. A la suite du evRxChar il y a tout un traitement. La fonction n'est pas complète.

    Merci encore pour ta réponse

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Comment contourner les exceptions ?
    Bonjour à tous,

    Je continue mon bonhomme de chemin avec mon programme qui continue d'évoluer et ce, grâce à vos conseils.

    Je me suis rendu compte que je ne pouvais ouvrir le port COM lorsque celui-ci est utilisé par un autre programme (Normal...) mais, malgré les Try et consort, je ne parviens pas a esquiver les erreurs d'exception.


    ....
    Try
    if not ComPort.Connected then ComPort.open ;
    Except
    ComPort.Free;
    ATCommand := 'ERROR';
    exit;
    end;
    ....


    Rien y fait ! Toujours l'erreur d'exception (raised exception class EComPort ~ Unable to open com port ~win error 170) dans CPort.pas (procedure TCustomComPort.CreateHandle

    A l'aide mes sauveurs

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 294
    Points : 1 949
    Points
    1 949
    Par défaut
    Lorsque tu l'utilises en dehors de l'IDE tu as cette exception? Normalement, vu ton code, tu ne devrais l'avoir que lors de l'exécution à partir de l'IDE.

Discussions similaires

  1. Créer une fonction avec nom de DB en argument ?
    Par ctobini dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/12/2007, 00h29
  2. Créer une fonction avec une variable
    Par Ricou13 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/01/2007, 00h51
  3. créer une fonction avec "si" imbriqués
    Par JUMJJUMJ dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 23h03
  4. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 21h51
  5. Réponses: 6
    Dernier message: 10/08/2005, 12h36

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