Optimiser la fonction datareceived

Signaler
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012
-
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012
-
Bonjour à tous,

Je dois optimiser un logiciel déjà développé avec visual basic.
Pour résumer :
Le logiciel doit traiter des trames de réponses via le port série RS232.
Ces réponses sont en fait provoqués par des commandes que nous envoyons à la machine.

On à trois commandes et donc on souhaite pouvoir traiter 3 trames de réponses.
La fonction datareceived est utilisé afin de traiter les octets de réponses.

Le développeur me précédent (loin de penser que je suis un développeur !^^)à utilisé trois timers afin de laisser le temps à la fonction Datareceived de traiter les données il me semble car si je ne me trompe pas la fonction Datareceived s'exécute automatiquement lors de l'émission d'une réponse mais travail au second plan donc n'arrête pas l'exécution du code.
Voici mon problème : Je souhaite ne plus avoir de timers car il me semble que ça ralentit beaucoup l'application.

Pour l'instant je n'ai pas de solution car je ne comprends pas assez bien comment marche le fonction Datareceived.
J'aimerai connaître votre point de vue.

J'espère avoir été assez clair :s

Ps : Si vous avez besoin du code je le mettrait mais j'ai pas voulut encombrer le post avec.

Merci beaucoup.

22 réponses

Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
generalement pour verifier la fin d'une trame on a un une sorte de cheksum appelé (lrc) est-ce ton cas?

après dans ton datarecive si tu vérifie ta trame et que tu voit que tu as tout tu peut donc la traiter

âpres je peut peut être me trompé amis la seule fois que j'ai utilisé le rs2032 yen avais 1

il se calculait comme cela pour moi je sais pas si c'est generalisé

For p = 1 To Len(trame)
            lrc = lrc Xor Asc(Mid(trame, p, 1))
        Next p
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Merci de ta réponse, voici sur quoi je travail et malheureusement il n'y à pas de checksum : http://www.dell.com/downloads/global/shared/1610hd-rs232-command-set-ap.pdf. C'est le port série d'un vidéo projecteur.

J'ai un petit doute est-ce que la fonction datareceived s'execute d'elle même lorsque qu'une trame de réponse est perçu ?
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
logiquement oui c'est fait pour :D
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
je pense que le plus simple est de capturer la trame byte par byte

quel composant utilise tu pour le port com?

le composant serialport de VBNET?
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Voila mon code :

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load
        SerialPort.Open()

        Dim xmtBuf() As Byte = {&HBE, &HEF, &H10, &H5, &H0, &HC6, &HFF, &H11, &H11, &H1, &H0, &H1}

        vga = "1"
        serie = "1"
        lampe = "0"
        SerialPort.Write(xmtBuf, 0, xmtBuf.Length)
        Timer_source.Enabled = True

    End Sub


    Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
        Handles SerialPort.DataReceived

        Dim Count As Integer = SerialPort.BytesToRead
        Dim Buffer(0 To Count - 1) As Byte
        Dim Text2Display As String = ""

        serie = "0"
        SerialPort.Read(Buffer, 0, Count)
        For I As Integer = 0 To Buffer.GetUpperBound(0)
            Text2Display += Buffer(I).ToString("X2") & " "
        Next

        If Text2Display = "00 26 00" Then
            vga = "0"

        End If

        If Microsoft.VisualBasic.Left(Text2Display, 5) = "00 2F" Then
            lampe = Microsoft.VisualBasic.Right(Text2Display, 6)

        End If
        affichage(Text2Display)
    End Sub


    Private Sub affichage(ByVal [text] As String)
        If Me.ecoute.InvokeRequired Then
            Dim d As New SetTextCallback(AddressOf affichage)
            Me.Invoke(d, New Object() {[text]})
        Else
            Me.ecoute.Text = [text]
        End If
    End Sub


    Private Sub Timer_source_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_source.Tick
        Dim xmtBuf() As Byte = {&HBE, &HEF, &H10, &H5, &H0, &HDC, &HBF, &H11, &H11, &H1, &H0, &H26}
        SerialPort.Write(xmtBuf, 0, xmtBuf.Length)
        ecoute.Text = "source"
        Timer_source.Enabled = False
        Timer_lampe.Enabled = True
    End Sub



    

    Private Sub Timer_close_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_close.Tick
        Dim xmtBuf() As Byte = {&HBE, &HEF, &H10, &H5, &H0, &HC, &H3E, &H11, &H11, &H1, &H0, &H18}

        SerialPort.Write(xmtBuf, 0, xmtBuf.Length)
        SerialPort.Close()
        Timer_close.Enabled = False
        End
    End Sub

    Private Sub Timer_lampe_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_lampe.Tick
        Dim xmtBuf() As Byte = {&HBE, &HEF, &H10, &H5, &H0, &HDA, &H7F, &H11, &H11, &H1, &H0, &H2F}
        ecoute.Text = "lampe"
        SerialPort.Write(xmtBuf, 0, xmtBuf.Length)

        Timer_lampe.Enabled = False
        Timer_inter.Enabled = True
    End Sub


J'ai délibérément supprimer la fonction timer_inter_tick qui elle même enclenche le timer_close.
Penser vous que c'est possible d'enoyer les commandes l'une après l'autre dès que datareceived à fini sont traitement de données ?
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Oui c'est ça pardon j'ai pas vu la réponse. C'est bien serialport de VB NET.
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
Pourquoi tu utilise pas :
SerialPort.ReadChar

comme sa tu les recupere 1 a un :D

a chaque fois que tu lance cette comamnde
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
j'ai du mal a saisir l'utilitée des tiomer si ce n'est e,nvoyer une signal pour la lampe

que doit faire le programme?
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Après chaque commande utiliser un readchar ?
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
nn oublie ce que je t'ai dit :D
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
nn oublie ce que je t'ai dit :D
il doit faire quoi ton programme?
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Le programme doit envoyer par mail les erreur détécté donc si le cable VGA ou SERIE est débranché. Il permet aussi d'envoyer dans la base de donnée un information sur la lampe.

J'ai enlevé la fonction pour envoyer le mail et pour la base de donnée ici.

On finit par tester la valeur de "serie" et "vga" afin d'envoyer ou non un mail contenant l’erreur.

Les timers servent selon moi à attendre simplement que la fonction datareceived ai fini de traiter les données...
Comme je vous l'ai dis je dois optimiser le programme qui est fonctionnel mais laborieux a mon avis. Ou alors je n'ai pas encore compris l'utilité des timers.

En tout cas merci beaucoup pour ton aide.
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
donc 3 timer pour verifier chaque etat c cela?
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

4 timers* (J'en ai supprimé un ici). Et ils sont associés aux commandes envoyé plutôt : Power on, test VGQ, Info lampe, Power Off.

L'état du port série est déduis débranché si il n'y a aucune réponse donc datareceived non utilisé donc pas de commande pour cette état.

Désolé je ne pense pas être très clair...
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
a la limite le plus inteligent serai de : metre un seul test sur le timer:

a partir de la sur les fonction receive tu colle tes autre test sa évite sa te met tout sur un seul timer
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Je comprends pas très bien ce que tu veux dire. Les fonctions receive c'est lesquels pour toi ?

Qu'elle serai l’intérêt d'avoir qu'un timer ? Simplifier le code ?
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

En fait il suffirai que la fonction datareceived ne s'execute qu'une fois : est ce que readline permettrait d'attendre que tout les octets soit trasmis ?
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
tu ne peut pas tu doit focemnent écrire sur le port pour avoir une réponse

vu que tu écrit 3 fois (dans 3 timers tu passera forcement 3 fois par ta fonction receive

pour le timer il t'en faut au moin 1 pour tester toutes les 1-5-10 minutes
Messages postés
15
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
23 avril 2012

Ok merci Genildf. Je ne pourrai donc pas me libérer de ces timers ^^.
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
ben tu peut te debarassé des 2 autre il t'n faut juste 1 pour ta procédure

après les autres ecriture sur le porte du les case sur ton datarecive