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

Windows Forms Discussion :

Sélection port série


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut Sélection port série
    Bonjour à tous,

    J'ai un microcontrôleur connecté au port série. Pour l'instant j'arrive à scanner les ports de l'ordi, les placer dans une liste déroulante.
    Mon soucis est la gestion d'une mauvaise sélection du port.
    - Sélection du port dans la liste déroulante
    - bouton "valider" qui envoie un caractère vers le microcontrôleur
    - si le bon port est sélectionné, alors le microcontrôleur renvoie un autre caractère, alors une msgbox dit "Tout va bien"

    Jusqu'ici c'est bon... En revanche, si c'est un autre port qui est sélectionné mais qui n'est pas connecté au microcontrôleur, comment avoir une msgbox indiquant que ce port n'est pas connecté au microcontrôleur...

    J'utilise la class "serialport"...
    Liste des ports disponibles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            CheckForIllegalCrossThreadCalls = False
            For i As Integer = 0 To My.Computer.Ports.SerialPortNames.Count - 1
                ComboBox1.Items.Add(My.Computer.Ports.SerialPortNames(i))
            Next
            BT_SELECT.Enabled = False
        End Sub
    Bouton permettant la validation du port sélectionné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub BT_SELECT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SELECT.Click
     
            If Port.IsOpen Then
                Port.Close()
            End If
            Port.PortName = NumPort
            Port.Open()
            LBL1.Text = "Port " & NumPort & " sélectionné"
            Port.Write(Asc("A") & "!%")
        End Sub
    Lecture du port
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub port_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Port.DataReceived
            Dim Test As String
            Test = CChar(ChrW(Port.ReadByte()))
            TxtB_TestPort.Text = Test
     
            If Test = "T" Then
                MsgBox("Connexion établie sur le port " & NumPort, 64, "Connexion port " & NumPort)
                TxtB_TestPort.Text = ""
            End If
     
        End Sub
    J'ai bien essayé de mettre un test dans le "DataReceivedEvents" mais bien évidemment si le port sélectionné ne correspond pas au port où se trouve le microcontrôleur, aucune donnée arrive sur ce port et donc aucun test ne peut être effectué...
    Là, je suis coincé et ne sais quelle technique utilisée
    Merci à vous si vous avez une piste
    Lio

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Dans ce cas précis, tu ne dois pas utiliser l'évènement mais appelé la fonction ReadByte "manuellement" sous contrôle du timeout

    D'abord tu positionne la propriété ReadTimeout de ton serialport pour indiquer la valeur du timeout (500ms par défaut)

    Ensuite, juste avant l'écriture de ton caractère, tu fais appel à la méthode DiscardInBuffer du serialport, pour vider le buffer de réception.
    tu balance ton caractère et de suite après tu appelle ReadByte.

    Readbyte restera bloqué tant qu'un byte n'arrivera pas sur le port et au maximum la valeur du timeout.
    Si un caractère arrive, tu le récupère, ça t'indique que ton µc est bien branché. Si aucun caractère n'arrive, tu obtiendra une exception lorsque le timeout sera écoulé. Il te suffira de gérer cette exception pour dire que le µc n'a pas répondu sur ce port.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci pour cette piste... Je vais essayer cette méthode.. Avant de poser immédiatement les questions qui me viennent, je vais tester... enfin bidouiller...
    Merci
    Je vous tiens informé...
    Lio
    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    J'ai un soucis.. avec "e"
    La variable 'e' masque une variable dans un bloc englobant
    Mis à part cela, suis-je sur la bonne piste?
    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
    Private Sub BT_SELECT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SELECT.Click
     
            If Port.IsOpen Then
                Port.Close()
            End If
            Port.PortName = NumPort
            Port.Open()
            LBL1.Text = "Port " & NumPort & " sélectionné"
            LBL2.BackColor = Color.Green
            Port.ReadTimeout = 500
            Port.DiscardInBuffer()
            Port.Write(Asc("A") & "!%")
            Try
                Port.ReadByte()
            Catch e As TimeoutException
                MsgBox("bip", 48, "bip")
            End Try
        End Sub
    Merci beaucoup
    Lio

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Oui, la variable e que tu déclare implicitement dans Catch e As TimeoutException cache le paramètre e qui est passé à ta procédure BT_SELECT_Click et qui contient les paramètres de l'évènement Click sur ton bouton

    Modifie le nom de la variable dans le catch, tu peux mettre ex par exemple

    Tu es sur la bonne piste sauf qu'il te manque là, la partie "le µc répond au caractère envoyé car il est bien branché sur ce port"
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci,
    Je suis dessus... je bidouille..
    la variable 'ex' semble être ok. Je l'ai déclarée en tant que "double".... bof bof..

    Que pensez-vous de ce code? Le résultat me semble satisfaisant. J'ai 3 ports com, le µC est sur le com3, donc message "Le microcontrôleur n'est pas connecté au port... " pour le com 1 et 2 et message "Connexion établie sur le port..." pour le com3

    Cela dit, j'ai un avertissement pour la variable 'ex' :
    Variable locale inutilisée:'ex'
    Je ne sais pas trop où je dois déclarer cette variable... Je me dis que je ne dois pas comprendre ce que je fais... Une variable ne doit pas être déclarée dans un "try..." mais avant juste après le sub, non?

    J'ai supprimé la partie Private Sub port_DataReceived(...)



    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
    Private Sub BT_SELECT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SELECT.Click
            Dim test As Char
     
            If Port.IsOpen Then
                Port.Close()
            End If
            Port.PortName = NumPort
            Port.Open()
            LBL1.Text = "Port " & NumPort & " sélectionné"
            LBL2.BackColor = Color.Green
            Port.ReadTimeout = 500
            Port.DiscardInBuffer()
            Port.Write(Asc("A") & "!%")
     
            Try
                test = CChar(ChrW(Port.ReadByte()))
                Dim ex As Double
            Catch ex As TimeoutException
                MsgBox("Le microcontrôleur n'est pas connecté au port " & NumPort, 48, "Connexion impossible!")
                If test = "T" Then
                    MsgBox("Connexion établie sur le port " & NumPort, 64, "Connexion port " & NumPort)
                    TxtB_TestPort.Text = ""
                End If
            End Try
     
            TxtB_TestPort.Text = Test
     
            If Test = "T" Then
                MsgBox("Connexion établie sur le port " & NumPort, 64, "Connexion port " & NumPort)
                TxtB_TestPort.Text = ""
            End If
        End Sub

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Pas besoin de déclarer ex, puisqu'elle est déjà déclarée par le Catch.

    Tu as mélangé un peu les bouts de codes dans tous les sens.

    Voici un code plus propre :
    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
    Private Sub BT_SELECT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SELECT.Click
    	Dim test As Char
     
    	If Port.IsOpen Then
    			Port.Close()
    	End If
    	Port.PortName = NumPort
    	Port.Open()
    	LBL1.Text = "Port " & NumPort & " sélectionné"
    	LBL2.BackColor = Color.Green
    	Port.ReadTimeout = 500
    	Port.DiscardInBuffer()
    	Port.Write(Asc("A") & "!%")
     
    	Try
    			test = CChar(ChrW(Port.ReadByte()))
     
    			If test = "T" Then
    					MsgBox("Connexion établie sur le port " & NumPort, 64, "Connexion port " & NumPort)
    					TxtB_TestPort.Text = ""
    			End If
     
    	Catch ex As TimeoutException
    			MsgBox("Le microcontrôleur n'est pas connecté au port " & NumPort, 48, "Connexion impossible!")
    	End Try
    End Sub
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci sevyc64, plus d'avertissement. Effectivement j'ai bien mélangé et votre ordre (de code) me facilite la compréhension. Je vais lire de la doc sur "catch"...
    Le code fonctionne, donc le post est résolu...
    Merci pour vos réponses rapides et efficaces... Merci, je me cassais la tête depuis hier...
    C'est chouette...
    Lio

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

Discussions similaires

  1. [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
  2. Réception sur le port série sous DOS avec Borland V3.0
    Par jackyjacky dans le forum Autres éditeurs
    Réponses: 24
    Dernier message: 19/03/2004, 23h18
  3. probleme de communication port série
    Par ben23 dans le forum MFC
    Réponses: 8
    Dernier message: 06/02/2004, 15h12
  4. Recherche de l'adresse du port série
    Par StephCal dans le forum Langage
    Réponses: 8
    Dernier message: 07/01/2004, 11h23
  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