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 :

Time out sur une liaison série


Sujet :

VB.NET

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

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Points : 67
    Points
    67
    Par défaut Time out sur une liaison série
    Bonjour

    J'ai un petit soft de communication série (RS232) qui fonctionne bien quand mon périphérique répond bien.
    Maintenant je souhait blindé mon soft dans le cas de non réception.
    J'ai voulu utiliser SerialPort1.ReadTimeout = 1000 mais je ne sort jamais de ma boucle de réception de trame.
    Avez vous une idée.
    Voici mon code (pour la mise au point j'appui sur un bouton)
    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
    Private Sub Button1_Click_1(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    		Dim TrameDemandeIdentification As String
    		Dim CompteurCarRecu As Integer
    		Dim NbCarRecevoir As Integer
    		Dim SofRecu As Boolean
     
    		Dim TabCaractereRecu() As Byte = New Byte(29) {}
    		Dim indice1 As Integer
    		Dim indice2 As Integer
    		ReDim TabCaractereRecu(40)
    		TrameDemandeIdentification = "55000180EF07"
     
    		TextBox2.Text = ""
    		SerialPort1.PortName = "com8"
    		SerialPort1.Open()
    		SerialPort1.WriteTimeout = 500
     
     
    		CompteurCarRecu = 0
    		NbCarRecevoir = 0
    		indice1 = 0
    		indice2 = 0
    		SofRecu = False
     
    		SerialPort1.DiscardInBuffer()
    		SerialPort1.Write(hex2ascii(TrameDemandeIdentification))
    		hbwait(50)
     
     
    		FinTimerReception = False
    		TextBox2.Text = "Début"
    		SerialPort1.ReadTimeout = 1000
     
    		Try
     
     
       Do
    				Dim Incoming As Integer = SerialPort1.BytesToRead
    				indice2 = Incoming
    				If Incoming <> 0 Then
    					SerialPort1.Read(TabCaractereRecu, indice1, indice2)
    					CompteurCarRecu = CompteurCarRecu + Incoming
    					indice1 = CompteurCarRecu
    					If TabCaractereRecu(0) = &H55 And SofRecu = False Then
    						SofRecu = True
    						If Incoming >= 3 Then
    							NbCarRecevoir = (TabCaractereRecu(1) * 256) + TabCaractereRecu(2) + 5
    						End If
    						If CompteurCarRecu = NbCarRecevoir Then
    							TextBox2.Text = CompteurCarRecu.ToString + " / " + NbCarRecevoir.ToString
    							Exit Do
    						End If
    					End If
     
    				ElseIf FinTimerReception = True Then
    					TextBox2.Text = "Time out"
    					Exit Do
    				End If
    			Loop
     
    		Catch ex As TimeoutException
    			Console.WriteLine("Error: Serial Port read timed out.")
    		Finally
    			If SerialPort1 IsNot Nothing Then SerialPort1.Close()
    		End Try
    	End Sub
    Merci pour votre aide

  2. #2
    Membre du Club
    Inscrit en
    Février 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 37
    Points : 55
    Points
    55
    Par défaut
    Salut,

    tu peux rajouter un test dans ta boucle pour sortir si ton port est fermé déjà.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Do 
    ...
    loop until not SerialPort1.isOpen

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

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Points : 67
    Points
    67
    Par défaut Peu être une mauvaise compréhention
    Bonjour
    Après quelques recherches, je pense que le timer Réception est fait en cas de problème du poste et non pas pour réaliser un time out si je n'ai pas reçu l'intégralité de mes caractères (Qu'en pensez vous ?)
    Don je me suis dit tu va faire autrement

    Lors du lancement (Form1_Load) ==> démarrer un Timer1 qui tombe tous les 200 ms

    Dans mon programme de liaison série, initialisation d'une variable Cpt qui correspond à un multiple de 200 ms (exemple 5 pour sortir au bout de secondes)
    Je positionne une variable Sortie = False

    et je sort de ma boucle Do Loop si Sortie = True


    et dans le Timer1_Tick ==> je décrémente Cpt et si Cpt = 0 alors Sortie = True

    Dans la théorie cela aurait dû fonctionner.

    Essais réaliser :
    lancement Timer1
    Initialisation et décompte de Cpt :

    Dans mon code d'envoi et réception liaison série OK si le nombre de caractère à recevoir est OK

    Je modifie mon code de mon périphérique pour qu'il n'envoie pas tous les caractères (rusé non)

    Et la !!! problème je tourne tous le temps dans ma boucle DO Loop sans jamais passer dans Timer1_Tick :

    Est il possible d'avoir des interruptions (Timer1_tick) pendant une boucle Do loop ?
    Merci

  4. #4
    Membre du Club
    Inscrit en
    Février 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 37
    Points : 55
    Points
    55
    Par défaut
    Pas à ma connaissance.
    Je viens de tester avec un formulaire simple avec un timer, un label et 2 boutons.
    Sur le click de start, je lance le timer qui décrémente une variable de 100 à 0 quand cette variable est à 0 je mets un booleen exitLoop à true, puis je fais un do until exitLoop .... loop dans lequel j'incremente une autre variable que j'affiche dans un label et je sors bien de ma boucle. Peut être un problème de portée de variable ou simplement un DoEvents à placer dans ta boocle

    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
    Public Class Form1
     
        Private exitLoop As Boolean = False
        Private cmpt As Int32 = 1
        Private decount As Int32 = 100
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Button1.Enabled = False
            Button2.Enabled = True
            Timer1.Enabled = True
     
            Do Until exitLoop
                cmpt += 1
                Label1.Text = cmpt.ToString
                Application.DoEvents()
            Loop
            Button1.Enabled = True
            Button2.Enabled = False
            Timer1.Enabled = False
            Label1.Text = "Stop"
        End Sub
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Timer1.Enabled = False
            Button1.Enabled = True
            Button2.Enabled = True
        End Sub
     
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            decount -= 10
            If decount <= 0 Then exitLoop = True
            Me.Text = decount.ToString
        End Sub
     
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            exitLoop = True
        End Sub
    End Class

Discussions similaires

  1. PIC 12F675: envoie d'un octet sur une liaison série
    Par forum dans le forum Téléchargez
    Réponses: 0
    Dernier message: 21/12/2013, 19h14
  2. Time out sur une requête / procédure stockée
    Par erwik dans le forum Développement
    Réponses: 6
    Dernier message: 28/02/2012, 09h01
  3. Comment capturer les données sur une liaison série RS232
    Par jef Orome dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 02/04/2007, 18h14
  4. Réponses: 7
    Dernier message: 21/06/2005, 16h56
  5. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37

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