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
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.