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

Windows Forms Discussion :

[VB.NET]Affichage d'un buffer SerialPort


Sujet :

Windows Forms

  1. #1
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut [VB.NET]Affichage d'un buffer SerialPort
    Bonjour!

    Je communique avec une balance via le port série. J'utilise donc l'outils SerialPort (avec Visual Basic Express).

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Sub SerialPortBalance_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPortBalance.DataReceived
            Buffer_Mesure_BALANCE = SerialPortBalance.ReadLine
            Call Traitement_Trames_BALANCE()
        End Sub
    La fonction Traitement_Trames-BALANCE est la suivante (dans un module):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Sub Traitement_Trames_BALANCE()
            Dim MesurePoids As String
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, " ", "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, Chr(10), "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, Chr(13), "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, "g", "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, ".", ",")
            MesurePoids = Buffer_Mesure_BALANCE
            Accueil.Label25.Text = MesurePoids
        End Sub
    A priori, le buffer devrait être placé dans le label25 non?
    Pourtant, là, rien ne s'affiche sur le label25!

    Pourtant:
    Quand je suis en debogage, ça m'indique que la trame a bien été reçue (MesurePoids=104,3)
    Quand je met une msgbox , ça fonctionne également.
    Quand j'ajoute cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Acceuil.Label25.Refresh
    , ça ne change rien !!

    Aidez moi s'il vous plaît!! Je ne trouve pas de tutos complets sur le port série!
    Et là je ne vois vraiment pas comment faire!

    Merci d'avance!

  2. #2
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    Je ne comprends pas vraiment ton problème ?
    Avec le .refresh ça fonctionne non ?
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  3. #3
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Ben non lol !!!
    Rien ne s'affiche!
    J'ai testé avec tous les contrôle (listbox,textbox,label,...) et rien n'y fait!

    Le pire c'est que tout fonctionne !! Le buffer est bien stocké dans le label car j'arrive a faire des calculs avec !!!

    J'ai même essayé avec

  4. #4
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    Je vois deux raisons possibles :
    • La lecture du buffer bloque ton thread, dans ce cas ton application devrait être figée ---> fais un Application.doEvents()
    • Ton buffer est lu plusieurs fois : la première fois il a valeur correcte, puis il li une chaine vide donc ton label est vide au final. pour vérifier çela met une valeur par défaut sur ton label et tu verras si elle disparait.
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  5. #5
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    En fait j'ai déjà fait ça et sans résultat !!

    Ca ça change rien!

    Le label a déjà une valeur par défaut et rien ne se passe !

    N'y aurait-il pas une fonction qui force l'affichage ou une fonction qui permet de bloquer temporairement le thread du port série?

    Ton buffer est lu plusieurs fois : la première fois il a valeur correcte, puis il li une chaine vide donc ton label est vide au final. pour vérifier çela met une valeur par défaut sur ton label et tu verras si elle disparait.
    Quand je suis en débogage, que je met la souris sur la variable MesurePoids (sans cliquer ^^) ça m'affiche la trame que j'attend !!!

    J'ai également tenté de mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Accueil.SerialPort1.Close
    ET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Accueil.SerialPort1.Dispose
    Et rien n'y fait !!

  6. #6
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    Si tu éxécutes le code en pas à pas est ce qu'il passe par la ligne : label.Text = x (x contient la valeur du buffer ??)

    Il y passe une seul fois ?
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  7. #7
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Oui il y passe qu'une seule fois et il contient le buffer.

    J'ai également tenté d'utiliser le contrôle BackgroundWorker et ça ne fonctionne toujours pas!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub SerialPortBalance_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPortBalance.DataReceived
            Buffer_Mesure_BALANCE = SerialPortBalance.ReadLine
            BackgroundWorker1.RunWorkerAsync()
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Call Traitement_Trames_BALANCE()
        End Sub

  8. #8
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    Si tu vois le code passer une seule fois sur label.text = xxxx et que xxx n'est pas dans le label ... Je ne sais pas comment t'aider ?

    tu es sur que tu met bien le texte dans le bon label ?
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  9. #9
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Oui lol !!!
    Ca fait 4h maintenant que j'essaye de trouver une solution!
    A tous les coups c'est une bêtise ! Mais j'en ai aucune idée!!

  10. #10
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    http://www.codeguru.com/Csharp/Cshar...cle.php/c6015/

    C'est la manière que j'utilise pour lire et écrire sur un port RS232.
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  11. #11
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Ouais, je ne suis pas sûr que ma méthode ne soit pas bonne!
    Y'a un truc qui nous échappe je pense !

  12. #12
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    Oui je pense aussi
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  13. #13
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Si c'est comme en C , dans le multitâche, les fonctions d'affichage ne sont pas prioritaires. Existe-t-il une fonction qui permette d'augmenter la priorité des affichage?

  14. #14
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Quelqu'un aurait-il une idée s'il vous plaît ?

  15. #15
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    J'ai réussi a obtenir un message d'erreur (exceptions) qui cerne bien le problème je pense !

    L'exception System.InvalidOperationException n'a pas été gérée
    Message="Opération inter-threads non valide*: le contrôle 'Label25' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."
    Source="System.Windows.Forms"
    StackTrace:
    à System.Windows.Forms.Control.get_Handle()
    à System.Windows.Forms.Control.set_WindowText(String value)
    à System.Windows.Forms.Control.set_Text(String value)
    à System.Windows.Forms.Label.set_Text(String value)
    à Contrôle_de_production.Accueil.SerialPortBalance_DataReceived(Object sender, SerialDataReceivedEventArgs e) dans C:\Documents and Settings\alain remy\Bureau\Contrôle de production\Contrôle de production\Contrôle de production\Form1.vb:ligne 285
    à System.IO.Ports.SerialPort.CatchReceivedEvents(Object src, SerialDataReceivedEventArgs e)
    à System.IO.Ports.SerialStream.EventLoopRunner.CallReceiveEvents(Object state)
    à System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
    à System.Threading.ExecutionContext.runTryCode(Object userData)
    à System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
    à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)

  16. #16
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    A mon avis le problème est que l'écoute du port com se fait à travers un thread différent de ton application (pour éviter que ton application freeze)

    Essai de ne pas faire l'accès à ton label depuis l'eventhandler du port com.
    Passes cette valeur à une méthode de ta form.
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  17. #17
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Ouhla!! Je ne comprend pas grand chose a ce que tu viens de dire, pourtant je suis certain que c'est la bonne voie!!!

    Pourrais-tu expliquer ça comme si tu l'expliquais a un gamin de 8 ans stp ?? lol

    En tout cas, merci beaucoup pour ton aide!!

  18. #18
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Par défaut
    Ton application principale (toto.exe) possède un thread.
    Cet à dire qu'elle peut effectuer une seule opération à la fois.

    Pour que ton code reçoive un event quand un nouveau message arrive sur le port COM, il faut qu'il écoute en continu sur ce port.
    Cet a dire que si le thread était le même pour l'application et pour l'écoute du port tu ne pourrais même plus faire un clic sur un bouton de ton application.

    C'est pour cela que la library que tu utilises pour écouter ton port crée un thread indépendant. tu as donc deux thread (ou plus) qui tourne en parallèle : un pour ton application (interface graphique) et un qui s'occupe uniquement d'attendre un message sur le port com.

    D'après le message l'erreur vient du fait que tu accède ton label depuis un autre thread que celui de l'interface graphique.

    Donc ce que je ferais à ta place c'est juste tenter de ne plus mettre à jour ton label depuis l'event handler du port mais de passer par une méthode de ton application. Autrement dis il faut que ton event handler appel une méthode de ta form en lui passant le message en paramètres.

    Je ne suis pas certain que cela va fonctionner mais ça vaut la peine d'essayer.
    Envie de contribuer à la rubrique SharePoint ? Contactez moi par MP !

    SharePoint : http://sharepoint.developpez.com
    Mon site : http://lefortludovic.developpez.com
    Mon blog : http://www.consultpoint.net/blog

  19. #19
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    D'accord, je crois avoir compris... En fait, ce qu'il faudrait que je fasse, c'est créer un Sub dans un module par exemple.

    Mais comment faire pour lui faire passer un paramètre, et l'appel du sub se fera depuis l'event handler donc est-ce que ça va fonctionner??

    Pourrais-tu me donner un petit exemple de code vite fait stp ?

  20. #20
    Membre éclairé Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Par défaut
    Voilà ce que j'ai tenté de faire (qui ne marche pas!! )


    Code de l'event handler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub SerialPortBalance_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPortBalance.DataReceived
     
            Buffer_Mesure_BALANCE = Me.SerialPortBalance.ReadLine()
     
            Call Traitement_Trames_BALANCE(Buffer_Mesure_BALANCE)
     
        End Sub
    Code du SUB Traitement_Trames_BALANCE (Dans un module):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Sub Traitement_Trames_BALANCE(ByVal Buffer_Mesure_BALANCE As String)
     
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, " ", "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, Chr(10), "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, Chr(13), "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, "g", "")
            Buffer_Mesure_BALANCE = Replace(Buffer_Mesure_BALANCE, ".", ",")
            MesurePoids = Buffer_Mesure_BALANCE
     
            Accueil.RichTextBox1.Text = MesurePoids
            Accueil.RichTextBox1.Refresh()
     
        End Sub
    Accueil c'est mon formulaire (form1)

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

Discussions similaires

  1. [VB.NET] - affichage de webcontrols dynamiquement
    Par karibouxe dans le forum ASP.NET
    Réponses: 6
    Dernier message: 15/06/2005, 11h53
  2. [VB.NET] Affichage conditionnel dans un repeater
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 4
    Dernier message: 07/02/2005, 12h58
  3. [CR.NET] affichage de toute les pages de l'état
    Par HULK dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 19/01/2005, 17h34
  4. Réponses: 2
    Dernier message: 29/11/2004, 12h13
  5. [vb.net] Comment vider un buffer ?
    Par mdc dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/12/2003, 15h43

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