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 et DataReceived ne font pas bon ménage


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Par défaut Timer et DataReceived ne font pas bon ménage
    Bonjour

    Dans mon soft, j'ai une gestion de liaison série à faire.
    pour la réception des trames, j'utilise SerialPort.DataReceived

    Pas de problème ca fonctionne très bien.

    Je souhait dépiler ma trame de réception en dehors de ma fonction SerialPort.DataReceived et donc comme on me l'a conseillé, j'utilise un timer de 250 ms.

    Bien sur dans Form1_Load je met en marche mon timer1 (Timer1.start())

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Timer1.Stop()
            Thread.Sleep(100)
            If (Not (U8_FifoIncIn = U8_FifoIncOut) Or Not (u8_FifoRxState = True)) Then
                NbCarReceived = SerialPort1.BytesToRead
                SerialPort1.Read(U8t_FifoRX, U8_FifoIncIn, NbCarReceived)
                U8_FifoIncIn = U8_FifoIncIn + NbCarReceived
                If (U8_FifoIncIn = TailleBufferReception) Then
                    U8_FifoIncIn = 0
                End If
     
                If (U8_FifoIncOut = U8_FifoIncIn) Then
                    u8_FifoRxState = True
                End If
     
            End If
            Timer1.Start()
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     
            Timer1.Stop()
            If U8_FifoIncOut < U8_FifoIncIn Then 'On a des caractère a dépiler
                Select Case U8_EtapeAnalyse
                    Case RechercheDebutTrame
                        If U8t_FifoRX(U8_FifoIncOut) = 170 Then
                            U8_FifoIncOut = U8_FifoIncOut + 1
                            U8_EtapeAnalyse = RechercheTypeTrame
                        End If
                    Case RechercheTypeTrame
                        If U8t_FifoRX(U8_FifoIncOut) = 160 Then 'c'est une trame de type dimming A0 hex
                            TypeTrameCourte = True
                            U8_EtapeAnalyse = AnalyseTrameLongueurOctet
     
                        ElseIf U8t_FifoRX(U8_FifoIncOut) = 80 Then 'c'est une trame de type mise à jour 50hex
                            TypeTrameCourte = True
                            U8_EtapeAnalyse = AnalyseTrameLongueurOctet
                        ElseIf U8t_FifoRX(U8_FifoIncOut) = 7 Then 'c'est une trame de type lecture de configuration 07hex
                            TypeTrameCourte = False
                            U8_EtapeAnalyse = AnalyseTrameLongueurOctet
                        Else
     
                            U8_EtapeAnalyse = AnalyseTrameInconnue
                        End If
                        U8_FifoIncOut = U8_FifoIncOut + 1
     
     
                    Case AnalyseTrameLongueurOctet
                        U8_NombreOctetTrameEnCoursAnalyse = U8t_FifoRX(U8_FifoIncOut)
                        'U8_FifoIncOut = U8_FifoIncOut + 1
                        If (TypeTrameCourte = True) Then 'c"est une trame courte
                            U8_EtapeAnalyse = AnalyseTrameDimmingAckNack
                        Else
                            U8_EtapeAnalyse = AnalyseTrameLectureParametres
                            CptLectureTrameConfiguration = 0
                        End If
                        U8_FifoIncOut = U8_FifoIncOut + 1
     
                    Case AnalyseTrameLectureParametres
                        TrameDeValeurLectureConfiguration(CptLectureTrameConfiguration) = U8t_FifoRX(U8_FifoIncOut)
                        CptLectureTrameConfiguration = CptLectureTrameConfiguration + 1
                        U8_FifoIncOut = U8_FifoIncOut + 1
                        If CptLectureTrameConfiguration = TailleBufferLectureConfiguration + 1 Then
                            U8_EtapeAnalyse = AnalyseTrameDimmingRecupChekSum
                        End If
     
                    Case AnalyseTrameDimmingAckNack
                        If U8t_FifoRX(U8_FifoIncOut) = 0 Then 'on a recu ACK
                            ResulatTrameDimming = "ACK"
                            U8_EtapeAnalyse = AnalyseTrameDimmingRecupChekSum
                        ElseIf U8t_FifoRX(U8_FifoIncOut) = 1 Then 'on a recu NACK
                            ResulatTrameDimming = "NACK"
                            U8_EtapeAnalyse = AnalyseTrameDimmingRecupChekSum
                        Else
                            U8_EtapeAnalyse = AnalyseTrameInconnue
                        End If
                        U8_FifoIncOut = U8_FifoIncOut + 1
     
                    Case AnalyseTrameDimmingRecupChekSum
                        U8_ChekSumTrameEnCoursAnalyse = U8t_FifoRX(U8_FifoIncOut)
                        'U8_ChekSumCalculeTrameEnCoursAnalyse = CalculChekSumTrame()
                        If U8_ChekSumTrameEnCoursAnalyse <> U8_ChekSumCalculeTrameEnCoursAnalyse Then
                            'MessageBox.Show("Le cheksum de la trame est OK")
                        Else
                            'MessageBox.Show("Le cheksum de la trame est NOK")
                        End If
                        U8_FifoIncOut = U8_FifoIncOut + 1
                        U8_EtapeAnalyse = RechercheDebutTrame
     
                    Case CalculChekSumTrame
     
                    Case Else 'Trame inconnue
     
                End Select
            End If
            Timer1.Start()
        End Sub
    Quand je lance mon soft, je passe bien dans ma fonction Timer1.Tick et si je ne recoit pas de trame, pas de problème je passe toujours dans l'interval programmé dans ma fonction Timer1.Tick

    Par contre,à chaque réception de trame je passe bien dans ma fonction SerialPort1_DataReceived, mais je ne passe plus jamais par ma fonction Timer1.Tick (alors que Timer1 = Start)


    Une idée

    merci

  2. #2
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Encore un code qui fait mal à la tête :O

    Peux-tu mettre le code où tu initialises ton timer ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Par défaut
    Mon timer est initialisé dans nomDeMonLogiciel.Designer.vb (mon interval est saisi dans les propriété)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     'Timer1
            '
            Me.Timer1.Interval = 5000
            '
    mon start est dans nomDeMonLogiciel.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
                  Timer1.Start()
     
        End Sub
    Voilà rien de plus simple

    J'ai tronqué dans le code Form1 le superflu

  4. #4
    Membre très actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Par défaut
    Salut,
    C'est encore moi Mr Malabeux
    C'est simple il faut que tu enlève Timer1.Stop() et Timer1.start() dans l'événement Tick du timer et datareceived,car tu a déjà démarrer ton timer dans le Load.

    Essaye et donne nous le résultat.

    @+++

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Par défaut
    Salut oussi

    le monsieur fait vieux c...

    J'ai fait l'essai et c'est OK
    Ce que je voulais faire, c'est lors de dataReceived je voulais couper mon timer pour ne pas être déranger
    et vise vera pour pour le timer.

    le principale c'est que cela fonction

    merci pour ton aide

  6. #6
    Membre très actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Par défaut
    Salut,
    De rien.
    Eh oui c'est un petit inconvenient mais en s'en passe à coté des avantages

    @++

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

Discussions similaires

  1. [DisplayTag] Tri et pagination ne font pas bon ménage
    Par tiboudchou dans le forum Taglibs
    Réponses: 4
    Dernier message: 31/03/2010, 12h22
  2. rich:calendar, DIV et IE ne font pas bon ménage
    Par chotana dans le forum JSF
    Réponses: 1
    Dernier message: 20/04/2009, 17h16
  3. C++ et VB6 ne font pas bon ménage!
    Par Tuizi dans le forum C++
    Réponses: 6
    Dernier message: 18/07/2008, 10h03
  4. Le wifi et Club Internet ne font pas bon ménage!
    Par Ylias dans le forum La taverne du Club : Humour et divers
    Réponses: 5
    Dernier message: 20/08/2007, 10h30
  5. Réponses: 2
    Dernier message: 12/08/2007, 15h27

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