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

WinDev Discussion :

Dialogue avec un port série [WD20]


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut Dialogue avec un port série
    Bonjour,

    Je cherche à établir une communication entre mon programme Windev et un port série.
    J'utilise la fonction sOuvre pour ouvrir le port, puis sEcrit pour envoyer une trame.

    Ce qui me pose problème c'est la réception. Je ne sais pas où je dois mettre mon code pour intercepter les trames qui arrivent. Je pense pouvoir utiliser la fonction sEvénement(1, sEveCaractèreReçu, "LectureCaractère") pour traiter la trame reçue, mais je ne sais pas où mettre cette ligne de code.

    L'application Windev serait maître de la communication.

    En espérant que quelqu'un pourra m'aider.

    Jérôme

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 196
    Points : 9 181
    Points
    9 181
    Par défaut
    Tout simplement dans le code d'initialisation après l'ouverture de ton port série.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Si tel que je le crois, un envois de commande doit nécessairement avoir un retour de commande, tu peux juste après l'envois faire une boucle qui va attendre la réponse du matériel connecté.
    Toutefois, et cela arrive lorsque les commandes envoyées ne sont pas bonnes (commandes non reconnues par le matériel), il te faut dans la boucle d'attente de réception mettre une conditions de sortie, sinon, tu vas te retrouver bloqué dans cette boucle qui sera infinie.
    Voilà, je pense que c'est la piste à suivre.
    Bon dev.
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Bonjour à vous et merci pour vos réponses.

    frenchsting, ce que je ne comprend pas, c'est qu'après d'initialisation de ma fenêtre je ne 'passerais' plus à cet endroit du code donc comment vais-je intercepter ma trame ?

    Ce que j'ai fais c'est lancer un Thread dans le code d'init de ma fenêtre : ThreadExécute("Thread1",threadNormal,Reception)La procédure Reception que je modifierai quand ça marchera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHILE (True)
    	sTrameRecue = sLit("COM"+SAI_PortCommAOuvrir, 20)
     
    	IF Contient(sTrameRecue,RC) THEN
    		Message("Trame reçue");
    	END
    END
    Je ne sais pas si c'est une bonne façon de faire, en tout cas je passe bien dans mon While et ma fenêtre est toujours rafraîchie.
    EDM-TAHITI, Je pense qu'ensuite je n’appellerais cette procédure qu'après un envoie comme tu dis.

  5. #5
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Oui, je pense que cela doit se faire dans une procédure factorisée. De plus, et par expérience, le nombre d'octets à lire dépend de la sequence envoyée, utilises sdansfileentree qui te permet de connaitre le nombre d'octets à lire présent dans le buffer de lecture.
    A partir de là, la factorisation est aisée et surtout, si le protocole de réponse change, la fonction sera toujours en mesure de renvoyer la chaines lue.
    Bon dev.
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Décidément même l'émission des trames me pose problème..

    Mon code d'ouverture du port, après appui sur un bouton :

    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    nPort est un entier
     
    // Ouverture du Port série
    nPort = sOuvre("COM"+SAI_PortCommAOuvrir, 256, 256, 1000)
     
    SI ErreurDétectée ALORS
    	Erreur ("Echec d'ouverture du port COM",ErreurInfo())
    SINON
    	// Paramétrage d'E/S
    	sFixeParamètre(nPort, 115200, 0, 8, 0)	
    FIN

    Je ne passe dans le code d'erreur je suppose donc que mon port est correctement ouvert. "COM"+SAI_PortCommAOuvrir vaut 9 ce qui correspond bien au périphérique avec lequel je travaille, les paramètres de communication sont corrects.

    Pourtant que j'envoie une trame toujours suite à un appui sur un bouton :

    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nIResultat est un entier
    sMessage est une chaîne = "#2;ET;"+CR
     
    nIResultat = sEcrit ("COM"+SAI_PortCommAOuvrir,sMessage)
     
    IF nIResultat = 0 THEN
    	Erreur (ErreurInfo())
    END
    // Attendre la fin de l'écriture
    BOUCLE
    	SI sDansFileSortie(2) = 0 ALORS SORTIR
    FIN
    Info("Fin de l'écriture")

    Je passe dans le code d'erreur et ErreurInfo () renvoie une chaîne vide.

    Il y a surement quelque chose que je fais mal mais je ne sais pas quoi..

    Merci d'avance.

  7. #7
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 196
    Points : 9 181
    Points
    9 181
    Par défaut
    Tu n'as pas vraiment d'erreur. Si c'est 0, ça veut dire que le temps imparti est dépassé.

    Ton périphérique est bien en attente de réception ?
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Oui le périphérique est bien en attente de réception, il s'agit d'une carte électronique que j'ai programmé. J'ai déjà fait une application en C# qui arrive à communiquer sans problème avec donc je ne vois pourquoi la fonction sEcrit renverrais 0.. J'ai pourtant l'impression de faire une utilisation simple des fonctions port série de Windev.

    Une idée ?

    Au passage concernant ta première réponse, pourrais-tu m'expliquer comment ça fonctionnerait en mettant le code dans l’initialisation de ma fenêtre s'il te plait ?

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 178
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Pour la réception de trame du port COM, je vous conseille fortement de retourner sur l'utilisation de sEvénement. En parcourant l'aide, vous pourrez y voir (dans les remarques) que Windev va créer lui même le thread, et appeler la procédure indiquée dès lors qu'il y aura quelque chose dans la fil d'entrée.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    themayu, j'en prend bonnes notes, c'était mon idée pour la suite
    Je suppose que ça répond à ma question concernant le fait de mettre le code sEvenement dans le code d'initialisation de la fenêtre si le thread est créé automatiquement.
    Merci

    Je précise que je ne vois pas de caractère passé dans mon espion port série (Free Device Monitoring Studio) qui fonctionne avec mon appli en C#.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    J'ai trouvé quel était le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nPort = sOuvre("9", 256, 256, 1000)
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nPort = sOuvre("COM9", 256, 256, 1000)
    Je manque un peu d'entrainement dans la lecture de doc..

    Je garde le post ouvert au cas ou je galère avec la réception.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Pour information, tant qu'un port com est ouvert avec Windev le signal DTR de ce port est activé, ce qui était gênant dans mon cas.
    Malgré que la fonction sFixeParamètre propose une option pour la gestion du protocole DTR/DSR je n'ai pas réussi à désactiver le signal quand le port est ouvert.

    Ma communication se passe bien néanmoins, Merci à tous pour votre aide !

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

Discussions similaires

  1. [Port série] Dialogue avec le port série
    Par L-F-an dans le forum Bibliothèques
    Réponses: 16
    Dernier message: 08/06/2011, 15h49
  2. [reseaux] Dialogue avec les ports COM
    Par EricBisca dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 05/11/2006, 18h08
  3. [C#]Problème avec le port série sous Win98
    Par Polux63 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/09/2006, 09h14
  4. Réponses: 7
    Dernier message: 09/06/2006, 10h38
  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