Utilisation du port com vs2005

Soyez le premier à donner votre avis sur cette source.

Vue 40 835 fois - Téléchargée 44 444 fois

Description

Après avoir parcouru le forum et les différentes sources sur ce site, je me suis aperçu qu'il y avait très peu de documentation sur l'utilisation du port COM.

Avec le framework .NET 2.0, la classe SerialPort à fait son apparition, permettant de gérer simplement un port RS232. Ce code n'a aucune prétention, seulement de faire connaître cette classe au maximum de gens.

Source / Exemple :


Public Class Test_RS232

    Private Delegate Sub _Affiche_ASCII(ByVal donnee As String)
    Private Delegate Sub _affiche_Hexa(ByVal donnee As String)

    Private Sub Test_RS232_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ports() As String = IO.Ports.SerialPort.GetPortNames() ' tableau de string acceuillant les ports present sur la machine

        'configuration du port RS232
        RS232.BaudRate = 9600 'vitesse du port
        RS232.Parity = IO.Ports.Parity.None 'pas de parité
        RS232.StopBits = IO.Ports.StopBits.One 'un bit d'arrêt par octet
        RS232.DataBits = 8 'nombre de bit par octet
        RS232.RtsEnable = False 'ligne Rts désactivé
        RS232.DtrEnable = False 'ligne Dtr désactivé

        Choix_Port.Items.AddRange(ports) ' on ajoute le nom des ports dans le combobox

        Try

            Choix_Port.SelectedIndex = 0 ' on donne le focus au premier port du combobox

        Catch ' message d'erreur si aucun port COM n'est détecté sur la machine et on ferme l'application

            MsgBox("Il semble ne pas y avoir de port RS232 sur votre machine, cette application ne pourra pas marcher")
            Application.Exit()

        End Try
    End Sub

    Private Sub Connexion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connexion.Click

        If Connexion.Text = "Connexion" Then

            Try

                'on ouvre le port désiré
                RS232.PortName = Choix_Port.Text
                RS232.Open()

            Catch ' message d'erreur si l'on ne peut pas ouvrir le port

                MsgBox("Il semble que le port choisi est déjà en cours d'utilisation par une autre application, merci de choisir un port libre pour se connecter")
                Exit Sub

            End Try

            Vitesse.Text = RS232.BaudRate & Space(1) & "Bauds" 'on affiche la vitesse du port
            Connexion.Text = "Déconnexion" ' on change l'intitulé du bouton
            Choix_Port.Enabled = False ' on désactive le combobox pendant l'utilisation du port
        Else

            Vitesse.Text = "" 'on efface la vitesse
            Connexion.Text = "Connexion" ' on change l'intitulé du bouton
            RS232.Close() 'on ferme le port
            Choix_Port.Enabled = True 'on réactive le combobox

        End If
    End Sub

    'Evènement se déclenchant lors de l'arrivée de données sur le port RS232
    Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
        Dim nb_octet As Integer = RS232.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
        Dim trame(nb_octet - 1) As Byte ' Tableau acceuillant les données au format byte

        RS232.Read(trame, 0, nb_octet) 'on lit le port

        Dim donnee As String = System.Text.Encoding.ASCII.GetString(trame) ' on récupère les données au format ASCII

        'L'évènement DataReceived se situe sur un thread différent que le form, nous devons donc appelé un délégué pour afficher le résultat à l'écran
        If Me.InvokeRequired Then
            Me.Invoke(New _Affiche_ASCII(AddressOf Affiche_ASCII), donnee)
        End If

        'On va convertir tous les octets du tableau en valeurs Hexadecimal pour les afficher à l'écran
        Array.ForEach(Of Byte)(trame, AddressOf Trt_Trame)
    End Sub

    Private Sub Trt_Trame(ByVal bit As Byte)
        'on appelle le délégué pour afficher les données
        If Me.InvokeRequired Then
            Me.Invoke(New _affiche_Hexa(AddressOf Affiche_Hexa), Hex(bit).PadLeft(2, "0") & "H" & Space(1)) ' on convertit l'octet en valeur Hexadécimal en faisant attention qu'il reste codé sur 2 caractères et on ajoute un espace pour faciliter la lecture
        End If
    End Sub

    Private Sub Affiche_ASCII(ByVal donnee As String)
        RTB_ASCII.AppendText(donnee) 'On affiche les données à l'écran
    End Sub

    Private Sub Affiche_Hexa(ByVal donnee As String)
        RTB_Hexa.AppendText(donnee) 'on affiche les données à l'écran
    End Sub
End Class

Conclusion :


Pour plus d'information, consultez la doc Msdn : http://msdn.microsoft.com/fr-fr/library/system.io.ports.serialport.aspx

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

MegaMIND243
Messages postés
23
Date d'inscription
vendredi 6 avril 2012
Statut
Membre
Dernière intervention
24 juillet 2012

est ce que sa marche sur un modem usb?
lesdis
Messages postés
401
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
6 juin 2011

Personnellement, j'ai rencontré un problème similaire dans une autre application lors de la connexion.
L'application avait un protocole de type XonXoff d'activé et si l'on essaie de connecter le port COM alors que rien n'est connecté, le programme se bloque.

Essai de voir sans connecter ta carte si l'application se connecte et se déconnecte normalement. Si c'est le cas, essai de voir du côté de readTimeOut et de WriteTimeOut ou bien d'effacer les buffer de réception ou d'écriture.

Je ne pourrais t'en dire plus :(

Bonne prog !
cs_tommasi
Messages postés
2
Date d'inscription
jeudi 22 juin 2006
Statut
Membre
Dernière intervention
5 novembre 2009

Bonjour,
Merci de votre réponse. Pour être plus précis, j'ai réalisé un capteur à base d'un DSPIC33F. Le DSPIC envoie les données sur le port série de manière continue, c'est à dire toutes les 12,5ms. Le réglage du port COM coté DSPIC est des lus simple (baudrate:115200, nombre de bits: 8, parité:None, Bit d'arrêt:1, Contrôleur de flux: Aucun).
J'ai utilisé l'application dans l'environnement VS2008 et pas en exécutable (il y a peut être une incidence). Le problème que je rencontre lorsque j'appuie sur le bouton déconnecter, c'est que je n'ai plus la main sur l'application, c'est à dire que je ne peux rien faire avec les contrôles, le bouton ne change pas non plus de nom. J'ai l'impression que le programme plante lorsque l'on demande de fermer le port COM. La seule manière que j'ai d'arrêter le programme c'est d'utiliser le bouton arrêt du déboggeur.
J'espère que ces renseignements seront utile à trouver une explication.
Cordialement
lesdis
Messages postés
401
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
6 juin 2011

@Lemabs :
Avez-vous vérifié la configuration du port COM (vitesse, nombre de bit, bit de stop...). Si votre carte attend un handshake ou bien un signal RTS ou DTR, cet exemple ne le traite pas, mais tout ceci est supporté par l'objet serialport (http://msdn.microsoft.com/fr-fr/library/system.io.ports.serialport_members%28VS.80%29.aspx)

@Tommas! :
Pourriez-vous être plus explicite sur l'erreur soulevé lors de votre appui sur déconnexion ?
cs_tommasi
Messages postés
2
Date d'inscription
jeudi 22 juin 2006
Statut
Membre
Dernière intervention
5 novembre 2009

Bonjour,

Merci pour ce code, je l'ai testé avec un appareil de ma fabrication envoyant de manière répété des données sur le port COM. Les données sont très bien récupérées mais le soft plante lorsque je désire déconnecter en appuyant sur le bouton "déconnexion" . La seule façon pour qu'il ne plante pas c'est de retirer le câble préalablement.
Y'a t'il une explication simple?

Cordialement

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.