Erreur sur réception de données Port COM

Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
- - Dernière réponse :  Utilisateur anonyme - 15 févr. 2013 à 00:43
Bonjour à tous.
J'utilise un port RS232 pour recevoir des données d'un banc de test (quelques octets toute les 500ms)
Or à la réception j'ai une erreur.

Partie du Code :

Public Sub DatareceivedTreatment(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CurrentPort.DataReceived
        Dim DataFromBench as String = ""
        DataFromBench = CurrentPort.ReadExisting()
        TB_AllData.Text += DataFromBench

    End Sub


Lors de l'affectation des données à la TextBox "TB_AllData", j'ai une erreur : "Cross-thread operation not valid: Control 'TB_AllData' accessed from a thread other than the thread it was created on."

Je ne comprend pas l'erreur.
J'ai juste besoin de récupérer mes données, qui arrivent de manière asynchrone pour les traiter ensuite et afficher les résultats. C'est assez basique comme traitement.

Quelqu'un peut-il m'éclairer s'il vous plait.

Environnement : VS2008
OS : windows XP Pro
Afficher la suite 

3 réponses

Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
0
Merci
Salut,

sujet évoqué ici
http://www.vbfrance.com/forum/sujet-CROSS-THREAD-OPERATION-NOT-VALID_1560214.aspx

Tu dois utilisé un délégué pour une opération interthread.

@+LIM
Commenter la réponse de cs_lim
0
Merci
Bonjour,

Dans ton cas, et uniquement dans ton cas, le plus simple est de passer ton port en argument au délégué mentionné par lim :

Option Strict On
Public Class Form1

    'délégué avec un serial port en paramètre
    Private Delegate Sub MonDelegue(ByVal UnPort As IO.Ports.SerialPort)

    Public Sub DatareceivedTreatment(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CurrentPort.DataReceived
        'si nécéssité du délégué
        If Me.InvokeRequired Then
            'invocation du délégué avec l'adresse de la sub à exécuter et le port en paramètre (sender)
            Me.Invoke(New MonDelegue(AddressOf MaSubTraitement), sender)
        Else
            'sinon on traite directement sans délégué
            MaSubTraitement(DirectCast(sender, IO.Ports.SerialPort))
        End If
    End Sub

    'sub de traitement des données
    Private Sub MaSubTraitement(ByVal MonPort As IO.Ports.SerialPort)
        TB_AllData.Text &= MonPort.ReadExisting
    End Sub
End Class
Commenter la réponse de Utilisateur anonyme
0
Merci
Un admin (si il tombait sur ce post) pourrait-il supprimer mon message précédent ?
Merci d'avance

Je me rends compte à l'instant qu'on peut faire plus simple en 'castant' l'objet sender :
Option Strict On
Public Class Form1

    'délégué avec un serial port en paramètre
    Private Delegate Sub MonDelegue(ByVal sender As Object, ByVal e As IO.Ports.SerialDataReceivedEventArgs)

    Public Sub DatareceivedTreatment(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CurrentPort.DataReceived
        'si nécéssité du délégué
        If Me.InvokeRequired Then
            'invocation du délégué avec l'adresse de la sub à exécuter et le port en paramètre (sender)
            'et l'argument e
            Me.Invoke(New MonDelegue(AddressOf DatareceivedTreatment), sender, e)
        Else
            'sinon on traite directement sans délégué en récupérant l'objet sender
            TB_AllData.Text &= DirectCast(sender, IO.Ports.SerialPort).ReadExisting
        End If
    End Sub
End Class
Commenter la réponse de Utilisateur anonyme