Lecture du port serie [VB 2008]

Signaler
Messages postés
60
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 avril 2012
-
Messages postés
60
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 avril 2012
-
Bonjour,
Je suis entrain de faire une application qui lit les données reçues sur le port série (ces données sont envoyées par une carte programmable Arduino).Pour cela j'utilise le composant SerialPort intégré a vb 2008, grâce a celui-ci j'arrive tout a fait a lire les données et a les lister dans une Richtextbox mais le problème et que lorsque je commence la lecture, impossible de l'arrêter car le bouton d'arrêt de répond plus.J'ai fait beaucoup de recherches et j'ai trouvé quelques sources qui parlent de Thread.Mais mon niveau en vb et trop faible pour arriver a comprendre (c'est pas faute d'avoir essayé ).Je voudrais donc savoir si quelqu'un peu m'aider.
Merci d'avance a +

7 réponses


Bonsoir,
Voici un petit exemple qui montre le fonctionnement de base d'un thread :

Public Class Form1
    'déclaration d'un nouveau thread appelant la sub "MaSub"
    Dim t As New Threading.Thread(AddressOf MaSub)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'on demmare le thread 
        t.Start()
        'si on met ici MaSub (sans t.Start) , Form1 est bloquée le temps du traitement du calcul
    End Sub

    Private Sub MaSub()
        'code du traitement bloquant (calcul bidon pour l'exemple)
        For x = 0 To 200000000
            Dim i As Double = Math.Cos(120)
            Dim j As Double = Math.Cos(200)
            Dim f As Double = i + j
        Next
        MessageBox.Show("fin")
    End Sub
End Class

a bientôt

Pour l'adapter à ton textbox, voici ce que ca pourrait donner :
Public Class Form1
    'déclaration d'un nouveau thread appelant la sub "MaSub"
    Dim t As New Threading.Thread(AddressOf MaSub)
    'déclaration d'un délégué chargé d'appeler une sub (avec un parametre ici "Texte")
    Private Delegate Sub DelegateRemplirTextBox(ByVal texte As String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'on demmare le thread 
        t.Start()
        'si on met ici MaSub (sans t.Start) , Form1 est bloquée le temps du traitement du calcul
    End Sub

    Private Sub MaSub()
        'code du traitement bloquant (calcul bidon pour l'exemple)
        Dim resultat As Double
        For x = 0 To 200000000
            Dim i As Double = Math.Cos(120)
            Dim j As Double = Math.Cos(200)
            resultat = i + j

            'pour éviter les opérations inter-threads on est obligé
            'de faire appel à un délégué qui va se charger d'appeler lui même
            'la sub RemplirTextBox avec "resultat" en parametre (transformé en string pour le textbox)
            If Me.InvokeRequired = True Then
                Me.Invoke(New DelegateRemplirTextBox(AddressOf RemplirTextBox), resultat.ToString)
            End If

            'petite pause pour simuler l'arrivée des données du port série
            Threading.Thread.Sleep(100)
        Next
        MessageBox.Show("fin du traitement")
    End Sub

    Private Sub RemplirTextBox(ByVal Texte As String)
        TextBox1.Text &= Texte
    End Sub
End Class
Messages postés
60
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 avril 2012

Re,
Merci beaucoup pour ta réponse je vais essayer tout de suite.Je vous tiens au courant .
Messages postés
60
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 avril 2012

Décidément,
Je n'arrive meme pas a adapter le code que tu m'a donné, voila le code que j'utilisait(marche pas ) avant de poster le message sur le forum :
Public Class Form1

    Public Delegate Sub _Affiche_ASCII(ByVal donnee As String)
    Private m_CommPort As New Rs232()


    Public Sub Affiche_ASCII(ByVal donnee As String)
        RichTextBox2.AppendText(donnee)
    End Sub
    Private Sub WriteMessage(ByVal message As String)
        RichTextBox1.Text += message + vbCrLf
    End Sub
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Dim nb_octet As Integer = SerialPort1.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

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

        
        If Me.InvokeRequired = True Then
            Me.Invoke(New _Affiche_ASCII(AddressOf Affiche_ASCII), donnee)
        End If

    End Sub


    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        End
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Try
            ComboBox1.Text = SerialPort1.BaudRate
            ComboBox1.Enabled = False

            SerialPort1.Open()

        Catch ex As Exception
            MsgBox("Impossible d'ouvrir le port ")
        End Try
        
    End Sub



    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ' Try

        ComboBox1.Enabled = True
        If SerialPort1 IsNot Nothing Then
            SerialPort1.Close()
            SerialPort1.Dispose()
            RichTextBox2.Text = ""
        End If

    End Sub

Merci

salut,
je n'ai pas la possibilité d'utiliser mon port RS232 pour tester mais ca devrait donner ceci.

Public Class Form1

    Public Delegate Sub _Affiche_ASCII(ByVal donnee As String)
    Private m_CommPort As New Rs232()

    Private Sub WriteMessage(ByVal message As String)
        RichTextBox2.Text &= message & vbCrLf
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Dim nb_octet As Integer = SerialPort1.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

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

        Dim t As New Threading.Thread(AddressOf MaSub)
        t.Start(donnee)

    End Sub

    Private Sub MaSub(ByVal Texte As String)
        If Me.InvokeRequired = True Then
            Me.Invoke(New _Affiche_ASCII(AddressOf WriteMessage), donnee)
        Else
            WriteMessage(Texte)
        End If
    End Sub

Excuse moi mais j'avais pas vu que tu as utilisé un composant qui dépend de Form1 c'est SerialPort1 qu'il faut passer en parametre au thread dès que des données sont présentes et y lire dessus apres :
Public Class Form1

    Public Delegate Sub _Affiche_ASCII(ByVal donnee As String)

    Private Sub WriteMessage(ByVal message As String)
        RichTextBox2.Text += message + vbCrLf
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim sp As System.IO.Ports.SerialPort = DirectCast(sender, System.IO.Ports.SerialPort)
        Dim t As New Threading.Thread(AddressOf MaSub)
        t.Start(sp)
    End Sub

    Private Sub MaSub(ByVal MonPort As System.IO.Ports.SerialPort)
        Dim nb_octet As Integer = MonPort.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

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

        If Me.InvokeRequired = True Then
            Me.Invoke(New _Affiche_ASCII(AddressOf WriteMessage), donnee)
        Else
            WriteMessage(donnee)
        End If
    End Sub
End Class
Messages postés
60
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 avril 2012

Je te remercie infiniment pour ton aide, tout marche super bien.Ce forum est génial.
merci.