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

VB 6 et antérieur Discussion :

Port RS-232, activer en lecture - écriture


Sujet :

VB 6 et antérieur

  1. #1
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut Port RS-232, activer en lecture - écriture
    Bonjour à tous ...

    Je tente de réaliser une application qui me permet de communiquer avec un appareil de mesure (Heidenhain ND 281B qui est relié à un palpeur). Le but de cette application, c'est de récupérer la valeur de mesure.

    Pour faire cela, j'ai des paramètres à respecter qui sont les suivants :
    (je mets le code c'est plus simple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmChildMesure.MSComEtalon.Settings = "9600,e,7,2"
    Ce que je cherche à faire c'est envoyer une valeur à mon appareil pour que cela me retourne automatiquement la mesure. Pour faire cela, voici la ligne de code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmChildMesure.MSComEtalon.Output = Chr$(2)
    Le Chr$(2) c'est un critère que je dois respecter, en effet, l'appareil me répond seulement si j'envoie ce caractère selon le manuel.

    Le problème que j'ai c'est que sur la ligne de code ci-dessus lorsque exécute mon application, mon port est en "ECRITURE SEULEMENT" et je souhaiterais qu'il soit en "LECTURE - ECRITURE". Savez-vous comment je peux faire cela ??? Est-ce qu'il y a une propriété pour effectuer une telle opération ?

    Merci d'avance pour vos réponse ... salutations à tous ...

    S'Noop ... y

    PS : Pour information, j'ai tenté de faire de la communication avec un logiciel appelé "WinWedge" et lorsque je teste mon port et que j'envoie le fameux caractère "Chr$(2)" qui correspond en CHAR à STX, j'ai un retour d'information et ma mesure s'affiche bien ... ... contrairement à mon application VB6 ... ...

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Peux tu nous dire comment tu arrives à mettre ton port Com en Lecture seulement ? Je ne connais pas cette option.
    Faut il envoyer seulement CHR(2) ou CHR(2) & VbCrLf ?

  3. #3
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Bonjour,

    Alors c'est une très bonne question ... ...

    En fait lorsque j'exécute mon code et que je laisse ma souris sur la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmChildMesure.MSComEtalon.Output = Chr$(2)
    j'ai le texte suivant dans le petit carré jaune qui apparait :
    frmChildMesure.MSComEtalon.Output = <property is write only>
    et normalement je devrais être redirigée dans mon évènement "OnComm" car j'ai un retour d'informations qui devrait arriver ... ... Mais comme c'est en "ECRITURE SEULEMENT" je n'ai rien ... et c'est bien là mon problème ... ...

    Est-ce que ce "ECRITURE SEULEMENT" pourrait provenir du matériel que j'utilise ??? Notamment de mon appareil de mesure ???

    Merci d'avance pour vos réponses ...

  4. #4
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Désolé de rire, c'est pas méchant Ca ne veut pas dire que ton port est en lecture seule, ça veut simplement dire que la propriété Output est en écriture seule, on ne peut que définir la prorpiété Output, pas la lire, ce message est tout à fait normal donc.

    En revanche tu n'as pas répondu à ma deuxième question, faut il envoyer SEULEMENT CHR(2) ou ne faut-il pas plutot envoyer CHR(2) & passage à la ligne (donc VbCrLf) ? Et pour éviter un message supplémentaire, donne donc la référence exacte de l'appareil sur lequel tu t'interfaces stp.

  5. #5
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Citation Envoyé par OhMonBato Voir le message
    Désolé de rire, c'est pas méchant Ca ne veut pas dire que ton port est en lecture seule,
    Pas de soucis ... je débute en VB ... ... et cela se voit ... ( ) ...


    Citation Envoyé par OhMonBato Voir le message
    En revanche tu n'as pas répondu à ma deuxième question, faut il envoyer SEULEMENT CHR(2) ou ne faut-il pas plutot envoyer CHR(2) & passage à la ligne (donc VbCrLf) ? Et pour éviter un message supplémentaire, donne donc la référence exacte de l'appareil sur lequel tu t'interfaces stp.
    Alors j'ai essayé de rajouter ce que tu m'as dit mais je n'ai aucun changement ... en fait voilà exactement ce qui doit se passer :

    1) J'envoie une valeur dans mon appareil de mesure
    2) Mon appareil de mesure doit me répondre en me donnant la mesure exacte ...

    Et voici ce qui se passe :

    1) J'envoie la valeur (avec ou sans le VbCrLf) et je n'ai rien qui se passe ... ... normalement je devrais dériver dans la valeur "OnComm" de mon MSCom non ???

    Merci vraiment pour ton aide ... ... je débute vraiment ... ...

  6. #6
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Prends l'habitude de mettre ton code comme tu as fait jusqu'ici, j'aimerais être sûr que ta syntaxe est bonne quand tu ajoutes le VbCrLf et si tu as la référence de l'appareil, je suis preneur, au cas où...

    Si tu as un deuxième port Com sur ton PC, pour être sûr que tu emets bien, tu pourrais déjà brancher ton port com de sortie vers l'appereil sur le deuxième port com de ton PC et monitorer l'activité de ce deuxième port com sur HypeTerminal, tu pourrais ainsi voir si tu transmets réellement quelquechose. Si tu n'as pas de deuxième port com, peut etre as tu un deuxième PC avec un port com pour faire la même chose ? Tu lèverais ainsi le doute sur un éventuel problème de matériel (cable interface défectueux par exemple).

  7. #7
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Ouppppsss pour le code ... le voici au complet : (le faire défiler car je parle plus loin de ce qui est en couleur ROUGE)

    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
    Private Sub Command1_Click()
    'Exécution du code ci-dessous sur clic du bouton "Command1"
    
        'Test des paramètres de communications
        If (frmMain.MSComm1.Settings <> "9600,e,7,2") Then
            frmMain.MSComm1.Settings = "9600,e,7,2"
        End If
                
        'Si le port est ouvert, on le ferme pour le réouvrir avec les nouveaux paramètres.
        If (frmMain.MSComm1.PortOpen = True) Then
            frmMain.MSComm1.PortOpen = False
            frmMain.MSComm1.PortOpen = True
        ElseIf (frmMain.MSComm1.PortOpen = False) Then
            frmMain.MSComm1.PortOpen = True
        End If
        
        'La ligne Terminal de données prêt est activée lors de l'ouverture du port (si = TRUE)
        frmMain.MSComm1.DTREnable = True
    
        ' La ligne Demande pour émettre est active au moment de l'ouverture du port et inactive lors de sa fermeture
        frmMain.MSComm1.RTSEnable = True
        
        'Si RThreshold = 1, le contrôle MSComm génère l'événement OnComm chaque fois qu'un caractère est
        'placé dans le tampon de réception
        frmMain.MSComm1.RThreshold = 1
        
        'Indique le mode d'extraction des données par la propriété Input
        MSComm1.InputMode = comInputModeText
        
        'Envoie d'une information pour que l'appareil retourne la valeur de la mesure
        frmMain.MSComm1.Output = Chr$(2) & vbCrLf
    
    End Sub
    Comme tu peux le voir, j'exécute ce pavé de code sur clic d'un bouton ... pour tester je trouve que c'est un bon moyen.

    Maintenant tu pourras voir en ROUGE dans le code le &vbCrLf comme tu m'as dit ... ... que je le mette ou pas, cela ne change rien ...

    L'appareil que j'utilise en faite c'est : Heidenhain ND 281B qui est relié à un palpeur

    Concernant les tests que tu m'as demandé de faire, voici ce que je peux te retourner :

    1) Je n'ai pas d'autre pc que celui que j'utilise et je n'ai pas la possibilité d'aller tester ailleurs ...
    2) Je n'ai pas de port com sur mon pc mais par contre j'utilise un câble USB - Rs-232
    3) J'ai utilisé le logiciel "WinWedge" pour tester ma connexion et je ne recontre aucun problème ... j'envoie bien le "STX" et j'ai ma mesure comme réponse de l'appareil ... donc, je suppose que l'on peut écarter les problèmes matériels ???

    Voili, j'espère avoir été clair dans mes explications ... si jamais c'est pas le cas, merci de m'en avertir ...

    Merci pour votre aide ...


    EDIT :


    Je confirme bien que ce n'est pas un problème matériel ... en effet, au niveau de mon appareil j'ai une option qui me permet d'envoyer les paramètres de configuration de l'appareil à l'ordinateur et lorsque je sélectionne cette option, j'ai l'évènement OnComm de mon MSCom qui se met bien en route ... donc il est bien capable de recevoir des données ... ...

  8. #8
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Si ton programme est dédié à cet appareil et que celui ne foncitonne qu'en 9600 baud, avec parité impaire, je te conseille vivement de régler ces settings en mode conception dans les propriétés du port com ça évite de le faire à chaque fois par code.
    Ceci étant dit, je doute que ton appareil utilise un protocole de communication hors tu mets RTSEnable à True et personnellement je le mettrais à False (valeur par défaut d'ailleurs).
    Essaye de nouveau ensuite CHR(2) ou CHR(2) & VbCrLf

  9. #9
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Citation Envoyé par OhMonBato Voir le message
    Si ton programme est dédié à cet appareil et que celui ne foncitonne qu'en 9600 baud, avec parité impaire, je te conseille vivement de régler ces settings en mode conception dans les propriétés du port com ça évite de le faire à chaque fois par code.
    Je l'ai fait par le code pour être absolument sur que ça sera ces paramètres qui seront utilisés ... ... Et par la suite, le code que je suis en train de développer sera ajouté dans une autre application qui elle à des critères que je dois respecter afin de garder une structure cohérence et dans cette structure je dois déclarer mes paramètres de connexion dans le code ... ...

    Citation Envoyé par OhMonBato Voir le message
    Ceci étant dit, je doute que ton appareil utilise un protocole de communication hors tu mets RTSEnable à True et personnellement je le mettrais à False (valeur par défaut d'ailleurs).
    Ok, c'est fait.

    Citation Envoyé par OhMonBato Voir le message
    Essaye de nouveau ensuite CHR(2) ou CHR(2) & VbCrLf
    Ok ... et aucun changement ...

    Voici les tests fait :

    1) Avec CHR$(2) uniquement :
    1.1) Avec frmMain.MSComm1.RTSEnable = True --> RIEN
    1.2) frmMain.MSComm1.RTSEnable = False--> RIEN

    2) Avec Chr$(2) & vbCrLf :
    2.1) Avec frmMain.MSComm1.RTSEnable = True --> RIEN
    2.2) frmMain.MSComm1.RTSEnable = False --> RIEN

    J'entends par RIEN, aucun changement, je ne suis pas renvoyé dans mon MSComm1_OnComm() ...

    C'est vraiment fou quand même ... ... je ne comprends vraiment pas ce qui peut pécloter mis à part la fameuse ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmMain.MSComm1.Output = Chr$(2) & vbCrLf
    Pour que l'on essaie de bien comprendre la chose, voici le raisonnement que j'ai fait ... ...

    Dans le programme que j'utilise pour tester ma communication (WinWedge), j'ai paramétré les choses suivantes :

    Connector : COM 5
    Baud Rate : 9'600
    Parity : Even
    Data Bits : Seven
    Stop Bits : 2
    Flow Control : None
    Input Buffet Size : 1024
    OutPut Buffer Size : 512

    Au niveau de l'analyse de mon port avec toujours le logiciel "WinWedge" j'ai indiqué :

    OutPut value ASCII : 2 (d'où mon Chr$(2) dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmMain.MSComm1.Output = Chr$(2) & vbCrLf
    )
    Cette valeur correspond en CHAR à ce fameux STX. (représenté dans le programme WinWedge par un caractère exotique qui ressemble à un smiley noir qui rigole)

    Lorsque je clic sur SEND dans le programme pour envoyer cette valeur, j'ai comme INPUT en retour :
    + 5.000272
    ce qui correspond à ma valeur mesurée et indiquée sur mon interface Heidenhain.

    Si vous avez des idées, elles seront les bienvenues ... merci encore pour votre soutient ...

  10. #10
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Le code semble bon mais j'ai souvent eu des problèmes avec les adaptateurs USB/RS232 en émission...
    Si tu as moyen essaye de bricoler un connecteur en reliant les broches 2 et 3, tu devrais ainsi voir si l'émission du CHR(2) (avec ou sans CRLF) est bien détectée dans ton événement OnComm. Si tu la connais, donne moi aussi la référence de ton adaptateur USB/RS232 ainsi que l'OS sous lequel tu travailles (XP, Vista, etc..)

  11. #11
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Bonjour ...

    Dsl de la réponse si tardive ...

    Voici le code :

    Sur clic du bouton :
    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
    Private Sub Command1_Click()
    'Exécution du code ci-dessous sur clic du bouton "Command1"
     
        'Test des paramètres de communications
        If (frmMain.MSComm1.Settings <> "9600,e,7,2") Then
            frmMain.MSComm1.Settings = "9600,e,7,2"
        End If
     
        'Si le port est ouvert, on le ferme pour le réouvrir avec les nouveaux paramètres.
        If (frmMain.MSComm1.PortOpen = True) Then
            frmMain.MSComm1.PortOpen = False
            frmMain.MSComm1.InBufferSize = 1024
            frmMain.MSComm1.OutBufferSize = 512
            frmMain.MSComm1.PortOpen = True
        ElseIf (frmMain.MSComm1.PortOpen = False) Then
            frmMain.MSComm1.InBufferSize = 1024
            frmMain.MSComm1.OutBufferSize = 512
            frmMain.MSComm1.PortOpen = True
        End If
     
        'La ligne Terminal de données prêt est activée lors de l'ouverture du port (si = TRUE)
        frmMain.MSComm1.DTREnable = True
     
        ' La ligne Demande pour émettre est active au moment de l'ouverture du port et inactive lors de sa fermeture
        frmMain.MSComm1.RTSEnable = False
     
        'Si RThreshold = 1, le contrôle MSComm génère l'événement OnComm chaque fois qu'un caractère est
        'placé dans le tampon de réception
        frmMain.MSComm1.RThreshold = 1
     
     
        'Indique le mode d'extraction des données par la propriété Input
        MSComm1.InputMode = comInputModeText
     
        'Envoie d'une information pour que l'appareil retourne la valeur de la mesure
        frmMain.MSComm1.Output = Chr$(2) & vbCrLf
     
    End Sub
    MSComm1_OnComm :
    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
    Private Sub MSComm1_OnComm()
    'OnComm est exécuté chaque fois que la valeur en paramètre est modifiée (MSComm1)
     
        Dim str_tampon As String
     
        str_tampon = ""
     
        'La ligne Terminal de données prêt est activée lors de l'ouverture du port (si = TRUE)
        frmMain.MSComm1.DTREnable = False
     
        ' La ligne Demande pour émettre est active au moment de l'ouverture du port et inactive lors de sa fermeture
        frmMain.MSComm1.RTSEnable = False
     
        'Si RThreshold = 1, le contrôle MSComm génère l'événement OnComm chaque fois qu'un caractère est
        'placé dans le tampon de réception
        frmMain.MSComm1.RThreshold = 1
     
        'Indique le mode d'extraction des données par la propriété Input
        MSComm1.InputMode = comInputModeText
     
        str_tampon = str_tampon & str_tampon & frmMain.MSComm1.Input
     
        MsgBox str_tampon
     
    End Sub
    Et vous savez quoi ? Ce code fonctionne ... je ne saurais expliquer comment cela se fait mais cela fonctionne ...

    Merci pour votre aide ... je suis soulagé ...

    Merci encore


    PS : Je travaille en VB6 avec Windows Xp Pro

  12. #12
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    A mes yeux ça prouve surtout une chose, c'est que de redéfinir sans arrêt les paramètres du port Com à chaque émission ou chaque réception fout un beau b...el mais je vois que j'ai trouvé plus têtu que moi... Je sais que chacun est libre de faire comme il l'entend mais je serais assez surpris de trouver beaucoup d'exemples de code qui suivent ta procédure
    Par simple curiosté j'aimerais savoir si ton code fonctionne si tu mettais une fois pour toute en dur les paramètres du port com et que tu limitais ton code simplement à l'envoi et à la réception sans rien d'autre.

    Une chose me parait toutefois franchement erronée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    str_tampon = str_tampon & str_tampon & frmMain.MSComm1.Input
    Tu ajoutes str_tampon à lui même alors qu'il suffit de lui ajouter le contenu du buffer du port com.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    str_tampon = str_tampon & frmMain.MSComm1.Input

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

Discussions similaires

  1. lecture écriture port série
    Par lio59 dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2011, 23h58
  2. Lecture écriture sur port série
    Par lio59 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 06/02/2011, 12h49
  3. Lecture/écriture port parallele
    Par thieu17 dans le forum C++
    Réponses: 4
    Dernier message: 26/07/2009, 16h19
  4. Réponses: 6
    Dernier message: 05/06/2008, 23h04
  5. Lecture / écriture sur un port com
    Par dorian833 dans le forum C++
    Réponses: 7
    Dernier message: 07/07/2005, 15h20

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