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

Langage Delphi Discussion :

Port série et Thread


Sujet :

Langage Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Port série et Thread
    Salut tout le monde ,
    je sais que le sujet a déjà été abordé , mais aprés avoir parcouru tous les topics, je n ai pas trouvé ce que je cherchais.

    J'utilise le composant Tcomport, pour piloter 6 ports séries et je voudrais faire des threads différents pour attendre des trames sur les 6 ports et traité les informations.

    Le problème c est que je n y arrive pas.
    Voila le seul code que j ai trouvé.


    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
     
    var
      ComPort: TComPort;
      Events: TComEvents;
     
    begin
      ComPort := TComPort.Create(nil);
      try
        ComPort.Events := [];  // do not create monitoring thread
        ComPort.Open;  // open port
        Events := [evCTS, evDSR, evRLSD];  // define events to wait for
        ComPort.WaitForEvents(Events, nil, WaitInfinite);  // wait until at least one event happens
        if evCTS in Events then
     
          WriteLn('CTS Changed');  // CTS signal changed state
        ComPort.Close;  // close port
      finally
        ComPort.Free;
      end;
    end;

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Tcomport si on parle bien de celui de Dejan Crnila est déjà threadé ! il te suffit donc en théorie d’instancier un Tcomport par port serie mais pb en fait ca marche pas, soit c’est du a l’api soit c’est du au systeme qui ne peut gérer plusieurs ports pour un même process…



  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 770
    Points
    2 770
    Par défaut
    6 port série sur même PC,,,,, jamais vu je pense qu'il ya au max 4+2 vértuelle
    pour ma part j'ai déja travailler avec deux en même temps
    si votre PC contient 6 surment tu peut les utiliser tous avec Tcomport[/code]
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    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
    Si c'est de l'accès direct, j'utilise ZLPortIO et dans ce cas je pourrais te conseiller (tiens moi au courant).
    Si c'est de la trame RS232, TComPort me semble plus approprié.
    L'accès est plus difficile à gérer puisqu'il sagit d'un protocol déjà synchronisé par l'UART...

    Vu ton code, il me semble qu'il sagit d'accès direct aux lignes CTS, DSR, RTS, etc...

    http://www.developpez.net/forums/viewtopic.php?t=133052
    De retour parmis vous après 10 ans!!

  5. #5
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    En fait sur les 6 ports séries, c'est uniquement des trames RS232. Le code que j ai mis c est un code que j ai trouvé pour faire une évènement. Moi je voudrais faires de vrai thread bien séparer qui attendent une trame sur le port et qui effectuent le traitement.. Et je ne sais pas comment mis prendre.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par edam
    6 port série sur même PC,,,,, jamais vu je pense qu'il ya au max 4+2 vértuelle
    Non, ça c'est une limite du DOS. Sous Win32, tu peux théoriquement aller jusqu'à 255 ports série, tout dépend du nombre de cartes série que tu rajoutes.

    Citation Envoyé par rvzip64
    J'utilise le composant Tcomport, pour piloter 6 ports séries et je voudrais faire des threads différents pour attendre des trames sur les 6 ports et traité les informations.
    Ca me semble normal, puisque tu torpilles directement le composant : c'est pas l'idéal. Virer les threads de contrôle non plus, d'ailleurs.

    Essaie plutôt d'utiliser l'évènement TComPort.OnCTSChange, qui enverra un signal ou toute méthode adaptée à ton application pour déclencher la lecture.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Donc si je comprend bien cela veut dire que le composant Tcomport est déja threader, donc quand je reçois une trame il me déclenche un évènement, et les procédures que je met dans cet évènement vont etre exécuter dans un autre thread.

    Ca me semble normal, puisque tu torpilles directement le composant : c'est pas l'idéal. Virer les threads de contrôle non plus, d'ailleurs.
    Je comprends pas ce que tu veux dire.


    Essaie plutôt d'utiliser l'évènement TComPort.OnCTSChange, qui enverra un signal ou toute méthode adaptée à ton application pour déclencher la lecture.
    Le problème c est que je ne peux pas faire cela , étant donné que les registres de controle ne sont pas cablé sur le port série.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    Salut

    Perso j'utilise les composants asyncpro TApdComport j'ai eu un probleme similaire, j'ai d'abord essayé d'utiliser les evt du composant mais cela pose des problèmes de synchronisation, perte d'evenement de reception de caractères si plusieurs reception simultanées

    (si le composant est lui même multithreadé cela ne te garantie pas le fait que ces evt se déclenchent dans des threads à part,d'après mes tests il se déclenchent dans le thread principal de l'application d'ou la perte possible d'evt)

    une solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Application
      Gére une liste de threads
        Chaque thread gère un objet apdComPort
    @+

  9. #9
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    tu n aurais pas un bout de code pourque je comprenne un petit mieux stp

  10. #10
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Personne n a jamais été confornté a ce problème ??

  11. #11
    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
    Par curiosité, j'aurais bien aimé savoir l'utilité d'utiliser 6 ports séries en simultanné. Quels sont les appareils branchés, et n'y avait-il pas de solution plus ingénieuse que d'installer 6 ports série, surtout qu'il est possible de communiquer avec plusieurs appareils via le même port... Bref, pour en revenir à ton problème, sache que tu ne dois pas oublier d'initialiser les ports, en particulier spécifier l'adresse de base, le débit, la parité, données sur 7 ou 8 bits, le nombre de bits de stop, etc... Je pense qu'il faut que tous les ports fonctionnent sur la même fréquence (9,6 ou 115kbds), peut-être que ça résoudra ton problème, sait-on jamais.

    Je crois que j'utiliserais la méthode proposée par WolffN, c'est-à-dire créer moi-même les threads et utiliser le thread principal du composant TComPort pour chaque port. Cela dit, il se peut que cela ne fonctionne pas super bien si le composant n'est pas prévu pour une utilisation simultannée... Comme c'était le cas avec ZLPortIO dans un sujet récent (http://www.developpez.net/forums/viewtopic.php?t=264660), nous avons été obligé d'adapter le composant pour pouvoir créer plusieurs "sessions" d'accès direct au port parrallèle.

    En résumé, je pense qu'il faudrait dans un 1er temps revoir l'initialisation des ports séries, en particulier définir l'adresse de base du port et les autres spécifications (débit, parité, données, stop). D'après moi, tu n'as pas à te soucier des états des lignes de synchronisation, l'uart les gère lui-même, d'ailleurs, certains protocols n'utilisent pas toutes les lignes d'Handshaking; Le protocol "xon-xoff" par exemple ne les utilise pas. Je suppose que TComPort possède déjà les évènements appropriés (interruption matérielle fournie par l'UART) permettant de savoir lorsqu'une lecture/écriture est démarrée/finalisée.

    J'espère t'avoir donné des informations constructives!
    De retour parmis vous après 10 ans!!

  12. #12
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Alors je vais t en dire un peu plus , les intialisations sont tres bien faites je te rassure pour etre plus précis je vais te dire ce qu il y a sur les 6 ports COM.

    COM 1: automate de vision
    COM 2: automate de vision
    COM 3: Automate
    COM 4: Acquisition de pression
    COM 5: Gestion de moteurs Pas à Pas
    COM 6: lecteur de code barre

    Alors si tu veux sur ma fiche j ai deja 6 Tcomports, mais le truc dont j ai peur, c est que les Tcomport ne craient pas un thread par composant, alors ma question est concrétement (avec quel bout de code), j e peux dire au 6 Tcomports de faire chacun un thread a par !

  13. #13
    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
    Très bien!

    Je suppose donc que tu as déjà testé les communications avec chaque port et vérifié que les appareils fonctionnaient correctement séparément. A présent, je te conseil d'utiliser 6 threads distincts et de créer dynamiquement l'objet TComPort pour chacun (en utilisant un nom différent). En tous les cas, c'est ce que je ferais je crois, à+
    De retour parmis vous après 10 ans!!

  14. #14
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ok merci, mais vu que je suis un débutant dans les threads pourrais tu me donner un exemple si cela ne te dérange pas.

  15. #15
    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
    De retour parmis vous après 10 ans!!

  16. #16
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Super je vous remercie tous, et je vous tiens au courant de mon avancement.

  17. #17
    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
    Sujet déjà résolu?

    Excelent!
    De retour parmis vous après 10 ans!!

  18. #18
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut Re: Port série et Thread
    Citation Envoyé par rvzip64
    Je comprends pas ce que tu veux dire.
    Je parle de ces lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        ComPort.Events := [];  // do not create monitoring thread
    ...
        Events := [evCTS, evDSR, evRLSD];  // define events to wait for
        ComPort.WaitForEvents(Events, nil, WaitInfinite);  // wait until at least one event happens
        if evCTS in Events then
    J'utilise aussi TComPort, dans une DLL câblée à l'application principale par un thread pour chaque port COM, et j'ai jamais eu de problèmes.

    Citation Envoyé par rvzip64
    Le problème c est que je ne peux pas faire cela , étant donné que les registres de controle ne sont pas cablé sur le port série.
    Hein ??? Comment ça, les registres de contrôle ne sont pas câblés ?? Ce sont des UARTs 16550, ou pas ?
    Si tes ports série ne gèrent pas les signaux modem, comment veux-tu arriver à monitorer ces évènements ?!?!
    Je te rappelle, quand même, que la ligne CTS correspond à une broche bien distincte du connecteur SubD9, et pas à une "trame" reçue sur RX ! Tu confonds avec le signal BREAK, qui est lui uniquement sur RX.
    Donc, peux-tu clarifier ce point, stp ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  19. #19
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Non Mac LAK, je sais bien ce que je raconte, et je sais bien que le CTS est une broche cablé !!!

    L'exemple que j avais mis :

    ComPort.Events := []; // do not create monitoring thread
    ...
    Events := [evCTS, evDSR, evRLSD]; // define events to wait for
    ComPort.WaitForEvents(Events, nil, WaitInfinite); // wait until at least one event happens
    if evCTS in Events then
    c'était uniquement pour montrer ce que j avais trouvé, et je savais que cela n' était pas le bon code, donc je vais faire comme ma dis Sub0 un thread par port COM et je mettrais le code dans ce topic.

    Je met résolu, meme si cela n est pas vraiment le cas, on va dire que vous m avez bien aidé et que a mon avis je suis sur la bonne voix.

  20. #20
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par rvzip64
    Non Mac LAK, je sais bien ce que je raconte, et je sais bien que le CTS est une broche cablé !!!
    Alors, qu'appelles-tu le registre de contrôle ? L'état des signaux modem est détecté, à la source, par un appel à WaitCommEvent. Cet appel est fait, dans TComPort, au sein des fonctions TComThread.Execute et TCustomComPort.WaitForEvent (ce dernier devant être plus ou moins en mode polling et/ou avoir son propre thread => pas bon).
    Mais ça ne change pas le fait que si ton port COM n'est pas capable de gérer ces signaux de manière hard, tu peux retourner le problème dans tous les sens, tu ne détectera jamais le changement d'état de ces lignes.

    Habituellement, il faut et il suffit de créer un TComPort au sein de chaque thread appelant (pas au sein de l'application principale), et ça passe tout seul...
    Cependant, j'avoue avoir modifié les sources de TComPort pour ne plus avoir besoin de poser un composant sur la fiche (dans une DLL, ça le fait pas trop).
    En gros, ça revient à virer TCustomComPort.ShowSetupDialog.

    Citation Envoyé par rvzip64
    L'exemple que j avais mis
    peut marcher s'il a un thread pour lui tout seul : simplement, après la détection de l'évènement, il faut lire/émettre sur le port.
    Utiliser l'évènement OnCTSChange sert, en général, à débloquer un thread de communication dédié, pas à lire/écrire.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

Discussions similaires

  1. thread, port série, bloquage.
    Par ellipse2v dans le forum MFC
    Réponses: 5
    Dernier message: 23/06/2008, 11h05
  2. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  3. Réponses: 2
    Dernier message: 14/04/2007, 10h15
  4. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 13h34
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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