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

MATLAB Discussion :

Communication entre MATLAB et un PIC 16f877a


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Communication entre MATLAB et un PIC 16f877a
    Bonjour,

    comment faire la communication entre Matlab et un pic 16f877a cad je veut que le pic attend que matlab lui donne l'ordre pour travail..

    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    bonjour,

    je ne connais pas "PIC 16f877a" mais en général, lorsqu'on veut faire communiquer matlab avec un autre logiciel on utilise soit des fichiers texte
    (matlab peut lire les fichiers écrits par ton autre logiciel) soit on peut utiliser la commande (system de matlab) pour lancer ton logiciel externe.

    bon courage

  3. #3
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Ce que tu cherches à faire est extrêmement spécifique. Comment as-tu fait pour connecter ton micro-contrôleur à l'ordinateur déjà ? Tu utilises un outil type easy-pic ? Ou bien tu n'as rien du tout pour l'instant ?

    En tout cas, matlab ne possède pas d'outil tout fait pour faire ce genre de chose. Il va falloir que tu te coltines la communication toi-même. Du côté de ce genre de PIC, tu as l'I2C et peut-être l'USB de disponible, c'est à peu près tout, après du côté de matlab, il faut que tu regardes du côté des toolbox de communication, et que tu fouilles dans l'aide... Mes connaissances s'arrêtent là. Il faudrait qu'un expert réseau matlab te réponde.

    En tout cas c'est très spécifique. Je te conseille de détailler le plus possible pour que tu aies des réponses.

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant:chaque jour on aprend des choses ;)
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant:chaque jour on aprend des choses ;)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Tu peux utiliser la communication série.
    Configurer le PIC au niveau hard et soft
    Serial Port and RS-232 for communication

    Et après construire ton protocole entre Matlab et le PIC.
    Exemple comm avec arduino

    Il existe une toolbox pour Arduino;tu peux analyser ses fichier .m pour comprendre comment ça marche.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 17
    Points
    17
    Par défaut
    Je confirme que l'utilisation de la communication série est la solution la plus simple.

    Il est vrai qu'aujourd'hui nos chers ordinateurs portables ne disposent plus de port série "COM", pour autant l'utilisation d'un convertisseur USB vers série rend la communication possible, comme par exemple l'utilisation de la puce FT232RL que l'on retrouve sous différents formats ou le MCP2200 ou bien encore directement par l'usage d'un PIC USB en le programment avec un firmware CDC.

    Dans ce dernier cas, on trouve le code source sur www.microchip.com/mla à la section "Downloads", puis dans le répertoire C:\microchip_solutions_v2013-02-15\USB\Device - CDC - Basic Demo\Firmware
    Ce firmware est compatible avec le PIC18F4550 (sélectionner la configuration PICDEM_FSUSB), je ne peux donc que vous recommander ce microcontrôleur 8 bits, qui permettra à une personne débutante de démarrer sur une architecture simple et pour lequel on trouve pléthore d'informations et d'exemples sur le Net.

    En pièce jointe le script MATLAB pour établir une communication sur le COM1.
    Dans l'exemple que je donne, le PC envoie la chaîne de caractère "ping", via la fonction:
    >> send_serial_data('ping')
    et le microcontrôleur répond la chaîne de caractère "pong" comme acquittement du message.


    J'espère que cela vous sera utile pour votre développement

    Vous pouvez également consulter:
    >> help fopen
    C:\Program Files\MATLAB\R2012b\toolbox\matlab\iofun\@serial\serial.m
    et
    Instrument Control Toolbox, pour le contrôle plus poussé des bus de communication depuis MATLAB
    Fichiers attachés Fichiers attachés

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    J'ai connecté mon micro-contrôleur (pic 16f877a) avec un port série rs232 et je fait l'initialisation de ce port sur MATLAB et tout..
    Mon problème c'est de faire la communication entre MATLAB et le pic16f877a..au début je dois programmer mon pic 16f877a pour faire un comptage de 0 a 255 avec un programme pic puis je dois faire une communication entre MATLAB et le pic 16f877a pour que MATLAB donne l'ordre pour start le comptage et le close de comptage.
    Enfin je dois faire une interface avec MATLAB qui comporte un button start et un bouton close et une fenêtre d'affichage de comptage de 0 jusqu'à 255.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 17
    Points
    17
    Par défaut
    Voici un pseudo code pour le PIC pouvant répondant à la demande de mise en route et à l'arrêt d'un compteur. Lorsque celui-ci est en fonction, sa valeur est transmise à MATLAB.
    Code C : 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
     
    /** D E F I N I T I O N S *****************************************************/
    /* Commande pour le controle du compteur */
    typedef enum
    {
        CPT_STOP,        // fixer l'état du compteur à "STOP"
        CPT_START        // fixer l'état du compteur à "START"
     
    } CPT_CMD_MATLAB;
     
     
    /** M A I N   F U N C T I O N *************************************************/
    void main(void)
    {
        unsigned char cpt_value;        // valeur du compteur
        unsigned char cpt_state = 0;    // état du compteur
     
        /* Initialize MCU peripherals */
        InitializeSystem();             // initialisation des périphériques du PIC
     
        // [FR] Boucle d'exécution principale (boucle sans fin) - [EN] Main loop runtime (never ending loop)
        while (1)                       // Run loop
        {
            /* Lecture de l'UART de la donnée transmise par le PC */
            if (PIR1bits.RCIF)                  // A data has been received by the PIC ?
            {
                DataSendByMATLAB = RCREG;        // Lecture de l'UART
     
                switch (DataSendByMATLAB)
                {
                    case CPT_START:             // reception de la commande "START"
                        cpt_value = 0;          // initialiser la valeur du compteur
                        cpt_state = CPT_START;  // modifier l'état du compteur
                        break;
     
                    case CPT_STOP:              // reception de la commande "STOP"
                        cpt_state = CPT_STOP;   // modifier l'état du compteur
                        break;
     
                    default :
                        Nop();                  // erreur de reception du message :(, Ne rien faire !
     
                } // end of switch (UART_RX_State)
     
                // RCIF: EUSART Receive Interrupt Flag bit -> cleared when RCREG is read (voir PIR1 Registers, DS39632D-page 102)
                PIR1bits.RCIF = 0;              // effacer le drapeau d'INT avant de sortir de la routine
            }
     
            /* Ecriture de la valeur courante du compteur vers MATLAB */
            if (cpt_state == CPT_START)
            {
                cpt_value++;                    // incrémentation du compteur
                if (cpt_value == 255)
                {
                    cpt_state = CPT_STOP;       // modifier l'état du compteur
                }
                TXREG = cpt_value;              // transmission de la nouvelle valeur à MATLAB
                while (!TXSTAbits.TRMT);        // Waiting for Transmit Shift Register Status bit empty, idem to routine BusyUSART()
            }
     
        } // end of while(1)
     
    } // end of main()

    Pour ce qui est de l'interface avec MATLAB, avec un bouton start et un bouton stop, ainsi qu'une fenêtre d'affichage de la valeur du comptage, je vous recommande l'utilisation du GUI, en voici un exemple à titre indicatif :
    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
     
    % Creation d'un paneau de controle pour l'etat du compteur
    gui.etat = uipanel      (
                                'Title', 'Etat du compteur', ...
                                'BackgroundColor', [255/255, 228/255, 196/255], ...
                                'Position', [.02 .89 .96 0.1], 'FontSize', 12
                            );
     
    gui.cmd = uicontrol     (
                                'style', 'pushbutton', ...
                                'parent', gui.etat, ...
                                'units', 'normalized', ...
                                'position', [0.1 0.25 0.2 0.5], ...
                                'FontSize', 14, ...
                                'FontWeight', 'bold', ...
                                'String', 'Start Compteur', ...
                                'callback', @cpt_start
                            );
     
    % etc...
    Bonne continuation

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    salut,
    le code ne marche pas...je doit programmer le pic 16f877a avec un programme pic.c

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par bishoo Voir le message
    salut,
    le code ne marche pas...je doit programmer le pic 16f877a avec un programme pic.c
    Impossible de vous apporter plus d'aide sans autres informations...
    A vous de voir si vous souhaitez aller au bout de votre question technique, pour cela il faudrait que l'on puisse étudier votre programme et regarder pourquoi il ne fonctionne pas !

    Pour rappel, un programme C pour microcontrôleur doit au moins avoir :
    • l'include des fichiers systèmes
    • l'initialisation des fusibles de configuration du PIC (permettant le démarrage du microcontrôleur)
    • une seule fonction main() dans le projet


    Merci de préciser le type d'horloge utiliser pour le fonctionnement du PIC, ainsi que la chaîne de développement (avec les numéro de version des outils)

    Bonne continuation

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    bonjour
    merci bien...j'ai trouvé une solution pour commander mon pic 16f877a avec matlab et maintenant je doit faire une interface gui qui comporte deux boutons (start et close) et une espace pour afficher des nombres de 0 a 255
    voici mon code :

    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
    %-------------------------------------------------------------
    %Creation d'interface
    %-------------------------------------------------------------
    function acquisition_serie_donnees()
    %Ouverture de la fenetre
    %-------------------------------------------------------------
    handle(1) = figure('Name','Acquisition des données',...
    'Position',[500, 300, 400, 200],...
    'menubar','none');
    %-------------------------------------------------------------
    %Creation de la zone d'acquisition
    %-------------------------------------------------------------
    %Bouton : lancer acquisition
    handle(2) = uicontrol('pos',[250,160,140,30],...
    'style','pushbutton',...
    'callback',@cb_start_acquisition,...
    'String','start');
    'backgroundcolor',[0.9,0.1,0.1]
     
     
    %Bouton : Fermer port
    handle(7) = uicontrol('pos',[250,10,140,30],...
    'style','pushbutton',...
    'callback',@cb_fermer_port,...
    'String','Fermer port');
    'backgroundcolor',[0.9,0.1,0.1]
     
    %-------------------------------------------------------------
    %Callback : ouvrir port
     
    function  cb_start_acquisition(obj,event)
    s=serial('com1','BaudRate',9600,'DataBits',8,'StopBits',1,'Terminator','CR')
    % C'était l'initialisation
    fopen(s)
     
    fprintf(s,'2')
     
    for i=1:3;
        x=fgetl(s)
    end
     
     
     
     
    fclose(s)
    delete(s)
    clear s 
    %-------------------------------------------------------------
    %Callback : fermer port
     
    function  cb_fermer_port(obj,event)
    fopen(s)
     
    fprintf(s,'3')
    fclose(s)
    delete(s)
     
    clear s

    mon problème c'est :
    • les boutons close ne marche pas dès que le programme de pic16f877a et fonctionelle
    • et je veux que l'affichage des nombres de 0 a 255 qui ce fait sur la Command Window ce fait dans l'interface

    aidez moi svp

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    Est-ce normal que tu veuilles ouvrir et fermer ton port COM à chaque fois que tu appuies sur START ou sur STOP ?

    Pour afficher un texte dans un GUI, tu peux utiliser un uicontrol de type 'text'. Tu peux ajouter ceci avant les fonctions callback.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    handle(8)=uicontrol('style','text',...
            'units','normalized',...
            'position',[0.02 0.075 0.4 0.1],...
            'string','data');
    Là où tu obtiens ta variable 'x' que tu peux aussi obtenir avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x=fread(s,s.BytesAvailable);
    Tu peux faire un set dans ton objet handle(8) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(handle(8),'string',num2str(x))
    Cordialement,
    Christophe Halgand

    PS : ce petit tutoriel pourra éventuellement t'aider
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    oui c'est sa j'ai programmer mon pic 16f877a avec un programme pic.c, lorsque j'appuie sur le caractère 2 le pic fonctionne et affiche des nombres de 0 a 255 si j'appuie sur 3 le pic arrête et cette programme fonctionne avec le Hyper terminale mais lorsque j'utilise MATLAB fonctionne lorsque j'appuie sur 2 mais lorsque j'appuie sur 3 le pic reste fonctionnel
    voila mon code de programmation de pic 16f877a sur pic.c
    Code C : 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
    #include <16F877a.h>
    #use delay (clock=20000000)
    #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
     
     
    char received,a;
     
     
     
    void main ()
    {
        while(true)
        {
            int i;
            received = getc();
            if(received ==50)
            {
                for (i=1;i<256;i++)
                { 
                    if(kbhit()){
                        (a=getc());
                        if (a==51) break;
                    }
                    output_b(i);
                    printf(" %u  ",i);
                    delay_ms(100);
                    if(i==255) break ;
     
     
     
                }
            }
            else
            {
                printf(" \n\r  'wrong' ==> clic botton 2");
            }
        }
    }

    merci

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Je pense que tu pourrais créer l'objet 's' lié au port com en même temps que tu crées ta figure et l'ouverture du port également. Le callback du bouton "start" enverra donc la chaine de caractère que tu souhaites. Le bouton "close" enverra l'autre chaine de caractère et fermera le port com et supprimera l'objet associé au port com.


    Cordialement,
    Christophe Halgand

    PS : Quel type de port utilises-tu ? Est-ce un port USB ? Peux tu nous montrer à quoi ressemble ce que tu obtiens dans la command window ?
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    salut,
    j'utilise un port serie RS232.
    Dans la command window j'obtiens des chiferes de 0 à 255, dont le but de tracer une spectre avec ces chiferes .

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour

    Si j'ai bien compris, tu utilises ces lignes de code pour lire les données sur ton cable DB9 avec la norme RS232 pour le codage de tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:3;
        x=fgetl(s)
    end
    En matlab, le fait de ne pas utiliser l'index de ta boucle va engendrer que x ne va contenir que le troisième "fgetl". Pour t'en rendre compte, tu peux changer le code ci-dessus par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1:3;
        x=fgetl(s);
    end
    x
    Ensuite, y'a t'il un séparateur (exemple tabulation) dans ta ligne de texte (x) ? Peux-tu nous montrer les 20 premiers caractères, en faisant un copier/coller de ce que tu obtiens dans ta command window ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1:3;
        x=fgetl(s);
    end
    x(1:20)
    Cordialement,
    Christophe Halgand
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Re,

    Une fois que tu as obtenu ta ligne de texte, c'est-à-dire x, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [outstring,newpos] = textwrap(hgui.text,string);
    set(handle(8),'String',outstring,'Position',newpos);
    Sachant que tu dois avoir créer un uicontrol de type edit, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    handle(8)=uicontrol('style','text',...
            'units','normalized',...
            'position',[0.02 0.075 0.4 0.1],...
            'string','data');
    Cordialement,
    Christophe Halgand
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    salut,
    si j'applique cette code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     for i=1:3;
        x=fgetl(s);
    end
    x
    dans la Command Window je trouve sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    x =
    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
    Warning: The input buffer was filled before the Terminator was
    reached.
    x =
    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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
    Warning: A timeout occurred before the Terminator was reached.
    x =
    184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
    mon but c'est : -donner l'ordre pour arrêter l'affichage (deux boutons start/close) le bouton start fonctionne mais l'autre non
    -afficher cet résultat (qui se trouve dans la Command Window) dans une interface
    -tracer une spectre à partir de ces chiffres

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    Comme te dis Matlab, tu as déjà problème de lecture de tes données... Ensuite, tu nous dis vouloir faire un bouton qui lance un affichage et un bouton pour arrêter l'affichage. Ca pourrait fonctionner si les données qui arrivent du PIC sont en flux continu, hors là tu as un vecteur... De ce que j'en comprends, tu veux lancer le pic à envoyer des valeurs en continu de 0 à 255 lorsque tu appuies sur le bouton start et tu veux qu'il arrête d'envoyer des valeurs lorsque tu vas appuyer sur le bouton stop. Entre le moment où tu appuies sur le bouton start et le bouton stop, tu voudrais que matlab affiche ces valeurs ?

    SI c'est ça, personnellement, j'utilise un câble USB qui m'a permis d'utiliser le buffer du port COM. Dans le pic, il m'a fallu deux tableaux car pendant que j'en utilisais un pour envoyer, l'autre se remplissait.

    Vais-je dans la bonne direction ?

    Cordialement,
    Christophe Halgand
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    salut,
    j'ai pas un problème de lecture de donner, et j'ai trouver une solution pour lancer et stopper le programme et afficher le résultat dans l’interface avec cette code sur MATLAB :
    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
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %DEBUT DE LA FONCTION PRINCIPALE%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    function gui_globales
     
    % Définition de nCompteur et handles comme variables globales dans chaque fonction et sous-fonction
    % nCompteur : valeur courante du compteur (scalaire)
    % handles : identifiants des objets graphiques (vecteur)
    global a handles
    global close handles
    global s handles
     
    % Initialisation 
    a='  ';
    close=0;
    s=serial('com1','baudrate',9600,'databits',8,'stopbits',1,'Terminator','CR')
    fopen(s)
     
    %Ouverture de la fenetre
    %-------------------------------------------------------------
    handle(1) = figure('Name','interface de commande',...
    'Position',[300, 85, 1000, 800],...
    'menubar','none');
    %-------------------------------------------------------------
    %Bouton : ouvrir : start
    handle(2) = uicontrol('pos',[800,500,160,40],...
    'style','pushbutton',...
    'callback',@start,...
    'String','start ',...
    'SelectionHighlight','on',...
    'tag','bt1',...
     'backgroundcolor','blue');
    %Bouton : stop
    handle(3) = uicontrol('pos',[800,400,160,40],...
    'style','pushbutton',...
    'callback',@stop,...
    'String','stop',...
    'tag','bt2',...
    'backgroundcolor','red');
     
     
    % afficher les données
    handles(4)=uicontrol('style','text',...
        'units','normalized',...
        'position',[0.1 0.2 0.6 0.5],...
        'string','start boutton',...
    'HorizontalAlignment','left');
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %DEBUT DE LA FONCTION START%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    function start(obj,event)
    a=[];
    global close handles
    global a handles
    global s handles
     
     
     
    fprintf(s,'2');
     
        for i=1:13;
     
           if   close==1 
              fprintf(s,51);
     
     
             break ;
     
          end;
     
            x=fgetl(s);  
     
         a= [a x];
     
         set(handles(4),'string',num2str(a));
         pause(0.01);
        end;
     
     
    fclose(s); 
    delete(s);
    clear s;
     
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %debut de la fonction stop%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    function stop(obj,event)
     
        global a handles
        global close handles
        global s handles
      close=1;
     
     
     
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION stop%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    mais le code affiche les chiffres ligne par ligne comme une chaine de caractères à cause de la fonction fgetl et mon but c'est de lire chiffre par chiffre si vous pouvez aider moi.
    mercii

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    Je dis que tu as un problème de lecture car fgetl s'attends à ce que tu es un caractère de nouvelle ligne et qui ne le trouve pas tout le temps. Ce n'est donc pas la meilleure solution bien que ça reste un warning... As-tu essayer la fonction fread(s) ? Cette fonction te donnera des nombres plutôt qu'une chaîne de caractère.

    Deuxième chose : Quel est le caractère entre tes chiffres ? Des espaces ou des tabulations ? Pour extraires les chiffres, tu peux utiliser les fonctions strfind et str2double

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    a='1 2 3 4'
    a =
    1 2 3 4
    >> positionDesEspaces=strfind(a,' ')
    positionDesEspaces =
         2     4     6
     
    b=sprintf('%s\t%s\t%s','1','2','3')
    b =
    1	2	3
    >> positionDesTabulations=strfind(b,char(9))
    positionDesTabulations =
         2     4
    Troisième chose, c'est qu'une fois qu'il aura fait ces 13 itérations, ça ne sert plus à rien de cliquer sur ton bouton CLOSE puisque il n'y aura plus de nouvelles données. Je te conseillerais d'utiliser un timer qui démarre quand tu appuies sur le bouton start et qui s'arrête quand tu appuies sur le bouton stop. Et ce sans fermer ta connexion avec le PIC. C'est à dire que tu pourras recommencer si ça te fais plaisir contrairement à ton code actuel où tu ne peux relancer la réception de tes données...

    Je n'aime pas trop les variables globales, j'utilise plutôt les fonctions imbriquées. Tu as moins de ligne de code et c'est plus clair... Voilà ce que ça donne pour ton code avec
    - un petit try/catch sur l'ouverture du port com au cas où ton pic n'est pas ouvert (comme sur mon ordi par exemple)
    - une fonction de fermeture de ton port com si tu fermes ta fenêtre alors que le port com est toujours ouvert

    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
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %DEBUT DE LA FONCTION PRINCIPALE%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    function gui_globales
     
    % Initialisation 
    a='  ';
    close=0;
    s=serial('com1','baudrate',9600,'databits',8,'stopbits',1,'Terminator','CR')
    try
        fopen(s)
    catch
        disp('PIC not connected')
    end
     
    %Ouverture de la fenetre
    %-------------------------------------------------------------
    handle(1) = figure('Name','interface de commande',...
    'Position',[300, 85, 1000, 800],...
    'menubar','none',...
    'CloseRequestFcn',@my_closereq);
    %-------------------------------------------------------------
    %Bouton : ouvrir : start
    handle(2) = uicontrol('pos',[800,500,160,40],...
    'style','pushbutton',...
    'callback',@start,...
    'String','start ',...
    'SelectionHighlight','on',...
    'tag','bt1',...
     'backgroundcolor','blue');
    %Bouton : stop
    handle(3) = uicontrol('pos',[800,400,160,40],...
    'style','pushbutton',...
    'callback',@stop,...
    'String','stop',...
    'tag','bt2',...
    'backgroundcolor','red');
     
     
    % afficher les données
    handles(4)=uicontrol('style','text',...
        'units','normalized',...
        'position',[0.1 0.2 0.6 0.5],...
        'string','start boutton',...
    'HorizontalAlignment','left');
     
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %DEBUT DE LA FONCTION START%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function start(obj,event)
            a=[];
            fprintf(s,'2');
            for i=1:13;
                if   close==1
                    fprintf(s,51);
                    break
                end
                x=fgetl(s);  
                a= [a x];
                set(handles(4),'string',num2str(a));
                pause(0.01);
            end
            if ishandle(s)
                fclose(s); 
                delete(s);
                clear s;
            end
        end
     
     
        %%%%%%%%%%%%%%%%%%%%%%%%%%%
        %debut de la fonction stop%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%
        function stop(obj,event)
            close=1;
        end
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %FIN DE LA SOUS-FONCTION stop%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %debut de la sous-fonction fermeture GUI%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function my_closereq(obj,evt)
            selection = questdlg('Close This Figure?',...
                'Close Request Function',...
                'Yes','No','Yes');
            switch selection,
                case 'Yes',
                    if ishandle(s)
                        fclose(s);
                        delete(s)
                        clear s
                    end
                    delete(gcf)
                case 'No'
                    return
            end
        end
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %fin de la sous-fonction fermeture GUI%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    end
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

Discussions similaires

  1. [Interface] Communication entre Matlab et C++ Builder XE2
    Par Mercusyo dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/11/2013, 10h06
  2. Comment faire une communication entre MATLAB 7.6 et FEMM 4.2
    Par said_belhadj dans le forum MATLAB
    Réponses: 5
    Dernier message: 13/04/2013, 21h25
  3. Réponses: 1
    Dernier message: 27/08/2010, 09h16
  4. [visual C++/Matlab] communication entre les deux
    Par Bilouzzz dans le forum MFC
    Réponses: 2
    Dernier message: 15/10/2005, 05h05

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