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 :

timer dans serialport


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut timer dans serialport
    Bonjour,

    j'ai un petit soucis de déclenchement de timer dans un paragraphe serialport_dataReceived.

    Lorsque je veux déclencher mon timer avec timer6.enabled = True, rien ne se passe. J'ai vérifié que le timer se déclenchait avec la même méthode lors du "load" de la form1. J'ai également vérifié qu'un autre timer se déclenchait dans le paragraphe serialport_dataReceived, ce qui est le cas.

    Mais là, je suis à court d'idée. Est-ce que quelqu'un en aurait une à me fournir?

    Merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Montre ton bout de code (instanciation, abonnement, start, stop, désabonnement, dispose) !

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Désolé pour le temps de latence, déménagement et déplacement pro oblige:
    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
       Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As   System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            If SerialPort1.BytesToRead >= 20 Then
                Codebarres = SerialPort1.ReadExisting()
                Timer6.Enabled = False
                Timer6.Stop()
                  If j > 1 Then
                  tempsdepart = Now
                  interval = tempspochette(tempsdepart, tempsfin)
                  Timer6.Interval = interval * coeffpdv
                  Debug.Print("interval calculé " + CStr(interval))
                  Timer6.Enabled = True
                  End If
                tempsfin = Now
            End If
        End Sub
     
        Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick
            Debug.Print("timer6")
            photoauto = True
            Timer4.Enabled = False
            Timer4.Stop()
            Timer6.Enabled = False
            Timer6.Stop()
            ClearDigitalChannel(1)
            SetDigitalChannel(4)
            System.Threading.Thread.Sleep(100)
            ClearDigitalChannel(4)
            System.Threading.Thread.Sleep(200)
            SetDigitalChannel(1)
            System.Threading.Thread.Sleep(200)
            SetDigitalChannel(2)
            System.Threading.Thread.Sleep(100)
        End Sub

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Tu rentres bien dans ton ?

    Sinon Start/Stop équivaut à écrire sur Enabled, pas besoin de faire les 2 opérations.

    Que donne ton intervalle calculé ?

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Bonjour,

    merci de ta réponse.

    Oui, je rentre bien la valeur de j. J'avais vérifié qu'elle était correcte avec un debug.print. J'avais également testé de le supprimer, mais le problème était le même.

    Pour le TimerX.enabled = false et timerX.stop(), effectivement, c'est équivalent, mais j'avais eu un souci une fois où le enabled ne semblait pas marcher. Depuis, je rajoute le stop. Est-ce que cela pourrait être à l'origine de mon problème?

    En ce qui concerne l'intervalle, il est calculé correctement (vu par debug.print). De plus, lorsque je déplace le lancement du timer dans un autre paragraphe, le timer se déclenche correctement avec le bon intervalle.

    Je me demandais également si le nombre de timers utilisés n'était pas supérieur à celui que peut gérer VB. J'ai donc supprimé la majorité d'entre eux, mais je ne peux tester le programme que devant la machine pour laquelle il est destiné (donc cet après-midi).

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    coeffpdv vaut 1000 ?

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Non, il vaut 1 pourquoi? Je ne comprends pas l'incidence que ça pourrait avoir. J'avais aussi fait le test sans coeffpdv, l'effet était le même.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    je pensais que intervalle était en secondes, et donc que tu multipliais par 1000 pour avoir en ms. Mais tu l'exprimes déjà en millisecondes. J'envisageai le cas ou le timer fonctionnait bien mais avait un intervalle énorme, expliquant cette impression que ça ne fonctionne pas

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Merci pour l'idée, je vais la vérifier tout de même, peut-être quelque chose m'a-t-il échappé à ce niveau là.

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Alors, j'ai du nouveau: j'ai déplacé mon timer dans un autre paragraphe (il n'est plus sensé se déclencher au moment de la lecture sur le port série, mais lors de l'enregistrement d'un fichier).

    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
     Private Sub FileSystemWatcher1_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Created
     
            Dim AdressePhoto1 As String
            Dim cbvaltexte As String
     
            cbvalnum = CLng(Codebarres)
            cbvaltexte = CStr(cbvalnum)
     
            j = j + 1
            Debug.Print("j = " + CStr(j))
            If j > 1 Then
     
                Timer6.Enabled = False
                Debug.Print("timer6.enabled = false 2")
                Timer6.Enabled = True
                Debug.Print("timer6.enabled = true 1")
                Debug.Print("timer6.enabled = " + CStr(Timer6.Enabled))
                Debug.Print("timer6.interval = " + CStr(Timer6.Interval))
     
            End If
    ...
        End Sub
    Dans ce cas, le timer se déclenche bien en général, mais régulièrement, il ne se déclenche pas

    Je mets aussi le contenu de la fenêtre d'exécution pour les debug.print:
    (je précise que l'entrée dans la boucle serialport permet de calculer le nouvel interval du timer):

    j = 21
    timer6.enabled = false 2
    timer6.enabled = true 1
    timer6.enabled = False
    timer6.interval = 1626
    Entrée dans boucle serialport
    Timer6.interval = 1731
    j = 22
    timer6.enabled = false 2
    timer6.enabled = true 1
    timer6.enabled = False
    timer6.interval = 1731
    Entrée dans boucle serialport
    Timer6.interval = 1755
    j = 23
    timer6.enabled = false 2
    timer6.enabled = true 1
    timer6.enabled = False
    timer6.interval = 1755

    Est-ce que quelqu'un aurait une idée sur ce phénomène? Moi je bloque.

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    timer6.enabled = False
    est en effet folklo. Je serais tenté de penser que le timer n'a pas eu le temps de se relancer quand tu fais juste après le Enable.get. Essaie avec les méthodes Start/Stop à la place Enable.set (?), je vais essayer de me faire un petit sample reproduisant ça

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Bonjour,

    Effectivement, il manquait un petit élément: Timer6.Dispose() pour réinitialiser le timer (je pensais que c'était fait au moment du timer6.enabled = true).
    Mais cela ne résout que les comportements hératiques. Par conte il m'est toujours impossible de lancer un timer d'un paragraphe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    J'ai même fait un petit programme basique d'exemple et ça ne fonctionne pas mieux. Quelqu'un aurait une idée?

  13. #13
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Re-bonjour,

    j'ai une chose bizarre qui se produit pour mon problème: voici mon code initial

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
     
            If SerialPort1.BytesToRead >= 20 Then
                codebarres = SerialPort1.ReadExisting()
                Debug.Print(codebarres)
                Timer1.Enabled = True
     
            End If
    Là ça ne marche pas. Par contre si je rajoute une MessageBox comme ceci, ça fonctionne, le timer est bien déclenché:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
     
            If SerialPort1.BytesToRead >= 20 Then
                codebarres = SerialPort1.ReadExisting()
                Debug.Print(codebarres)
                Timer1.Enabled = True
                MsgBox("cb lu")
     
            End If
    Je me suis donc dis que la MessageBox devait consommer du temps mémoire et je l'ai remplacée par une pause, mais ça ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
     
            If SerialPort1.BytesToRead >= 20 Then
                codebarres = SerialPort1.ReadExisting()
                Debug.Print(codebarres)
                Timer1.Enabled = True
                System.Threading.Thread.Sleep(1000)
            End If
    Si quelqu'un a une idée là-dessus?

  14. #14
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Dispose n'est à appeler que lorsque le timer n'est plus utile, c'est pour nettoyer en ressources.

    Tu utilises quel timer ? System.Windows.Forms.Timer ? System.Timers.Timer ? System.Threading.Timer ?

  15. #15
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Très bonne question ça. Je ne sais pas. J'utilise le timer que j'ai inclus dans le design de la form (par copier-déposer). Je ne sais pas auquel ça peut correspondre. Où est-ce que je pourrais trouver cette info?

  16. #16
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    va sur le constructeur de ton timer, fais clic-droit atteindre la définition

  17. #17
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Merci de ton aide: voici ce que j'ai vu dans les propriétés:
    System.Windows.Forms.Timer.

    Est-ce que c'est bien l'info. que tu me demandais?

  18. #18
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    remplace ton objet et ton constructeur par System.Timers.Timer

  19. #19
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    OK, par contre, je suis désolé, mais étant débutant, il va falloir m'expliquer comment faire. Qu'est-ce que le type de timer change?

    D'autre part, j'ai fait des tests supplémentaires. Lorsque je mets une boucle assez longue (3000 pas avec incrément de 1) après le déclenchement du timer, celui-ci est bien lancé. Le problème c'est que ça me fait planter le programme (je pense que la boucle est toujours en train de tourner lorsque l'évènement suivant se produit et que cela génère une erreur. Mais je n'ai pas trouvé de moyen de me passer de cette boucle pour déclencher mon timer.

  20. #20
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut rappel sur le timer des winforms
    bonjour
    il faut toujours aller a la doc du fournisseur et lire les avertissements et autres gentillesses sur le produit quand ca ne va pas.

    voici la doc msdn en francais sur le Timer WinForm et j'ai pris la liberte de souligner un paragraphe en relation avec le port:
    Debut de citation
    La propriété Interval impose quelques restrictions dont vous devez tenir compte lorsque vous programmez un composant Timer :

    Si votre application ou une autre impose une demande importante au système (boucles longues, calculs complexes, accès intensifs à un périphérique, un réseau ou un port, par exemple), elle peut ne pas obtenir des événements de minuterie aussi souvent que spécifié par la propriété Interval.

    L'intervalle peut être compris entre 1 et 64 767 millisecondes ; autrement dit, même l'intervalle le plus long ne dépasse pas de beaucoup la minute (il est d'environ 64,8 secondes).

    Il n'est pas garanti que l'intervalle s'écoule dans le temps exact. Pour que sa précision soit garantie, la minuterie doit pouvoir au besoin consulter l'horloge système plutôt que de suivre en interne le temps écoulé.

    Le système génère 18 graduations à la seconde (autrement dit, même si la valeur de la propriété Interval est mesurée en millisecondes, la véritable précision d'un intervalle ne dépassera pas un dix-huitième de seconde).
    Fin de citation.

    Aussi il me semble que le probleme se situe dans le nombre affecte à SerialPort1.BytesToRead soit 20 octets .
    Car la frequence des rafale de reception de donnees (evenement datareceived du serial port) est incontrollable

    Seul ce 20 qui active le timer peut augmenter sa latence ou duree de sommeil et lui donner le delai pour consulter l'horloge systeme avant de demarrer .

    bon code....

Discussions similaires

  1. Creer un composant non visuel(Timer) dans une DLL
    Par hugobob dans le forum Composants VCL
    Réponses: 1
    Dernier message: 06/06/2006, 16h20
  2. Création du timer dans une Dll
    Par Hokagge dans le forum MFC
    Réponses: 13
    Dernier message: 14/03/2006, 18h04
  3. Réponses: 4
    Dernier message: 08/07/2005, 17h37
  4. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 14h07
  5. Timer dans une feuille excel
    Par bbkenny dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 28/01/2005, 10h43

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