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 :

TComPort, problème avec RxOnChar


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut TComPort, problème avec RxOnChar
    bonjour,
    J'ai un problème avec RxOnChar et je n'arrive pas à trouver d'où ça vient... je m'explique:
    J'ai fait un petit projet pour récupérer des données à partir d'une machine avec un port série, j'ai utilisé TComPort, je récupère les données puis le programme les traite et les affiche. OnRxChar marche correctement, et je reçois bien ce qu'il faut.

    Maintenant je souhaite intégrer ce projet dans mon logiciel.
    J'ai donc crée la Form de ce petit projet, par l'intermédiaire d'un bouton dans mon logiciel. Dans la FormCreate du petit projet j'ai juste inséré la configuration des paramètres du Port série.
    Quand j'exécute et que j'appuie sur le bouton, il m'envoie sur la bonne page, mais il ne fais rien lorsque je lui envoie les données par la machine.
    Pourquoi est-ce que RxOnChar ne se déclenche plus?

    Si vous avez une idée merci d'avance

    ps: si ça peut aider je copierai le code..

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Tu as bien ouvert le port ?
    La onfiguration a-t-elle été correctement validée ?
    Le câble est-il toujours branché ?
    [...]

    Si tu trouves pas, un petit bout de code serait en effet le bien venu
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    et bien non comme je le dis, le code est quasiement le même que celui du projet qui marche (en gros j'ai copié les fichiers sources et g fait ajouter au projet :p)

    je v donner le code comme ca..
    (o passage il y a des parties qui sont "mal" codées comme or =1 or =2 etc il doit y avoir une méthode pr les intervalles..
    et la partie de configuration des paramètres du port série à partir de la base de données c pas terrible non + :p fo que je regarde comment faire pr faire un fichier .cfg...
    Je n'ai pas eu le temps de me pencher la dessus, mais je suis ouvert à toutes critiques et tout conseil )

    Code projet qui marche

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
     
    unit UnitTest;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, CPort, StrUtils;
     
    type
      TForm1 = class(TForm)
        ComPort1: TComPort;
        procedure ComPort1RxChar(Sender: TObject; Count: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      nb : integer;
      tab : array[1..10] of String;
      ptr: integer;
     
    implementation
     
    {$R *.dfm}
     
     
    function IsDigit(chaine:string):boolean;
    begin
      if (chaine[ptr] = '0') or (chaine[ptr] = '1') or (chaine[ptr] = '2') or (chaine[ptr] = '3') or (chaine[ptr] = '4') or (chaine[ptr] = '5') or (chaine[ptr] = '6') or (chaine[ptr] = '7') or (chaine[ptr] = '8') or (chaine[ptr] ='9') then
        result := true
      else
        result := false;
    end;
     
    function IsSign(chaine:string):boolean;
    begin
      if (chaine[ptr] = '.') then//or (chaine[ptr] = '-') or (chaine[ptr] = '+') then
        result := true
      else
        result := false;
    end;
     
    // Elimine les caractères "parasites" venant de l'appareil
    procedure TraitementChaines();
    var
    chaine1: string;
    i,debut,fin: integer;
    begin
      for i:=1 to 10 do  // Pour chaque chaîne
      begin
        ptr:=1;
        chaine1:=tab[i];
        while (IsDigit(chaine1)=false) and (IsSign(chaine1)=false) do
          ptr:=ptr+1;
        debut:=ptr;
        ptr:=ptr+1;
        while (IsDigit(chaine1)=true) or (IsSign(chaine1)=true) do
          ptr:=ptr+1;
        fin:=ptr-1;
        chaine1:= ANSIMidStr(chaine1,debut,fin);
        tab[i]:= ANSILeftStr(chaine1,fin-debut+1);
      end;
    end;
     
    // Evenement en cas d'envoi de données par l'appareil
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
    chaine:string;
    i: integer;
    begin
    ComPort1.ReadStr(chaine,Count);
    ComPort1.ClearBuffer(true,true);
     
        if chaine <> #32#13 then
        begin
          ShowMessage('mesure n°'+IntToStr(nb)+' effectuée');
         // ShowMessage(chaine);
          tab[nb]:=chaine;
          nb:=nb+1;
        end;
     
        if nb = 11 then
        begin
          TraitementChaines();
          for i:=1 to 11 do
            showmessage('mesure n°'+inttostr(i)+ ' = '+tab[i]);
        end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ComPort1.open;
    nb:=1;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    ComPort1.Close;
    end;
     
    end.
    code du bouton qui appelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TFormPlateau.BTAcquisitionClick(Sender: TObject);
    begin
      FormTest := TFormTest.Create(FormPrincipale);
    end;
    Code du logiciel je recopie pas tout ça sert a rien)

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    unit UnitTest;
     
    //déclarations
     
    type
      TFormTest = class(TForm)
        ComPort1: TComPort;
        Label1: TLabel;
        procedure ComPort1RxChar(Sender: TObject; Count: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
     
     
    function IsDigit(chaine:string):boolean;
    //pareil
    function IsSign(chaine:string):boolean;
    //pareil
    procedure TraitementChaines();
    //pareil
    procedure TFormTest.ComPort1RxChar(Sender: TObject; Count: Integer);
    //pareil
     
    procedure TFormTest.FormCreate(Sender: TObject);
    begin
      with DMDonnees do
      begin
        // On met le port sur le COM choisi
        ComPort1.Port := DataSelect.DataSet.FieldByName('COM').AsString;
        // On affecte les bits de données
        if DataSelect.DataSet.FieldByName('DataBits').AsInteger = 8 then
          ComPort1.DataBits := dbEight
        else if DataSelect.DataSet.FieldByName('DataBits').AsInteger = 7 then
          ComPort1.DataBits := dbSeven
        else if DataSelect.DataSet.FieldByName('DataBits').AsInteger = 6 then
          ComPort1.DataBits := dbSix
        else
          ComPort1.DataBits := dbFive;
        // On configure la vitesse de transmission
        ComPort1.BaudRate := TBaudRate(DataSelect.DataSet.FieldByName('BaudRate').AsInteger);
        // On configure le nombre de bits de stop
        ComPort1.StopBits := TStopBits(DataSelect.DataSet.FieldByName('StopBits').AsInteger);
      end;
     
      ComPort1.open;
      nb:=1;
     
    end;
     
    procedure TFormTest.FormClose(Sender: TObject; var Action: TCloseAction);
    //pareil
    Voila ça fait bcp de code à lire mais le contenu est pas le plus important je pense que c un problème avec les forms plutôt...

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    bon et bien j'ai trouvé d'où ça venait... c bien du code en fait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // On configure la vitesse de transmission 
        ComPort1.BaudRate := TBaudRate(DataSelect.DataSet.FieldByName('BaudRate').AsInteger); 
        // On configure le nombre de bits de stop 
        ComPort1.StopBits := TStopBits(DataSelect.DataSet.FieldByName('StopBits').AsInteger);
    Sans ces deux lignes la ça marche correctement.

    g remplacé la ligne des StopBits par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if DataSelect.DataSet.FieldByName('StopBits').AsFloat = 1 then
          ComPort1.StopBits := sbOneStopBit
        else if DataSelect.DataSet.FieldByName('StopBits').AsFloat = 1.5 then
          ComPort1.StopBits := sbOne5StopBits
        else
          ComPort1.StopBits := sbTwoStopBits;
    et ça marche, il me reste plus que le BaudRate...

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    A propos de Rx :

    http://www.developpez.net/forums/vie...=707586#707586


    (Lien tout en bas à gauche de cette fenêtre)
    De retour parmis vous après 10 ans!!

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    merci pour le lien mais ça ne me concerne pas trop, ce que je dois faire ne demande pas autant de précisions matérielles
    Je suis en train de remplacer l'accès à la base de données par un fichier, la je lis un fichier avec une syntaxe particuliere et ça me récupère les bonne valeurs

    il me reste à modifier la saisie des paramètres, donc à la place d'écrire dans la base de données je dois écrire correctement dans le fichier.. je devrais pouvoir y arriver seul ^^
    merci à tous

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

Discussions similaires

  1. problème avec tcomport
    Par habar84 dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/02/2008, 09h25
  2. problème avec TComport
    Par lili81 dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/11/2007, 07h58
  3. Problème avec TComPort
    Par Kristo2 dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/09/2007, 16h07
  4. Problème avec TComPort
    Par bridy224 dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/05/2007, 19h17
  5. Problème avec TComPort
    Par mesmin.sefelec dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/01/2006, 15h35

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