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. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut Lecture données port série
    Bonsoir ou jour à tous,

    J'ai un microcontrôleur connecté au port série qui m'envoie, pour ce test, 6 octets 143 et 255
    Je souhaite récupérer 143 dans une textbox1 et 255 dans une textbox2

    Pour l'instant je reçois le tout dans une seule textbox.... J'ai essayé avec une boucle comme pour la lecture d'un fichier mais rien n'y fait, je me casse la tête et les dents..

    Voici le code qui fonctionne :
    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
     
    Private Sub port_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
            Timer_Test.Start()
            Dim recup As Integer = 6
            Dim tab(recup - 1) As Byte
            SerialPort.Read(tab, 0, recup)
            For i As Byte = 0 To 2 'récupération des 3 premiers octets
                Dim affich As Integer = tab(i)
                TxtBox_test.Text += Chr(affich)
            Next
     
     
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If e.Cancel = True Then
                Timer_Test.Stop()
                Me.Close()
            End If
        End Sub
     
    End Class
    Le résultat est 143255143255143255143255 (les 6 octets remplissent la textbox_test)
    Comment pourrais-je faire pour prendre les 3 premiers, puis les 3 suivants...
    Chaque case du tableau est remplacée par une nouvelle valeur, il y aurait donc un glissement?
    Dans ce cas, cette méthode n'est pas bonne...
    Quelqu'un aurait-il une piste?
    Merci à vous
    Cordialement
    Lio

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 551
    Points
    20 551
    Par défaut
    Salut j'arrive vraiment pas à comprendre pourquoi tu fais démarrer le timer dans la méthode port_DataReceived
    Il faut faire démarrer le timer dans la méthode form_load bref lorsque la "form" est affichée ou bien si tu cliques sur un bouton "démarrage lecture"
    Et puis utiliser un Timer c'est pas l'idéal tu risques d'être asynchrone..
    il vaut mieux utiliser un worker thread avec des events

    Regarder cet exemple du MSDN
    http://msdn.microsoft.com/en-us/libr...port.open.aspx
    Ensuite la classe SerialPort possède plusieurs méthodes soit pour lire des bytes soit pour lire des char soit de lignes..

    Citation Envoyé par lio59 Voir le message
    Le résultat est 143255143255143255143255 (les 6 octets remplissent la textbox_test)
    Comment pourrais-je faire pour prendre les 3 premiers, puis les 3 suivants...
    Chaque case du tableau est remplacée par une nouvelle valeur, il y aurait donc un glissement?
    ce qui arrive c'est que la lecture des données du port série se passe de manière asynchrone...
    il faut prendre l'exemple du MSDN et l'adapter.
    Donc démarrer un thread de lecture avec un booléen continue puis dans une boucle while lire les données et traiter les données..
    il faut créer une méthode read qui va être exécutée par le thread..
    dans cette méthode read on lit le port série.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci Mat.M pour ces pistes...
    Oui, je démarre un timer dans data_receiver car j'ai bien un bouton de connexion... mais vous avez raison, il n'a pas sa place...
    Avant de poser des questions relatives à votre piste, il faut que j'adapte et essaye....
    Je teste un peu plus tard car je pense que cela va me demander du temps, il faut que je comprenne ce code, la procédure partagée et que je l'adapte à une "form"...
    En tous les cas, merci pour cette piste et reviens pour vous tenir au courant...
    Encore Merci

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Bonsoir,

    Bon, j'ai essayé de comprendre mais quelques petites choses m'échappent...
    Pour faire simple, j'ai fait un nouveau projet avec uniquement une textbox1. Cela veut dire que le démarrage du thread et la lecture se font dès le chargement de la fenêtre (form)
    Mais rien n'apparaît dans la textbox1...
    Voici 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
     
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
     
        Private _continue As Boolean 'déclaration du booléen "continue"
        Dim WithEvents Port As SerialPort = New SerialPort("COM3", 9600, Parity.None, 8, StopBits.One) 'paramétrage du port
        Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
     
            Dim readThread As Thread = New Thread(AddressOf Read)'déclaration du thread de lecture
     
            SerialPort1.ReadTimeout = 1000
            SerialPort1.Open()'ouverture du port
            _continue = True 'booléen à 1
            readThread.Start() 'démarrage du thread de lecture
     
        End Sub
        Public Sub Read()
            While (_continue) 'tant que " _continue" est vrai
                Try
                    Dim octet_recu As Integer = SerialPort1.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
                    Dim tab(octet_recu - 1) As Byte ' Tableau accueillant les données au format byte
                    SerialPort1.Read(tab, 0, octet_recu) 'lecture du port
                    Dim affich As String = System.Text.Encoding.ASCII.GetString(tab)
     
                    TextBox1.Text = affich 'affichage
                Catch ex As TimeoutException
                    MsgBox("Erreur", 64, "Erreur")
                    _continue = False
                    SerialPort1.Close()
                End Try
            End While
        End Sub
    End Class
    J'ai recommencé et ai pas mal "bidouillé", mais en vain...
    Je n'avais jamais utilisé de thread et ai fait quelques recherches
    L'adaptation me semble "rock'n roll"
    Il faut bien mettre un "Public sub read()" qui fait référence à "Read" de "Dim readThread As Thread = New Thread(AddressOf Read)"?
    Comment se fait la lecture ?
    Il faut bien mettre chaque octet dans un tableau, non?
    Bref, je n'y comprends plus rien et tourne en rond... Je ne sais plus quoi modifier et comment...
    Si vous voulez bien m'aider....
    Merci à vous...
    Cordialement
    Lio

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    Points : 254
    Points
    254
    Par défaut
    Bonjour,

    As-tu essayé de rajouter un caractère à ton affich pour savoir si tu entrais bien dans ton thread ? ou en ajoutant un point d’arrêt à ta ligne 24 (du code donné) par exemple.
    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox1.Text = "#" & affich 'affichage
    Es-tu sûr de bien recevoir tes données ? Si tu essayes sans Thread, est-ce que ça fonctionne ?

    Sinon une autre piste qui pourrait éviter d'avoir une boucle quasi infinie (que je n'ai pas testée, pas de port série sous la main), pourquoi ne pas utiliser l'évenement DataReceived ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Port.DataReceived, AddressOf Read
    Il reste à trouver la signature correcte pour Read.

    Je ne sais pas si ce que je dis est une grosse connerie ou pas, mais au cas où ça puisse aider.

    @+
    Mat

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci de l'intérêt que vous portez à mon (mes) soucis....
    Effectivement rien ne s'affiche même avec un "#"

    Bon, je veux bien mettre en oeuvre un "thread"... Est-il nécessaire pour récupérer une suite de données et les traiter?
    La méthode de lecture doit être synchrone?
    Il est bien nécessaire d'utiliser un tableau pour y placer les octets lus?
    Une case de ce tableau peut -elle accueillir une valeur et lorsque le buffer est plein recommencer à l'offset 0 et écraser la précédente valeur?
    N'est-il pas possible de définir un tableau de 6 octets et de prendre les 3 premiers et les placer dans la textbox1 et les 3 suivants ds la textbox2?

    Je veux bien suivre la méthode données par Mat.M mais j'ai de gros soucis et plus rien ne fonctionne.....

    Merci
    Lio

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    En fait, je viens de reprendre le programme de départ avec 2 modifications :
    - form1 avec 1 textbox
    - remplacement du timer par un thread avec une variable booléenne

    J'ai quelques choses qui s'affiche dans la textbox1 : 14325514325514325514
    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
     
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
        Private Delegate Sub Affich(ByVal donnees As String)
        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
                    Dim octet_recu As Integer = 6
                    Dim tab(octet_recu) As Byte ' Tableau acceuillant les données au format byte
                    SerialPort1.Read(tab, 0, octet_recu) 'on lit le port
                    Dim donnees As String = System.Text.Encoding.ASCII.GetString(tab)
                    If Me.InvokeRequired Then
                        Me.Invoke(New Affich(AddressOf _Affich), donnees)
                    End If
                Catch ex As TimeoutException
                    MsgBox("Erreur", 64, "Erreur")
                    _continue = False
                    SerialPort1.Close()
                End Try
            End While
        End Sub
        Private 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 _Affich(ByVal donnees As String)
            TextBox1.AppendText(donnees) 'On affiche les données à l'écran
        End Sub
    End Class
    Donc en gros comme avec le timer, non? Dans ce cas quelle est la différence?
    Comment peut-on traiter l'info de la textbox1 afin de découper et placer dans textbox 2 et textbox3?
    Est-ce bien possible?
    Merci de votre patience
    Lio

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    Points : 254
    Points
    254
    Par défaut
    La différence avec un timer (sauf erreur de ma part), c'est qu'avec le thread, le traitement est traité en 'parallèle' alors qu'avec le timer, le temps d'exécution de ta routine, cela bloquera le reste de ton application.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Effectivement, c'est ce que j'avais compris... Mais maintenant me reste à faire ce satané tri...
    Comment affecter les 3 premiers octets ds une textbox
    et les 3 suivants dans une autre textbox etc...
    Si quelqu'un a une piste?
    Merci
    Lio

  10. #10
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour,

    peut tu nous monter la forme des données reçues?

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    La textbox1 se remplit en fonction de la taille de cette dernière...
    à l'écran 14325514325514325514
    J'utilise un tableau pour récupérer les données, mais ne sais pas le gérer correctement...
    Quelle serait l'idée?
    1. Mettre toutes les données (les 6 octets) dans un tableau?
    2. Puis lire le tableau en modifiant l'offset et le nombre d'octets à lire? avec un "for" "next"
    3. Placer ces 3 octets dans la textbox2
    4. Refaire l'opération 2 et 3 pour les 3 octets suivants?

    merci
    Lio

  12. #12
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    ce qui t'interesse c'est de séparer les données si je comprend bien,
    les mettre sous forme héxadéciamles ne résouderais t'il pas ton probléme?

    Tu n'a plus qu'a séparer ta chaine sahcant que 2caractéres font 1 octets.

    j'éspére t'avoir éclairé un peut

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Le problème serait identique... mon µC envoie des caractères, chaque caractère représente un octet.
    Alors que ce soit en héxa ou autre, le problème serait le même, à savoir :

    Comment, justement séparer cette chaîne de 6 caractères qui arrive ds la textbox1?

    Dans cet exemple, cette chaîne devrait être séparée en 2 (2x3)

    Le problème du µC est qu'il envoie en continue ces 6 chiffres... donc je ne peux lire 3 octets, afficher, effacer le buffer, lire les 3 suivants....

    Donc, ma problématique reste tjrs comment récupérer les 3 premières cases d'un tableau, puis les 3 suivantes....

    Merci hunteshiva de vous être penché sur mon problème!

  14. #14
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    j'ai du mal a te suivre,
    en gros tu reçoit une chaine qui évolue en permanance,
    et tu veux afficher que les six premiers caratéres?
    (Si possible avec un espace aprés les 3 premiers caraétéres?)

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    Points : 254
    Points
    254
    Par défaut
    Salut,

    Tu peux peur être découper ta chaine de caractère en stockant un index de départ de la donnée qui va t'interesser comme l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim indexDepart As Integer = 0
    Dim reception as Boolean = true
    While (reception)
        chaine.Substring(indexDepart, 3) 'Ton premier groupe
        indexDepart += 3
        chaine.Substring(indexDepart, 3) 'Ton deuxième groupe
        indexDepart += 3
    End While
    Et ainsi d'une réception à l'autre si tout est concaténé, tu sauras où tu es rendu.

    @+
    Mat

  16. #16
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    Si ta chaine fait 6 caractéres en permanance,
    ceci devra&is fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim maChaine as String = "123456"
    TexteBox1.Text = maChaine.Substring(0,3) & "__" & maChaine.Substring(3,3)
    tu verra dans ta texbox "123__456"
    PS: tu prendra en permance que les 6 premiers caratéres
    et si tu a moins de 6 caractéres, tu plante

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Bon, alors dans l'ordre :

    hunteshiva : oui, c'est bien cela, c'est une chaîne de 6 caractères qui évoluent en permanence. En fait ce sont des variable codées sur 8 bits qui sont envoyées par le µC. Pour le test, j'ai juste envoyé une chaîne de caractère de 6 chiffres... Pour les conversions, je verrai cela plus tard...
    En fait, le soucis qui risque de se poser c'est que mes données sont dans un tableau au format "byte", mais je ne vais pas davantage critiquer car je n'ai pas testé votre solution...Merci à vous!

    matil : j'ai bien lu votre message et vais essayer votre méthode... merci également, c'est très sympa...

    Je teste cela ce soir et vous tiens informé

    Encore merci

    Lio

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Je n'ai pas pu attendre...

    Le résultat n'est pas convainquant dans la textbox2 et 3 j'ai bien 2 groupes différents mais aléatoires....
    14325143251432
    et
    555555
    Bref, je pense que cela provient de la réception... Les données arrivant de manière continue, il doit y avoir un décalage constant dans les cases du tableau...
    Je pense que cela fonctionnait ainsi :
    - 6 octets à lires
    Case 0 -> octet 1 (donc le chiffre "1")
    Case 1 -> octet 2 (donc le chiffre "4")
    .
    .
    .
    Case 5 -> octet 6 (donc le chiffre "5")

    Et qu'il suffit de rechercher 2 groupes de 3 cases...

    Mais bon, je ne comprends pas et ne vois pas comment faire...

    Voici le code actuel....

    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
     
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
        Private Delegate Sub Affich(ByVal donnees As String)
        Private Delegate Sub box2(ByVal resultat1 As String)
        Private Delegate Sub box3(ByVal resultat1 As String)
        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 = 500
            SerialPort1.Open()
            _continue = True
            readThread.Start()
     
        End Sub
        Public Sub Read()
            While (_continue)
                Try
                    Dim octet_recu As Integer = SerialPort1.ReadByte
                    Dim tab(octet_recu) As Byte ' Tableau acceuillant les données au format byte
                    SerialPort1.Read(tab, 0, octet_recu) 'on lit le port
                    Dim donnees As String = System.Text.Encoding.ASCII.GetString(TAB)
                    Dim resultat1 As String
                    Dim resultat2 As String
                    resultat1 = donnees.Substring(0, 3) '3 premiers chiffres
                    resultat2 = donnees.Substring(3, 3) '3 suivants
                    If Me.InvokeRequired Then
                        Me.Invoke(New Affich(AddressOf _Affich), donnees)
                        Me.Invoke(New box2(AddressOf _box2), resultat1)
                        Me.Invoke(New box3(AddressOf _box3), resultat2)
     
                    Else : _continue = False
                    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 _Affich(ByVal donnees As String)
            TextBox1.AppendText(donnees) 'affichage de donnees ds la textbox1
        End Sub
        Private Sub _box2(ByVal resultat1 As String)
            TextBox2.AppendText(resultat1) 'affichage de resultat1 ds textbox2
        End Sub
        Private Sub _box3(ByVal resultat2 As String)
            TextBox3.AppendText(resultat2) 'affichage de resultat2 ds textbox3
        End Sub
    End Class
    Si vous avez d'autres idées ou carrément la solution, j'en serais hyper soulagé...
    Merci
    Lio

  19. #19
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour Lio,

    il faudrait que tu soit sur de ta structure.
    Citation Envoyé par lio59 Voir le message
    Je pense que cela fonctionnait ainsi :
    - 6 octets à lires
    Case 0 -> octet 1 (donc le chiffre "1")
    Case 1 -> octet 2 (donc le chiffre "4")
    .
    .
    .
    Case 5 -> octet 6 (donc le chiffre "5")
    un octet va de 0 à 255,en base 10
    il est donc difficile de pense que 1 octet transmet le chiffre "1", puis le "4" etc.

    Si j'ai bien compris ce que tu veut c'est prendre les 3 premiers Octets à chaque fois.
    essaye de les extraire dans un autre tableau de taille 1*3 de type Byte
    puis convertir les en integer (voir ToInt32() )
    tu pourra les afficher dans ta TextBox

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Bonjour hunteshiva,
    Merci pour votre réponse!
    En fait le µC lit une valeur qu'il place dans une variable d'une valeur de 8 bits donc un octet (un byte). La valeur de cette variable va de 0 à 255. Je demande au µC de m'envoyer 2 variables donc 2 octets
    valeur de l'octet 1 : 143
    valeur de l'octet 2 : 255
    il m'envoie ces 2 valeurs toutes les 200ms

    J'ai bien lu votre lien abordant la méthode bitconverter.toint32. Avant de la mettre en oeuvre, je suis entrain de lire chaque "case" du tableau pour lire son contenu... je progresse, mais cela n'est pas encore concluant...
    Voilà le code :
    J'ai tout déclaré en "byte"...
    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
     
    Imports System.IO.Ports
    Imports System.Threading
    Public Class Form1
        Private Delegate Sub Affich(ByVal donnees As Byte)
        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 = 1500
            SerialPort1.Open()
            _continue = True
            readThread.Start()
     
        End Sub
        Public Sub Read()
            While (_continue)
                Try
                    System.Threading.Thread.Sleep(300)
                    Dim octet_recu As Integer = 2 ' 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)
     
                    For i = 0 To 1
                        tab(i) = Nothing
                    Next
     
                    If Me.InvokeRequired Then
                        'Me.Invoke(New Affich(AddressOf _Affich), donnees)
                        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 _Affich(ByVal donnees As Byte)
        ' TextBox1.Text = donnees 'affichage de donnees ds la textbox1
        'End Sub
        Private Sub _box2(ByVal resultat1 As Byte)
            TextBox2.Text = ""
            TextBox2.Text = resultat1 'affichage de resultat1 ds textbox2
        End Sub
        Private Sub _box3(ByVal resultat2 As Byte)
            TextBox3.Text = ""
            'TextBox3.AppendText(resultat2) 'affichage de resultat2 ds textbox3
            TextBox3.Text = resultat2
        End Sub
    End Class
    Le résultat dans la textbox 2 et 3 est assez bizarre mais cela fonctionne... à moitié...
    En gros les résultats clignotent, une fois l'un puis l'autre
    textbox2 est affiché 143 puis 255, mais pas à la suite, c'est à dire que 255 remplace 143
    textbox3 est affiché 255 puis 0, comme dans la textbox2
    Il doit y avoir un espèce de glissement dans le tableau, là je ne dois pas maîtriser le "concept"!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 01h18
  2. Pb lecture sur port série sous XP SP2
    Par ViveLesQuads dans le forum Delphi
    Réponses: 7
    Dernier message: 09/06/2006, 18h12
  3. Réponses: 13
    Dernier message: 24/05/2006, 11h27
  4. Recevoir données port série
    Par Vodkha dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/09/2005, 12h45
  5. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 14h50

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