laurentgluck
Messages postés5Date d'inscriptionlundi 17 août 2009StatutMembreDernière intervention 6 novembre 2010
-
2 sept. 2009 à 10:53
laurentgluck
Messages postés5Date d'inscriptionlundi 17 août 2009StatutMembreDernière intervention 6 novembre 2010
-
3 sept. 2009 à 07:56
Bonjour à tous,
Ca fait plus d’une semaine que je bute sur un problème de décomposition et d’affichage venant d’une trame d’un port RS232. J’aimerai simplement pouvoir afficher les valeurs à l’écran de la trame reçu via le port RS232 après décomposition. L’utilisation du programme ci-dessous, me signal une erreur de threads à moment de l’affichage. Comment est-il possible d’éviter cette erreur ?
Merci d’avance pour votre aide
Public Class Test_RS232
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 = True 'ligne Rts activé
RS232.DtrEnable = True 'ligne Dtr activé
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
Dim trame_emission As String
Dim soT As String = "2020" ' temp counts from SHT11
Dim soRH As String = "6060" ' humidity counts
Dim soT1 As String = "2121" ' temp counts from SHT11
Dim soRH1 As String = "6161" ' humidity counts
Dim soT2 As String = "2222" ' temp counts from SHT11
Dim soRH2 As String = "6262" ' humidity counts
Dim soT3 As String = "2323" ' temp counts from SHT11
Dim soRH3 As String = "6363" ' humidity counts
Dim soT4 As String = "2424" ' temp counts from SHT11
Dim soRH4 As String = "6464" ' humidity counts
Dim soT5 As String = "2525" ' temp counts from SHT11
Dim soRH5 As String = "6565" ' humidity counts
Dim soT6 As String = "2626" ' temp counts from SHT11
Dim soRH6 As String = "6666" ' humidity counts
Dim soT7 As String = "2727" ' temp counts from SHT11
Dim soRH7 As String = "6767" ' humidity counts
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 tableau(16) As String
Dim trame(nb_octet) As Byte ' Tableau acceuillant les données au format byte
Dim y As Integer = 0
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
For n As Integer = 0 To nb_octet
If trame(n) <> 10 Then tableau(y) = tableau(y) & trame(n) Else y += 1
Next
lesdis
Messages postés403Date d'inscriptionmercredi 19 avril 2006StatutMembreDernière intervention 7 août 2020 2 sept. 2009 à 17:30
Bonjour,
Tiens le code me dis quelque chose... :)
La réception des données s'exécute sur un thread séparé du principale correspondant à la form.
L'utilisation d'un thread secondaire permet de ne pas "figer" la form, par contre, il est impossible d'accéder a celle ci vu qu'elle s'exécute sur un processus a part. Ce qui se passe lorsque tu cherches à modifier la valeur des textbox.
Ainsi, si l'on veut accéder au thread principal, il va falloir utiliser un délégué. Celui-ci va permettre de faire le pont entre les 2 threads.
Il faut donc que tu créer un délégué qui va pointer sur une procédure et la passer en arguments de la méthode Invoke. Tu pourras aussi passer des variables à cette procédure.
Inspire-toi de la source qui t'as permis de faire tout cela et je suis sur que tu y arriveras :)
laurentgluck
Messages postés5Date d'inscriptionlundi 17 août 2009StatutMembreDernière intervention 6 novembre 2010 3 sept. 2009 à 07:56
Bonjour Lesdis,
Merci pour ta réponse. Je vais bien étudier comment utiliser délégué ainsi que INVOKE.
En effet, le code est extrait du site, il faut bien apprendre avec des bases solide de certain spécialiste. Avec le code source original, j’arrive à afficher la trame ou une valeur mais pas l’ensemble de mon tableau.