IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Lecture données port série


Sujet :

VB.NET

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Bon....

    Ce n'est pas de la magie, mais de l'ignorance...

    J'ai placé le sleep du thread à 1s (1000ms) et là plus de "clignotage"

    Donc, j'ai bien 143 dans la textbox2 et 255 ds la textbox3

    J'ai testé en faisant varier les valeurs du côté du µC, le test est concluant

    J'ai ajusté le sleep sur 500ms et ai donné 6 comme valeur d'octets lus...???!!
    Je rêve... la variable dans laquelle je place la valeur de la résistance ajustable est bien sur 8 bits, donc 1 octet, non?
    Donc 2 variables = 2 octets, non?
    L'envoi se fait bien en "byte".... là y un couak...
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
        Private Delegate Sub box2(ByVal resultat1 As Byte)
        Private Delegate Sub box3(ByVal resultat1 As Byte)
        Private _continue As Boolean
     
        Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            With SerialPort1
                .PortName = "COM3"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
            End With
            If SerialPort1.IsOpen Then
                SerialPort1.Close()
            End If
     
            Dim readThread As Thread = New Thread(AddressOf Read)
     
            SerialPort1.ReadTimeout = 1000
            SerialPort1.Open()
            _continue = True
            readThread.Start()
     
        End Sub
        Public Sub Read()
            While (_continue)
                Try
                    System.Threading.Thread.Sleep(500)
                    Dim octet_recu As Byte = 6 ' SerialPort1.ReadByte
                    Dim tab(octet_recu - 1) As Byte ' Tableau acceuillant les données au format byte
                    SerialPort1.Read(tab, 0, octet_recu) 'on lit le port
     
                    Dim resultat1 As Byte
                    Dim resultat2 As Byte
     
                    resultat1 = tab(0)
                    resultat2 = tab(1)
     
                    If Me.InvokeRequired Then
                        Me.Invoke(New box2(AddressOf _box2), resultat1)
                        Me.Invoke(New box3(AddressOf _box3), resultat2)
     
                    Else : _continue = False
     
                        SerialPort1.Close()
     
                    End If
     
                Catch ex As TimeoutException
                    MsgBox("Erreur", 64, "Erreur")
                    _continue = False
                    SerialPort1.Close()
                End Try
            End While
     
        End Sub
        Public Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If e.Cancel = True Then
                Me.Close()
            End If
        End Sub
        Private Sub _box2(ByVal resultat1 As Byte)
            TextBox2.Text = resultat1 'affichage de resultat1 ds textbox2
        End Sub
        Private Sub _box3(ByVal resultat2 As Byte)
            TextBox3.Text = resultat2
        End Sub
    End Class
    Alors, si l'on pouvait éclairer ma lanterne sur le sleep du thread...
    En tous les cas merci à hunteshiva, matll et Mat.M
    Lio

  2. #22
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 151
    Par défaut
    Euh au cas où pour ne pas qu'il y ait de confusion :
    byte = octet donc 8 bits

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Nous sommes d'accord... donc variable pouvant prendre 256 valeurs....
    Donc le tableau devrait se remplir de 2 variables donc 2 octets.. Pourquoi suis-je donc obligé de mettre 6 octets à lire?

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Bonjour à tous,

    Je n'ai pas mis résolu, car j'ai un soucis que je n'arrive vraiment pas à résoudre, je bidouille et fait quelques essais...

    Je m'explique avant de placer le code...

    - Je dois recevoir du port com 9 octets
    - qui sont placés dans un tableau
    - j'effectue une opération de tri afin de les placer dans 3 textbox différentes

    Cela fonctionne.... "Bon, alors, tout va bien????"

    Non, je passe maintenant en revue toutes les erreurs possibles....

    1. mon interface n'est pas alimentée, donc elle n'envoie pas de données
    2. Les données envoyées ne sont pas de 9 octets mais 6 octets par exemple
    3. Ou alors les données envoyées peuvent être du "n'importe quoi..."

    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
     
        Dim resultat1 As String
        Dim resultat2 As String
        Dim resultat3 As String
     
        Private Delegate Sub box1(ByVal resultat1 As String)
        Private Delegate Sub box2(ByVal resultat2 As String)
        Private Delegate Sub box3(ByVal resultat3 As String)
        Private _continue As Boolean
     
     
        Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            BT_Init.Enabled = False
            With SerialPort1
                .PortName = "COM3"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
            End With
     
            Dim readThread As Thread = New Thread(AddressOf Read)
     
     
            SerialPort1.ReadTimeout = 1000
            SerialPort1.Open()
            _continue = True
            readThread.Start()
        End Sub
        Public Sub Read()
     
            While (_continue)
     
                Try
     
                    System.Threading.Thread.Sleep(300)
                    Dim octet_recu As Byte = 9 'SerialPort1.ReadByte
                    Dim tab(octet_recu - 1) As Byte ' Tableau acceuillant les données au format byte
     
                    SerialPort1.Read(tab, 0, octet_recu) 'lecture du port
     
                  'traitement des données
     
                Catch ex As IndexOutOfRangeException
                    MsgBox("Les mesures transmises par l'interface ne sont pas correctes", 64, "Données incorrectes")
                    _continue = False
                    SerialPort1.Close()
                Catch ex As TimeoutException
                    MsgBox("Aucunes données ne sont transmises", 64, "Erreur")
                    resultat1 = "Aucune données"
                    resultat2 = "Aucune données"
                    resultat3 = "Aucune données"
                    If MsgBoxResult.Ok Then
                        _continue = False
                        SerialPort1.Close()
                        erreur()
                    End If
                Catch ex As ThreadAbortException
                    _continue = False
                    SerialPort1.Close()
                Catch e As InvalidOperationException
                    SerialPort1.Close()
                    _continue = False
                    System.Threading.Thread.CurrentThread.Abort()
                    Me.Close()
                End Try
     
                If Me.InvokeRequired Then
                    Me.Invoke(New box3(AddressOf _box2), resultat3)
                    Me.Invoke(New box2(AddressOf _box3), resultat2)
                    Me.Invoke(New box1(AddressOf _box1), resultat1)
     
                Else : _continue = False
                    SerialPort1.Close()
                End If
            End While
     
        End Sub
     
        Public Sub erreur()
     
            BT_Init.Enabled = True 'l'erreur est ici, le message est :
    'Opération inter-threads non valide : le contrôle 'BT_Init' 
    'a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    end sub
     
     
        Private Sub _box2(ByVal resultat2 As String)
            TextBox2.Text = resultat2
        End Sub
        Private Sub _box3(ByVal resultat3 As String)
            TextBox3.Text = resultat3
        End Sub
        Private Sub _box1(ByVal resultat1 As String)
            TextBox1.Text = resultat1
        End Sub
    End Class
    J'arrive à détecter ces erreurs, mais n'arrive pas à ... et c'est là mon soucis, je n'arrive même pas à le formuler correctement....

    Alors je vous écrits ce qui se passe :

    1. Je débranche l'alim de mon interface
    2. j'exécute le programme
    3. Une msgbox apparaît qui me dit "Aucune donnée n'est transmise"
    4. Je clique sur "OK"
    5. et là c'est le bug :
    "Opération inter-threads non valide : le contrôle 'BT_Init' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

    Qu'est ce que ce bouton?
    - au début il n'est pas accessible
    - si erreur, il devrait devenir accessible afin de réinitialiser le tout, c'est à dire reconnecter le port et relancer la lecture (donc le thread)

    Le problème, ma question?
    Je ne comprends pas pourquoi il se passe une "opération inter-thread", alors que je quitte le thread (variable (_continue false) pour appeler une procédure (sub) "erreur"
    Évidemment, je n'arrive pas à faire un "readthread.stop()" dans le thread read...

    Auriez vous une explication? Une piste? Une solution?
    Car, là je ne sais pas vers quels autres tests me diriger...

    Merci à tous

    Cordialement
    Lio

  5. #25
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    Salut Lio,

    tu aurrais pu faire un nouveau post pour ton probléme...
    *le probléme ne viens plus d'une lecture de port serie mais d'un thread qui te plante*

    personnelement je ne suis pas trés calé sur se sujet...
    mais si tu mettait un aperçu de la ligne qui plante avec une capture du message d'erreur,
    ça aiderais

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    salut hunteshiva,

    Effectivement, tu as raison, cela n'a rien à voir avec le port com mais bien avec le thread...
    La ligne qui plante est dans le code en commentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Public Sub erreur()
     
            BT_Init.Enabled = True 'l'erreur est ici, le message est :
    'Opération inter-threads non valide : le contrôle 'BT_Init' 
    'a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    end sub
    en résumé :
    lorsqu'il n'y aucune donnée ou pas toutes les données un catch prend le relais....
    D'abord pour que je comprenne bien :
    - la form se charge
    - appelle un thread (readthread)
    - le thread fait son boulot
    - rencontre une exception
    - prend bien l'exception en compte

    et c'est là le problème...

    je pensais devoir :
    - arrêter le thread
    - pouvoir mettre le bouton "Initialisation" à true

    Mais non, le thread s'arrête et plus rien ne se passe....

    Code avec lequel tout s'arrête et plus rien ne se passe, pas d'erreur, ma form reste afficher, mais je peux la quitter correctement....
    donc msgbox "erreur" s'affiche, puis msgbox "coucou", puis msgbox "coucou1", puis plus rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
     
        Dim resultat1 As String
        Dim resultat2 As String
        Dim resultat3 As String
     
        Private Delegate Sub box1(ByVal resultat1 As String)
        Private Delegate Sub box2(ByVal resultat2 As String)
        Private Delegate Sub box3(ByVal resultat3 As String)
        Private _continue As Boolean
     
        Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            BT_Init.Enabled = False
            With SerialPort1
                .PortName = "COM3"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
            End With
     
            Dim readThread As Thread = New Thread(AddressOf Read)
     
            SerialPort1.ReadTimeout = 1000
            SerialPort1.Open()
            _continue = True
     
            readThread.Start()
            If _continue = False Then
                MsgBox("coucou2", 64, "coucou2")
            End If
     
     
        End Sub
        Public Sub Read()
     
            While (_continue)
     
                Try
     
                    System.Threading.Thread.Sleep(300)
                    Dim octet_recu As Byte = 9 'SerialPort1.ReadByte
                    Dim tab(octet_recu - 1) As Byte ' Tableau acceuillant les données au format byte
     
                    SerialPort1.Read(tab, 0, octet_recu) 'lecture du port
     
                   'traitement du tableau de données
     
                Catch ex As IndexOutOfRangeException
                    MsgBox("Les mesures transmises par l'interface ne sont pas correctes", 64, "Données incorrectes")
                    _continue = False
                    SerialPort1.Close()
                Catch ex As TimeoutException
     
                    MsgBox("Aucunes données ne sont transmises", 64, "Erreur")
                    resultat1 = "aucune mesure"
                    resultat2 = "Aucune mesure"
                    resultat3 = "Aucune mesure"
                    If MsgBoxResult.Ok Then
                        _continue = False
                        SerialPort1.Close()
                        Call initialisation()
                    End If
                Catch ex As ThreadAbortException
                    _continue = False
                    SerialPort1.Close()
                Catch e As InvalidOperationException
                    SerialPort1.Close()
                    _continue = False
                    System.Threading.Thread.CurrentThread.Abort()
                    Me.Close()
                End Try
     
                If Me.InvokeRequired Then
                    Me.Invoke(New box3(AddressOf _box2), resultat3)
                    Me.Invoke(New box2(AddressOf _box3), resultat2)
                    Me.Invoke(New box1(AddressOf _box1), resultat1)
     
                Else : _continue = False
                    SerialPort1.Close()
                End If
            End While
     
        End Sub
     
        Public Sub initialisation()
     
            MsgBox("coucou", 64, "coucou")
     
            If _continue = False Then
                MsgBox("coucou1", 64, "coucou1")
                System.Threading.Thread.CurrentThread.Abort()
                BT_Init.Enabled = True
            End If
        End Sub
     
        Private Sub FrmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
     
            Dim msgbox_ferm As DialogResult
     
            msgbox_ferm = MessageBox.Show("Souhaitez-vous quitter cette apllication?", "Quitter", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
     
            If msgbox_ferm = Windows.Forms.DialogResult.No Then
     
                e.Cancel = True
     
            End If
            If msgbox_ferm = Windows.Forms.DialogResult.Yes Then
                SerialPort1.Close()
                _continue = False
                System.Threading.Thread.CurrentThread.Abort()
                Exit Sub
            End If
     
        End Sub
        Private Sub _box2(ByVal resultat2 As String)
            TextBox2.Text = resultat2
        End Sub
        Private Sub _box3(ByVal resultat3 As String)
            TextBox3.Text = resultat3
        End Sub
        Private Sub _box1(ByVal resultat1 As String)
            TextBox1.Text = resultat1
        End Sub
    End Class
    si je supprime "System.Threading.Thread.CurrentThread.Abort()" dans la procédure "Initialisation", là j'ai une erreur :
    à la ligne "BT_Init.Enable=true"
    qui dit :
    L'exception InvalidOperationException n'a pas été gérée
    Opération inter-threads non valide : le contrôle 'BT_Init' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Public Sub initialisation()
     
            MsgBox("coucou", 64, "coucou")
     
            If _continue = False Then
                MsgBox("coucou1", 64, "coucou1")
                'System.Threading.Thread.CurrentThread.Abort()'Suppression de l'arrêt du thread
                BT_Init.Enabled = True 'l'erreur est ICI
            End If
        End Sub
    Donc, si je comprends bien, il faudrait pouvoir :
    - arrêter et sortie du "thread"
    - réinitialiser la "Form1_load"
    - rendre le bouton Initialisation Valide afin de relancer le thread de lecture

    Merci de vous occuper de mon cas....

    Si vous pensez qu'il est important de changer de post, je le ferai...
    Lio

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Je passe ce problème sur un autre post...

    Cordialement

    Lio

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. lecture du port série
    Par joooooo dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/04/2007, 00h18
  2. Pb lecture sur port série sous XP SP2
    Par ViveLesQuads dans le forum Delphi
    Réponses: 7
    Dernier message: 09/06/2006, 17h12
  3. Réponses: 13
    Dernier message: 24/05/2006, 10h27
  4. Recevoir données port série
    Par Vodkha dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/09/2005, 11h45
  5. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo