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

Interfaces Graphiques Discussion :

Action en parallèle (envoi de données et enregistrement de données)


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut Action en parallèle (envoi de données et enregistrement de données)
    Bonjour à tous,

    J'ai un microcontrôleur qui émet des informations (valeurs d'accéléromètres) toutes les ms. Ce même microcontrôleur peut recevoir des informations pour modifier son fonctionnement.

    Actuellement, j'ai fait une interface qui envoie des informations au microcontrôleur. J'ai également un programme sans interface qui lit les données reçus sur le port série. Les deux fonctionnent mais je ne vois pas comment les fusionner.

    L'interface ressemble grossièrement à l'exemple dans le tutoriel sur l'utilisation des fonctions imbriquées (nested functions) où les boutons "+" et "-" envoie des caractères sur le port série.

    Mon programme de lecture des données est une boucle de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    tic_plot = tic;
    tic_data = tic;
    while condition
            if toc(tic_data)>0.002 % lecture toutes les 2ms
                   tic_data=tic;
                   bigbuff = fread
                   data = num2double(char(bigbuff))
            end
            if toc(tic_plot)>0.2 % affichage toutes les 200ms
                   tic_plot=tic;
                   plot(data)
                   drawnow
            end
    end
    Je n'arrive donc pas à savoir comment intégrer mon interface graphique avec l'enregistrement et l'affichage des données reçues en continue sur le port série.

    Si vous avez une philosophie à me proposer, je suis preneur.

    Christophe

  2. #2
    Membre émérite Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Par défaut
    salut
    je te propose d'utiliser un timer qui va simplement lire les données sur le port série et les stocker. Un autre timer qui va ploter toutes les 200ms. Tu peux les créer dans l'Opening_Fcn par exemple et les lancer/arrêter là où tu lances/arêtes tes mesures.
    Edit : il faut bien entendu ajouter un objet de type axes à ton interface pour ploter dedans.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Ok, ça m'a l'air pas trop mal, cependant...

    J'ai voulu tester mais je me suis confronté à des erreurs.

    Voici une première erreur liée au code en dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Maximum recursion limit of 500 reached. Use
    set(0,'RecursionLimit',N)
    to change the limit.  Be aware that exceeding your available
    stack space can
    crash MATLAB and/or your computer.
     
    Error in gui_control_KRISTO_v03r04_mini/start
     
     
    Error while evaluating uicontrol Callback
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    function gui_control_KRISTO_v03r04_mini
     
    clear all
    close all
    clc
     
     
    x=1;
    y=1;
    x2=1;
    y2=1;
     
    % periode de rafraichissement
    % graphique
    per_graph1 = 1;
    per_graph2 = 4; % le graph du dessous s'affichera 4 fois plus lentement
    % save acc
    per_acc = 1;
     
     
    scrsz = get(0,'ScreenSize');
     
    % Création de l'objet Figure
    hgui=figure('units','pixels',...
        'Position',[scrsz(1) scrsz(2) scrsz(3) scrsz(4)],...
        'color',[0.925 0.913 0.687],...
        'numbertitle','off',...
        'name','[GUI] Interface avec le microcontroleur',...
        'menubar','none',...
        'tag','interface');
     
                                                 %%%%%%%%%%%%%
    % Création de l'objet Uicontrol Pushbutton   %%% START %%%
    gui.start=uicontrol('style','pushbutton',... %%%%%%%%%%%%%
        'BackgroundColor','g',...
        'units','normalized',...
        'position',[0.1 0.825 0.1 0.05],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','START',...
        'callback',@start);
     
                                                %%%%%%%%%%%%
    % Création de l'objet Uicontrol Pushbutton  %%% STOP %%%
    gui.stop=uicontrol('style','pushbutton',... %%%%%%%%%%%%
        'BackgroundColor','g',...
        'units','normalized',...
        'position',[0.5 0.825 0.1 0.05],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','STOP',...
        'callback',@stop);
     
    %% affichage graphique de la tension et de l'accélération
     
    % Création de l'objet Axes pour le tracer des tensions
    gui.h1=axes('units','normalized',...
        'position',[0.1 0.4 0.8 0.25]);
     
    % Création de l'objet Axes pour le tracer de l'accélération
    gui.h2=axes('units','normalized',...
        'position',[0.1 0.075 0.8 0.25]);
     
     
    %% declaration du timer pour mettre à jour le graph tension
    gui.timer_graph1 = timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', per_graph1, ...                        % Initial period is 1 sec.
        'TimerFcn', @update_display1); % Specify callback function
     
    %% declaration du timer pour mettre à jour le graph accéléro
    gui.timer_graph2 = timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', per_graph2, ...                        % Initial period is 1 sec.
        'TimerFcn', @update_display2); % Specify callback function
     
    %% declaration du timer pour enregistrer les donnees de l'accelero
    gui.timer_acc = timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', per_acc, ...                        % Initial period is 1 sec.
        'TimerFcn', @save_acc); % Specify callback function
     
    setappdata(hgui,'logindlg',gui)
     
    % DEBUT DE LA SOUS-FONCTION START %
        function start(obj,event)
            set(gui.start,'BackgroundColor','g');
            start(gui.timer_graph1);
            start(gui.timer_graph2);
            start(gui.timer_acc);
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION START%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % DEBUT DE LA SOUS-FONCTION STOP %
        function stop(obj,event)
            set(gui.stop,'BackgroundColor','g');
            stop(gui.timer_graph1);
            stop(gui.timer_graph2)
            stop(gui.timer_acc);
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION STOP%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % DEBUT DE LA SOUS-FONCTION Affichage tension %
        function update_display1(obj,event)
            x=[x rand];
            y=[y rand];
            plot(gui.h1,x,y);
            drawnow;
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Affichage tension%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
     
    % DEBUT DE LA SOUS-FONCTION Affichage accelero %
        function update_display2(obj,event)
            plot(gui.h2,x2,y2);
            drawnow;
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Affichage tension%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % DEBUT DE LA SOUS-FONCTION Sauvegarde donnees accelero %
        function save_acc(obj,event)
            x2=[x2 rand];
            y2=[y2 rand];
     
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Sauvegarde donnees accelero%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    end

    Merci en tous cas pour la piste des timers. C'est si évident en langage basique, qu'on en oublie sa possible utilisation dans des langages plus "évolués".

    Christophe

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       function start(obj,event)
            set(gui.start,'BackgroundColor','g');
            start(gui.timer_graph1);
            start(gui.timer_graph2);
            start(gui.timer_acc);
        end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        function stop(obj,event)
            set(gui.stop,'BackgroundColor','g');
            stop(gui.timer_graph1);
            stop(gui.timer_graph2)
            stop(gui.timer_acc);
        end
    On ne le dira jamais assez : ne pas nommer de variable ou fonction du même nom que des fonctions MATLAB.
    À lire et relire

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    La bonne blague, dire que je voulais faire simple...

    Dès fois, on ferait mieux de rester avec des noms en français...

    Merci beaucoup.

    Christophe

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Suite à l'utilisation des timers, j'ai dû ajouter un test pour savoir s'il matlab avait bien lancé mes timers :

    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
    start(gui.timer_acc);
    sacc=get(gui.timer_acc);
     
    start(gui.timer_graph);
    sgraph=get(gui.timer_graph);
     
    start(gui.timer_save_acc);
    ssaveacc=get(gui.timer_save_acc);
     
    if strcmp(sacc.Running,'off')
          start(gui.timer_acc);
    elseif strcmp(sgraph.Running,'off')
          start(gui.timer_graph);
    elseif strcmp(ssaveacc.Running,'off')
          start(gui.timer_save_acc);
    end
    Ca pourra peut-être servir à quelqu'un...

    Christophe

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

Discussions similaires

  1. [HTML] Tableau pour l'enregistrement des données
    Par ghyosmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 01/11/2005, 15h28
  2. [Oracle 10g] Envoi mail avec PJ à une heure donnée
    Par djoule6 dans le forum Oracle
    Réponses: 5
    Dernier message: 25/10/2005, 11h51
  3. Réponses: 7
    Dernier message: 20/03/2005, 14h53
  4. [Envoi mails]Récupérer les enregistrements MX d'un domaine
    Par streetpc dans le forum Développement
    Réponses: 7
    Dernier message: 09/06/2004, 20h00
  5. [PIC] Enregistrement de données permanentes
    Par Grulou dans le forum Autres architectures
    Réponses: 6
    Dernier message: 15/03/2004, 19h31

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