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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 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 confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 535
    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 535
    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 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
    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 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
    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 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
    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 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
    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

+ Répondre à la discussion
Cette discussion est résolue.

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