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

Delphi Discussion :

Com perdue lors de l'utilisation de 2 ports série


Sujet :

Delphi

  1. #1
    Membre actif Avatar de marsupilami34
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    574
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 574
    Points : 258
    Points
    258
    Par défaut Com perdue lors de l'utilisation de 2 ports série
    Bonjour à tous,

    J’ai réalisé un programme qui récupère les données provenant de 2 caméras reliées au PC par du RS232.
    Ces données sont traitées puis enregistrées en base de données
    Ca fonctionne bien pendant un certain temps puis au bout d’un moment, le logiciel ne fait plus rien (il se bloque) et je n’ai pas de message d’erreur.

    J’utilise 2 TComPort avec Delphi 2007

    J’ai rajouté un fichier log qui m’ permis d’analyser un peu le problème.
    A un moment, le PC reçoit des données de la caméra 2 et commence à les traiter. Mais il reçoit aussi des données de la caméra 1 et n’attends pas d’avoir fini le traitement de la caméra 2.

    Je vous joins un bout de code, ca pourra peut-être vous aider.


    Code initialisation Camera 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.InitCamera1;
    begin
      FPort1:= TComPort.Create(nil);
      FPort1.Port:='COM' + IntToStr(FComCamera1);   // CAM 1
      FPort1.BaudRate:=br9600;
      FPort1.DataBits:= dbEight;
      FPort1.Parity.Bits:= prNone;
      FPort1.StopBits:= sbOneStopBit;
      FPort1.Open;
      FPort1.OnRxChar:=DoDataReceivedCAM1;
    end;
    Code initialisation Camera 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.InitCamera2;
    begin
      FPort2:= TComPort.Create(nil);
      FPort2.Port:='COM' + IntToStr(FComCamera2);  // CAM 2
      FPort2.BaudRate:=br9600;
      FPort2.DataBits:= dbEight;
      FPort2.Parity.Bits:= prNone;
      FPort2.StopBits:= sbOneStopBit;
      FPort2.Open;
      FPort2.OnRxChar:=DoDataReceivedCAM2;
    end;
    Et voici mon évènement associé à la camera 1 (l'évènement caméra 2 est sensiblement identique)
    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
     
    procedure TForm1.DoDataReceivedCAM1(Sender: TObject; Count: Integer);
    var
      S:string;
      T:string;
    begin
      FPort1.ReadStr(T,Count);
      FBuffer1:= FBuffer1 + T;
      if pos(#13,FBuffer1) <> 0 then
      begin
     
        WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Buffer1: ' + FBuffer1 );
        S:= Copy(FBuffer1,1,pos(#13,FBuffer1)-1);
        WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Trame1: ' + S );
     
        FBuffer1:= Copy(FBuffer1,pos(#13,FBuffer1)+1,Length(FBuffer1)-pos(#13,FBuffer1));
     
        WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Buffer1 après découpage: ' + FBuffer1 );
     
     
        SaveValuesInDB1(S);
     
        WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Sauvegarde 1 BD OK' );
     
     
      end;
    end;
    Y aurait-il quelque chose que j'ai oublié ?
    Merci d'avance pour votre aide

    cdlt,
    Marsup

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Avoir des traitements simultanés des deux caméras en même temps est tout à fait normal
    Tu serais en IP avec 16 caméras, tu verrais que rien arrive dans l'ordre, tout se fait en même temps, faut jongler


    Vérifie le CurrentThreadID, voir si les OnRxChar sont lancés dans un thread secondaire, je suis particulièrement rouillé en TComPort.
    Si c'est identique à MainThreadID, il y a un problème de ré-entrance, je pense à un Application.ProcessMessages dans SaveValuesInDB1 par exemple

    SaveValuesInDB1 et SaveValuesInDB2, utilise chacune une connexion dédiée ou un seule connexion partagée ?
    Si il y a une ré-entrance et que tu ne peux pas le changer, il faudrait une connexion dédiée pour chaque fonction
    Avec une connexion partagée tu risque de commencer une série d'instruction DB qui vont être dégradé par une seconde série d'instruction DB .
    En général, une seule série est correcte, la seconde, celle qui est venue via la ré-entrance et la première est incomplète.


    Si c'est différent à MainThreadID
    La connexion dédiée est impérative à chaque thread, tu risques des collisions mémoire, là c'est les deux séries d'instruction DB qui sont potentiellement fausses.
    Tu peux utiliser une connexion partagée mais il faut alors la protéger par une Section critique, pour la base de données, c'est franchement lourd surtout que le SGBD supporte très bien le concurrentiel.


    Pour résumer, traque les variables globales, souvent c'est les coupables dans ce genre de situation.





    Enfin, une Transaction permettrait de s'assurer qu'une série d'instruction DB soit toujours complète via un Commit, jamais à moitié lancé, et évidemment il faut logguer en cas de RollBack
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je te suggére 2 solution, pour chaque connection:
    1-utiliser une dll (même dll avec un port)
    2-lance un exe pour chaque port (même exe avec un port)
    c'est plus rapide et tu peut bien métriser,


    exmple (les serveur web, firebird,...)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

Discussions similaires

  1. COM TCP avec 2 équipements utilisant le même port
    Par Tleconte dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 20/12/2018, 17h40
  2. Réponses: 3
    Dernier message: 08/02/2010, 10h02
  3. Utiliser le même port série par deux applications
    Par homeostasie dans le forum Windows
    Réponses: 1
    Dernier message: 25/01/2007, 21h42
  4. Erreur lors de l'utilisation de strlwr ?!
    Par MonsieurAk dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2005, 10h22
  5. [C#] [Port Com] PB de permission pour utiliser la classe
    Par dacid dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/04/2005, 11h46

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