Visual Basic: gestion des priorités??
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Visual Basic: gestion des priorités??



  1. #1
    m_rille

    Visual Basic: gestion des priorités??


    ------

    Bonjour,

    je réalise un programme sous visual basic 2010 et j'ai un problème.

    En effet quand j'execute mon code tout est bon, mais j'aimerais installer des "priorités" entre les fonctions;

    J'ai une fonction qui écoute le port com et dès qu'il y a un événement elle se déclenche et sauvegarde les infos reçues dans une variable et dans ma forme principale j'ai une autre fonction qui a besoin de ses infos, le problème est que vb 2010 est multitache donc il execute en même temps la forme principale et la fonction portserie, le problème est que ma fonction port série n'a pas le temps de finir.

    j'ai beau mettre des boucles while dans ma forme principale afin d'attendre la réponse de ma fonction port série mais cela a pour but de tout bloquer, même l'éxécution de la fonction port série...

    j'ai fait pas mal d'essais (mod debut pas à pas ) mais je sèche...

    merci de partager vos idées ou solutions

    -----

  2. #2
    invite4492c379

    Re : Visual Basic: gestiondes priorités??

    Hello,

    tu peux un peu nous montrer ton code et s'il y lieu quelles bibliothèques tu utilises pour la lecture de ton port série. Tu es sous visual studio, windows, ... ?

  3. #3
    m_rille

    Re : Visual Basic: gestiondes priorités??

    ok, oui je suis sous microsoft visual basic 2010 express

    Code:
        ' Fonction qui écoute le port com 
    
        Private Sub SerialPort_BCFN_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_BCFN.DataReceived
            Me.Invoke(New _Affiche_reception_BCFN(AddressOf Affiche_reception_BCFN), SerialPort_BCFN.ReadExisting) ' Permet de récupérer la trame envoyée 
        End Sub
    
        Private Sub Affiche_reception_BCFN(ByVal donnee As String)
    
            
            databcfn = donnee.Remove(2, 10) ' On stocke les données reçues du DCFN dans une variable PUBLIQUE datadcfn
            If databcfn = data2 Then
                portbcfn=true
            End If
            
        End Sub
    Code:
        Public Sub gestionportcom()
    
    
            Dim port As String = ""
            Dim portbcfn As Boolean = False ' Si le port com où est le bcfn n'est pas trouvé: false, si trouvé = true 
            Dim portbts As Boolean = False  ' Si le port com où est le bts n'est pas trouvé: false, si trouvé = true 
            Dim i As Integer = 0
    
            For Each port In My.Computer.Ports.SerialPortNames
                SerialPort_BCFN.Close()
                SerialPort_BCFN.PortName = port
                SerialPort_BCFN.Open()
    
    
                fonction.envoyertrame("001;090;0\r\n", "BCFN")
    
    
                If (portbcfn=true) Then
    
             
                    Exit For
                End If
    
    
            Next port
    
    
     
            If portbcfn = False Then
                'main.SerialPort_BCFN.Close()
                MsgBox("Vérifiez que le BCFN est correctement branché et alimenté", MsgBoxStyle.OkOnly, "BCFN introuvable") ' Afficher message d'erreur, vérifier que le BCFN est corréctement branché
            End If

    voilà mon code "nue" sans les conditions que j'ai rajouté mais qui 'nont rien changé.
    Le problème est que Private Sub Affiche_reception_BCFN(ByVal donnee As String) n'est pas éxécuté avant que je teste "portbcfn=true" dans mon autre fonction, ainsi pour lui portbcfn est encore égal à false...

    le but de ce code est de trouver le "bon port com" ou est branché une petite carte électronique, qui si je lui envoi un trame spécifique, m'en renvoie une (marche à 100%)
    Dernière modification par m_rille ; 10/10/2011 à 13h54.

  4. #4
    invite4492c379

    Re : Visual Basic: gestiondes priorités??

    Re-,

    J'ai du mal à voir ce que tu fais en fait ... n'as-tu pas défini un callback DataReceived ? Ou est-ce ce que tu essayes de faire avec ton premier code ?

  5. A voir en vidéo sur Futura
  6. #5
    m_rille

    Re : Visual Basic: gestiondes priorités??

    le premier code: il permet de récupérer les trames reçues sur le port série

    dans le deuxieme, je souhaite "gérer" les ports coms:

    _je ferme le port au cas ou il soit ouvert
    _ j'affecte à serialport_bcfn le portX qui est dispo sur l'ordi
    _je l'ouvre
    _j'envoie un trame
    _si réponse je regarde la trame recue, si c'est celle que j'attends, je quitte la boucle for et ainsi je sais que c'est le bon port
    _sinon s'il me reste encore un port comm de dispo sur le pc, je recommence
    _ si aucun appareil connecté sur les ports ne répondent correctement, jaffiche le message: vérifiez...

    mon problème à l'heure actuelle c'est que l'événement du port comm quand il y a une trame recue sur le port fonctionne bien, mais al fonction qui permet de stocker la trame recue dans une variable est appelée après que je teste la trame recue (donc à chaque fois je teste rien, vu que la trame recue n'est pas encore stockée).


    pour simplifier voici un "schéma" du mode pas a pas que fait le programme:

    1:envoie une trame

    2: le pc receptionne une trame (événement)

    3: la fonction gestionportcom teste si la trame est bonne

    4: la trame réceptionnée est stockée et peut etre utilisée par toutes les fonctions


    voilà ce qui se passe, ce que je souhaites c'est "d'inverser" les étapes 3 et 4

  7. #6
    invite4492c379

    Re : Visual Basic: gestiondes priorités??

    Pour ce que je comprends, tu as deux parties distinctes. La première est lors de l'intialisation du port. Tu ne dois pas connecter le callback mais faire des lectures synchrones. La seconde, une fois le port initialisé, tu peux connecter le callback.

    Dans ta conception as-tu défini des objets particulier modélisant la communication avec ton appareil ?
    Tu passes des données par variables globales ?

  8. #7
    m_rille

    Re : Visual Basic: gestion des priorités??

    qu'appelles tu callback?

    databcfn, data2, portbcfn sont des variables globales


    ce que j'aimerais c'est qu'il y ait une sorte de priorité que dès que je recois une trame sur le pc, le traitement de cette trame soit prioritaire par rapport aux restes du programme.

  9. #8
    invite4492c379

    Re : Visual Basic: gestion des priorités??

    Je ne connais pas bien le VB, mais en .NET tu as les delegates.
    La classe System.IO.SerialPort te permet d'assigner une «fonction» qui sera appelée quand il faut. Je viens de consulter la doc, en VB c'est ADDHANDLER event AddressOf fonction.

    Variables globales = sources d'erreurs fréquentes.

    À mon avis il faut revoir ta conception et définir une classe qui va gérer ton appareil.


    Le constructeur initialise tout. Tu dois avoir un accesseur pour connaitre l'état (tout es ok, erreur). Il va falloir créer des événements et ton interface devra se connecter à ces événements.

  10. #9
    m_rille

    Re : Visual Basic: gestion des priorités??

    Private Delegate Sub _Affiche_reception_BCFN(ByVal donnee As String)

    oui, un bou de code est passé à la trappe, oui j'ai bien utilisé un private delegate sinon cela ne fonctionnait pas,

    mais je ne pense pas que le fait d'appeler une nouvelle classe va changer quelques choses, car avant c'est ce que j'avais fait, la partie gesionportcom était dans un fichier "module" et était donc appelé par ma fonction principale mais cela ne changeait rien.

    pour en venir aux événements c'est que j'ai essayé de faire mais je n'ai pas trouvé comment en créer un sois même, à partir d'un bouton, d'un click ok, mais à partir d'une variable ou d'une fonction.... !?

  11. #10
    invite4492c379

    Re : Visual Basic: gestion des priorités??

    Ta forme principale est un objet. Tu y crées une méthode (qui sera ton handler) qui regroupe les lectures et qui les dispatcheras sur les éléments de ton interface. Ce handler ne pourra être connecté qu'une fois l'initialisation de ton port faite évidemment.
    C'est peut-être un peu plus clair comme ça et ça évite de créer une nouvelle classe avec une gestion d'événements à part.

  12. #11
    m_rille

    Re : Visual Basic: gestion des priorités??

    bjr,

    je ne comprends pas très bien ce que tu me dis.

    je en vois pas trop en quoi cela va résoudre mon problème qui est qu'une fonction n'attend pas la fin d'une autre fonction et cette dernière fonction est commandée par un événement (port com)...
    j'aimerais pouvoir créer mon propre événement qui par exemple a la fin de ma fonction portcom envoi un événement pour dire que tout est fini.

    j'ai essayé avec un while et des if mais cela freeze le programme, et donc aucune des fonctions peut avancer...

  13. #12
    invite4492c379

    Re : Visual Basic: gestion des priorités??

    Re-,

    Tu as plusieurs threads, un pour ton interface et un autre utilisé pat System.IO.SerialPorts pour la gestion du port série. Ils s'exécutent en parallèle. C'est ainsi que c'est implémenté et tu ne peux rien y faire.
    Tu as donc un handler qui est déclenché dès que des données sont accessibles.Si tu t'attends à recevoir la chaine FG2012, un premier appel ne pourra te donner que FG20 et un second appel 12. Donc ton handler devra gérer ça via un buffer. Il scannera le buffer pour l'interpréter et suivant la commande il effectuera une tâche particulière. Ça c'est la version sont événements que tu as créés.
    Tu peux également écrire une classe qui en plus de faire tout cela proposera une liste d'événements propres à ton application (une par commande que tu auras) mais cela revient basiquement au même,. Cette dernière solution est à mon avis plus propre. Mais comme je te le disais dans une de tes premiers post cela fait partie de la première étape que tu as négligée : la conception.

    L'algo du handler est donc relativement simple
    Code:
    data = lire_donnees(port)
    ajouter(buffer, data)
    commande=scanner(buffer)
    tant que commande_valide(commande)
       suivant commande
    
          cas cmd1 : ...
          cas cmd2 : ...
    
       fin suivant
       commande=scanner(buffer)
    fin tant que
    Maintenant il va falloir implémenter tout ça ...

Discussions similaires

  1. visual basic
    Par invite096ed528 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 02/10/2009, 08h01
  2. gestion d'une base de données excel (Visual basic)
    Par Thiersun dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 17/03/2009, 08h54
  3. Visual Basic
    Par invited280a227 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 17/09/2007, 12h45
  4. Visual Basic
    Par invite16ba2b9a dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 09/01/2007, 10h09
  5. récupéré des info usb avec du visual basic
    Par invite5580d031 dans le forum Électronique
    Réponses: 1
    Dernier message: 09/06/2005, 14h23