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 Port Serie - Arduino


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 98
    Points : 41
    Points
    41
    Par défaut Lecture Port Serie - Arduino
    Bonjour, j'ai un problème au niveau de la lecture de "string" depuis mon arduino nano, en passant par le port serie COM6. Voici sur un terminal (CoolTerm) ce que mon Arduino envoie :
    Nom : XbIFt7G.png
Affichages : 1386
Taille : 96,1 Ko
    voici mon 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
    Public Class Form1
        Dim InstantMoment1 As String = String.Empty
        Dim InstantMoment2 As String = String.Empty
        Dim returnStr As String = String.Empty
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            GetStatus()
        End Sub
     
        Private Sub ParametresToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ParametresToolStripMenuItem.Click
            Form2.Show()
        End Sub
     
        Private Sub ConnectionToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ConnectionToolStripMenuItem.Click
            Try
                SerialPort1.Open()
                InstantMoment1 = Format(Now, "hh:mm:ss")
                RichTextBox1.AppendText("--- Connecté au port " & SerialPort1.PortName & " à " & InstantMoment1 & ". ---" & vbNewLine)
     
            Catch
                If Err.Description.ToString.Contains("existe pas") Then
                    RichTextBox1.AppendText("--- Le port " & SerialPort1.PortName & " n'es pas disponible. ---" & vbNewLine)
                Else
                    RichTextBox1.AppendText("--- " & Err.Description.ToString & " ---" & vbNewLine)
                End If
            End Try
            GetStatus()
        End Sub
        Function GetStatus()
            If SerialPort1.IsOpen = True Then
                ToolStripStatusLabel2.Text = "Connecté."
            Else
                ToolStripStatusLabel2.Text = "IDLE."
            End If
            Return Nothing
        End Function
     
        Private Sub DeconnexionToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DeconnexionToolStripMenuItem.Click
            SerialPort1.Close()
            InstantMoment2 = Format(Now, "hh:mm:ss")
            RichTextBox1.AppendText("--- Déconnecté du port " & SerialPort1.PortName & " à " & InstantMoment2 & ". ---" & vbNewLine)
     
            GetStatus()
        End Sub
     
        Private Sub ClearToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ClearToolStripMenuItem.Click
            RichTextBox1.Clear()
        End Sub
     
     
        Private Sub DebugModeToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DebugModeToolStripMenuItem.Click
     
        End Sub
    End Class
    Voila, je ne sais pas comment afficher les 2 phrases dans ma richtextbox (terminal).
    Merci de votre aide.

    Cordialement,
    Juaaah.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faut t'abonner à l'evènement de réception de données sur le serialport puis y lire les données pour le mettre dans le textbox (un richttextbox n'est utile que pour du formatage de texte)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 98
    Points : 41
    Points
    41
    Par défaut
    Je n'es pas très bien compris votre réponse, le mot "abonner" m'as perturbé, est-il possible de m'éclairer ? En tout cas, merci Pol63 d'avoir toujours répondu a mes problèmes, personne très compétente

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faudrait voir où est déclaré ton serialport
    s'il est déclaré avec withevents tu le verras apparaitre dans le combobox en haut à gauche du code
    une fois sélectionné tu vois les évènements possibles dans le combobox de droite
    par contre si ton serialport est déclaré dans une autre classe tu ne le verras pas

    par contre s'il est publique tu peux faire l'abonnement manuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addhandler instance.evenement, addressof lasubàappeler
    ce qui équivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private lasubàappeler (...) handles instance.evenement
    il y a déjà des handles dans ton code sur certaines sub
    le handles est possible si la variable est déclarée withevents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private withevents variable as new button
    quand on pose un controle sur un form dans visual studio ce n'est en fait que du code vb.net qui est généré et exécuté, et donc par défaut le withevents y est

    ceci c'est s'abonner à un évènement
    quand l'instance lève l'évènement, toutes les sub attachées sont appelées

    et donc il doit y avoir un évènement DataReceived sur le SerialPort
    par contre je sens bien qu'il va être levé sur un autre thread, auquel cas tu reviens ici pour avoir les explications (rien n'empeche de chercher sur google aussi)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 98
    Points : 41
    Points
    41
    Par défaut
    Ah d'accord je viens de comprendre "l'abonnement", alors effectivement il était déclaré, enfin je veut dire par là qu'il était disponible dans la combobox en haut a gauche, j'ai fait apparaitre le datareceived, mais maintenant je suis complètement désorienté, que-faire ? Désolé de vous déranger par mes problèmes

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour,
    La solution du serialport a été déjà évoquée dans le forum .
    C'est d'utiliser plus simplement l'événement DataReceived du serialport et BeginInvoke dans le thread du serialport comme dit dans la doc msdn .
    un exemple 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
     
    Imports System
    Imports System.IO.Ports
    Public Class frmDataReceveid
        Private Delegate Sub SetLabelDelegate(ByVal text As String)
        Private objDelegate As SetLabelDelegate
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            objDelegate = New SetLabelDelegate(AddressOf setLabel)
     
            SerialPortCOM1.BaudRate = 9600
            SerialPortCOM1.Parity = Parity.None
            SerialPortCOM1.StopBits = StopBits.One
            SerialPortCOM1.DataBits = 8
            SerialPortCOM1.Handshake = Handshake.None
            SerialPortCOM1.Open()
        End Sub
        'Il faut passer par Control.BeginInvoke car le thread du serial port
        'n'est pas le meme que celui de l'interface(thread principal)
        Private Sub SerialPortCOM1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPortCOM1.DataReceived
            Dim sp As SerialPort = CType(sender, SerialPort)
            sp.Write("!11,f" & ControlChars.CrLf)
            's'il y a des data à lire 
            If sp.BytesToRead > 0 Then
                Dim InData As String = sp.ReadExisting()
     
                Me.BeginInvoke(objDelegate, New Object() {InData})
                'ou delai d'attente depasse 
            ElseIf sp.ReadTimeout > 1000 Then
                Dim InData As String = "pas de donnees...."
                Me.BeginInvoke(objDelegate, New Object() {InData})
            End If
        End Sub
        Private Sub setLabel(ByVal text As String)
            Me.Label13.Text = text.Substring(4)
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            SerialPortCOM1.Close()
        End Sub
    End Class
    MABROUKI 2011
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 98
    Points : 41
    Points
    41
    Par défaut
    Avant de lire votre réponse, j'ai un peu cherché sur google et dans les cours et tutoriels pour apprendre Arduino, et j'en suis venu a écrire ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim InputData As String
            InputData = SerialPort1.ReadExisting
            MsgBox(InputData)
        End Sub
    Il m'affiche bel et bien "Hello" (oui car j'ai changé le code implanté dans l'arduino, pour qu'il nous envoie qu'un seul mot).
    Mon code est-il trop simple ? J'en es l'impression, je crois que sa a été trop facile là, j'ai du louper un truc.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Oui...
    Alors le system.io.serialport s'execute sur un autre thread, je ne sais pas si je te parle correctement (tout dépend de ton niveau en .net)

    Mais je ne me fout pas de toi car, concernant le comport quand j'ai passé du vb6 au vb.net tout le monde rigolait...

    Je te mets un bout de code, tu me diras ce que tu comprends et tu testeras car j'ai pas de commport sous la main pour tester ici (mais ne modifie pas ton Arduino) :

    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
     
    Public Class Form1
        Private ReadBuffer As String = String.Empty
     
        Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            If SerialPort1.IsOpen Then
                Try
                    ReadBuffer = SerialPort1.ReadExisting()
                    Me.Invoke(New EventHandler(AddressOf DoUpdate))
                Catch ex As Exception
                    MessageBox.Show("Erreur : " & ex.Message)
                End Try
            End If
        End Sub
        Public Sub DoUpdate(ByVal sender As Object, ByVal e As System.EventArgs)
            MessageBox.Show(ReadBuffer)
        End Sub
     
    End Class
    A savoir que à chaque fois que tu fais un SerialPort1.ReadExisting il efface le buffer du serialport1
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    avec msgbox ca fonctionne, mais si tu fais me.textbox1.text &= serialport.Readexisting ca va planter car les controles ne sont pas modifiables depuis un autre thread, sinon ton est bon

    le code avec syntaxe un peu plus récente ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim donnees = SerialPort1.ReadExisting
        Me.Invoke(New Action(Of String)(AddressOf DataReceived), donnees)
    End Sub
     
    Private Sub DataReceived(donnees as string)
       Me.Textbox1.Text &= donnees
    End Sub
    invoke (ou begininvoke) permet de "revenir" sur le thread principal


    tu fais quoi de beau avec ton arduino ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 98
    Points : 41
    Points
    41
    Par défaut
    Merci tout les deux de vos réponses, je vais essayer de me concentrer sur les thread car je suis complètement perdu la dedans, si vous avez des liens, ou si vous voulez bien m'expliquer un peu ce que c'est les thread et leur fonctionnement, je suis a votre écoute. Pour ce qui est de mon Arduino Pol63, je ne sais pas trop quoi faire encore avec, la je veut juste commencer a me familiariser avec les port serie en vb. Puis si tu as une idée de projet qui pourrait me faire prendre de l'expérience dans les thread et qui fait intervenir mon Arduino, je suis preneur aussi Voila j''espère ne pas trop vous en demander et si c'est le cas dites le moi surtout, et bonne soirée

    Cordialement,
    Juaaah.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu n'as pas vraiment à te préoccuper des threads pour l'instant, juste savoir ce que c'est
    ce n'est pas forcément utile au début, enfin il y a d'autres bases à connaitre avant, et avec le code qu'on t'as mis ca peut te suffire pour que ca marche

    en fait quand tu mets un point d'arret sur une ligne et que tu fais du pas à pas, tu vois une ligne jaune qui passe de ligne en ligne pour exécuter le code
    ceci est un thread, le thread par défaut de l'application
    quand tu as plusieurs threads, c'est comme si tu avais plusieurs lignes jaunes qui exécute chacun du code en même temps, à des endroits différents (ou pas ^^)
    avec plusieurs threads l'application peut gagner du temps car ca sera dispatché sur les différents coeurs du processeur
    c'est aussi utile quand on a quelque chose de bloquant qui attend, si on attend sur le thread principal l'interface freeze
    c'est le cas ici du serialport, quand tu l'utilises il créé un thread pour attendre les données, mais ca ne bloque pas ton thread principal

    le thread principal est utilisé à la fois pour ton code et pour le rafraichissement de l'application
    pour cette raison il ne faut généralement pas faire quelque chose qui dure plusieurs centaines de millisecondes sur le thread principal, car si on en fait plein ca ralenti l'interface
    de plus les controles ne peuvent être modifiés que par le thread principal, c'est pour ca qu'il y a un mécanisme qui permet de repasser sur ce thread (.invoke)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 98
    Points : 41
    Points
    41
    Par défaut
    Discussion terminée sur Skype, sujet résolus !

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

Discussions similaires

  1. Lecture port serie
    Par asp2014 dans le forum C#
    Réponses: 5
    Dernier message: 18/07/2014, 07h41
  2. Lecture port serie
    Par benaye dans le forum Général Java
    Réponses: 1
    Dernier message: 27/05/2011, 17h46
  3. Lecture port serie / Synchro web
    Par Marcus1981 dans le forum Langage
    Réponses: 3
    Dernier message: 28/04/2011, 16h20
  4. Acces et lecture Port serie avec Windows Seven
    Par Naklov dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/12/2009, 19h40
  5. lecture port serie tcomport
    Par STEPH42160 dans le forum C++Builder
    Réponses: 30
    Dernier message: 22/02/2007, 00h19

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