Optimiser la fonction datareceived

cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012 - 19 avril 2012 à 23:16
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012 - 24 avril 2012 à 14:39
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

Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 09:50
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
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 16:16
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 ?
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 16:33
logiquement oui c'est fait pour :D
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 16:38
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 16:50
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 ?
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 16:51
Oui c'est ça pardon j'ai pas vu la réponse. C'est bien serialport de VB NET.
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 17:05
Pourquoi tu utilise pas :
SerialPort.ReadChar

comme sa tu les recupere 1 a un :D

a chaque fois que tu lance cette comamnde
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 17:09
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?
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 17:09
Après chaque commande utiliser un readchar ?
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 17:17
nn oublie ce que je t'ai dit :D
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 17:17
nn oublie ce que je t'ai dit :D
il doit faire quoi ton programme?
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 17:20
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.
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 17:29
donc 3 timer pour verifier chaque etat c cela?
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 17:43
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...
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
20 avril 2012 à 17:57
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
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 19:10
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 ?
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
20 avril 2012 à 23:25
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 ?
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
21 avril 2012 à 09:41
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
0
cs_daerken Messages postés 15 Date d'inscription vendredi 6 juin 2008 Statut Membre Dernière intervention 23 avril 2012
23 avril 2012 à 17:06
Ok merci Genildf. Je ne pourrai donc pas me libérer de ces timers ^^.
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
24 avril 2012 à 11:09
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
0
Rejoignez-nous