Introduction Matlab - Compléments GUI
1
Création d'une interface graphique
Une interface graphique permet de contrôler une application interactivement avec la souris ,
plutôt que par lancement des commandes au clavier.
Une interface graphique comprend des menus, des boutons, des "ascenseurs", des cases à
cocher, des listes de choix, des zones de texte. Exemple d'interface :
Elle permet de "cliquer" directement sur des images, des graphiques ou des objets pour
modifier la valeur d'une variable, déclencher des fonctions ou simplement faire apparaître des
informations lors d'un survol à la souris.
Matlab permet d'écrire assez simplement une interface graphique pour faire une application
interactive utilisable par des utilisateurs non formés à Matlab.
Les notions principales d'une interface graphique sont :
- les divers objets graphiques, auxquels sont attribués des noms symboliques; ces "poignées
de main" ou "handles" permettent de les repérer dans l'interface; pour envisager par exemple une
modification dynamique (grisé d'un bouton provisoirement non utilisable, changement du texte d'un
bouton, modification d'une liste de choix...)
- les propriétés des objets (couleur, disposition, taille, variable associée)
- les fonctions exécutées par les clic souris sur les éléments ou "callbacks" (décrites en ligne
de commande Matlab ).
Les versions actuelles de Matlab permettent de construire ces interfaces directement avec la
souris grâce au GUIDE (Graphical User Interface Development Environment). Cet outil est capable
de construire des applications de très haut niveau. Cependant, son approche est très délicate pour un
utilisateur peu expérimenté. L'approche classique par description textuelle de l'interface, moins
performante mais compréhensible, permet de se familiariser avec les principales notions.
Ce polycopié permet de faire une approche progressive du GUI; les exemples sont
opérationnels et sont à tester pour se familiariser.
Pierre Bonnet - USTL
Introduction Matlab - Compléments GUI
2
I - Elements de base de l'interface graphique
Pour créer une interface, il faut disposer d'une fenêtre de base dans laquelle seront insérés les
éléments graphiques (objets).
A noter que tout dessin graphique ou affichage d'image (résultat de plot, mesh, imshow) peut
servir de fenêtre de base.
Création d'une nouvelle fenêtre pour application:
fig1 = figure
Le paramètre fig1 est le handle de la fenêtre, c'est à dire le numéro de repère de la fenêtre
attribué par Matlab à sa création. Il est possible d'appliquer des fonctions sur cette fenêtre
(redimensionnement, ajout de menus, boutons, ...) en précisant dans les fonctions le handle auquel
elle s'applique. La fenêtre active à un instant donné a pour handle implicite gcf .
De façon générale, tout objet graphique se voit attribué un handle; ce handle sert de
référence à cet objet dans l'application.
Propriétés d'une fenêtre graphique (ou d'un objet)
get(fig1)
Les principales propriétés sont : le titre, la position et la dimension dans l'écran, la couleur de
fond, la présence et le type de menus, le redimensionnement...
Toute propriété particulière est obtenu par :
valeur_propriété = get( fig1, 'nom_propriété' )
Toute propriété (modifiable!) peut être modifiée en définissant une nouvelle valeur pour la
propriété considérée (valeur numérique, chaîne, liste de valeur, tableau...)
set(fig1, 'nom_propriété' , valeur_propriété )
Ex : set( fig1 , 'Name' , 'Demo GUI' , 'NumberTitle' , 'off' );
La fenêtre de base est l'écran qui a pour handle "0". Par get (0 , 'ScreenSize' ), on obtient la
taille de l'écran physique de l'écran. Ces valeurs permettent de fixer la taille d'une fenêtre en rapport
avec la dimension physique de l'écran et d'éviter de créer une application qui "déborde" de l'écran!
La taille et la position de la fenêtre (ou d'un objet) se fixent par modification de sa propriété
ou contrôle "position", comprenant les coordonnées (Xor,Yor) du coin inférieur gauche et ses
dimensions (Xfen,Yfen):
set( fig1 , 'position' , [ 10 , 10 , 300
, 200 ])
L'ensemble des propriétés modifiables d'un objet est donné par set(handle_objet) . La liste
s'affiche avec les valeurs possibles pour les différentes propriétés; les valeurs par défaut sont
signalées par des crochets { } . Exemple :
set( fig1 )
Tout objet graphique créé pourra être supprimé par :
delete (handle_objet)
La suppression d'un objet entraîne la suppression des objets qui lui sont liés (objets fils).
Pierre Bonnet - USTL
Introduction Matlab - Compléments GUI
3
Insertion d'un Objet dans la fenêtre
L'insertion d'un objet dans une fenêtre se fait par la fonction "uicontrol" , dont le premier
paramètre est le handle de la figure de référence. Le deuxième paramètre précise le "style" ou type
d'objet à insérer.
Exemple le "texte fixe" est l'objet le plus simple; il permet de placer un texte dans la fenêtre.
text1 = uicontrol( fig1 , 'style' , 'text' , 'position' , [100,150,170,30] ,...
'string' , 'Bonjour' , 'fontsize' , 15 )
Toutes les propriétés de cet objet peuvent être modifiées par la commande "set" . Par
exemple, le texte en lui-même ('string') étant une propriété, il peut être modifié:
set( text1 , 'string' , 'Au revoir' );
Autre exemple : insertion d'un bouton-radio :
radio1 = uicontrol( fig1 , 'style' , 'radio' , 'String' , 'Option1' , 'Position' , [30,30,60,30] )
A la différence du "texte" , on remarque que cet objet est "cliquable" à la souris, avec
modification de son aspect (cet fonction est prise en charge sans aucune programmation par
l'utilisateur).
II - Principe de l'interaction avec la souris
La presque totalité des objets de l'interface graphique (curseur, case à cocher...) peut
interagir avec la souris.
La fonctionnalité la plus courante est la modification de la valeur associée à l'objet (si elle
existe): pour les objets destinés à faire une saisie (case à cocher, curseur, champ de saisie, choix de
liste...), Matlab gère automatiquement la valeur associée. Cette valeur est récupérable par toute
partie de l'application par la fonction "get" :
valeur = get (handle_objet , 'value');
Cette fonctionnalité permet de saisir la valeur d'une variable par l'interface graphique plutôt
que par le clavier.
La deuxième interaction courante est une action déclenchée par le "clic" souris sur l'objet
(appuyé puis relâché): la fonction associée est décrite dans la propriété "callback" de l'objet. Cette
fonction peut être une instruction de base Matlab ou une fonction définie par l'utilisateur (stockée en
fichier .m)
Pierre Bonnet - USTL
Introduction Matlab - Compléments GUI
4
set( radio1 , 'callback' , 'get( radio1 , ' 'value' ' ) ' );
Remarquer que la fonction est décrite en chaîne de caractères avec des " ' " en début et fin, ce
qui oblige à doubler les " ' " pour ceux qui sont inclus dans la chaîne principale.
Cette description en chaîne permet de définir en callback une liste d'instruction, ce qui évite
d'écrire une multitude de petites fonctions externes dédiées aux callbacks.
Certains objets n'ont pas de callback (cas des figures) mais possèdent d'autres actions
associées à la souris. Leur emploi est identique au callback classique (description de la fonction en
liste d'instructions). Les principales sont :
WindowButtonUpFcn
WindowButtonDownFcn
WindowButtonMotionFcn
Exemple : récupération des coordonnées en pixels de la souris au clic
fig1 = figure ;
set( fig1 , 'WindowButtonDownFcn' , 'get( fig1 , ' 'CurrentPoint ' ' ) ' );
Si on désire obtenir des coordonnées dans l'espace de mesure des axes d'un graphique, plutôt
qu'en pixels de la figure, il faut faire référence aux axes ( gca ) dans la fonction de clic :
plot( 20 , 20 , ' r+ ' ) % tracé d'une croix rouge au centre
set( gcf , 'WindowButtonDownFcn' , 'get( gca , ' 'CurrentPoint' ' ) ' )
Certains objets possèdent une fonction callback et une fonction associée au clic souris (par
exemple : ButtonDownFcn )
III - Principaux Objets Graphiques
Bouton poussoir
Un bouton poussoir se crée par :
bp1= uicontrol ( fig1 , 'style' , 'push' , 'position' , [10 100 60 30 ] ,...
'string' , 'Début' , 'callback' , 'plot(T,X)' )
Lorsqu'on clique sur le bouton poussoir, il provoque l'exécution de la fonction indiquée dans
le 'callback'. Cette fonction peut être une instruction de base Matlab ou une liste d'instruction, ce qui
évite d'écrire une multitude de petites fonctions exécutées pat les callbacks.
Un bouton-poussoir s'inactive par la commande :
set(bp1 , 'enable' , 'off' )
Par cette commande, on peut rendre inactif certaines commandes, par exemple lorsqu'il
manque des informations pour traiter un problème.
Pierre Bonnet - USTL
Introduction Matlab - Compléments GUI
5
Menus
Généralement, les menus de la fenêtre d'application ne sont pas les menus standard (voir vue
ci-dessus mais des menus spécifiques. Un menu est un titre complété par une liste de sous-menu.
Les actions (callbacks)sont généralement lancés à partir des sous-menus. L'ajout de menus
spécifique se fait par :
menu1 = uimenu( fig1 , 'label' , ' Statist.' );
Un sous-menu est un élément du menu principal, donc de l'entité père. Il est donc déclaré car
menu du menu principal.
smenu1 = uimenu( menu1 , 'label' , 'Normale' , 'callback' , 'methode_normale' )
smenu2 = uimenu( menu1 , 'label' , 'Binomiale' , 'callback' , 'methode_binomiale' );
Pour enlever les menus standards de la fenêtre, il faut fixer la propriété "Menubar" à la
valeur par défaut menubar :
set(fig1,'menubar',menubar);
Ascenseur ou slider
L'ascenseur a pour objectif de fixer la valeur d'un paramètre entre deux bornes fixées. La
valeur prise par la variable est représentée par la position du curseur .
slid1=uicontrol(fig1,'style','slider','position', [100,50,150,20] , 'Min' , -1 , 'Max' , 1 , ...
'callback' , 'val_variable = get(slid1 , ''value'' )' );
Les textes (variable affectée, valeurs..) ne sont pas définis par le slider. Il faut le compléter
par des éléments textes convenablement placés et paramétrés; leur valeur est à modifier par le
callback du slider.
Exemple d'ascenseur avec affichage de la valeur:
fig1=figure;
texte1=uicontrol(fig1,'Style','text','String',0,'Position', [140,70,80,20],'BackGroundcolor','w');
slid1=uicontrol(fig1,'style','slider','position', [100,50,150,20] , 'Min' , -1 , 'Max' , 1 , ...
'callback' , 'set(texte1,''String'', get(slid1 , ''value'' ))' );
Pierre Bonnet - USTL
Introduction Matlab - Compléments GUI
6
Texte Editable
Permet à l'utilisateur de saisir une valeur. C'est une fonction importante.
Text1 = uicontrol ( fig1 , 'style' , ' edit' , 'position', [100,50,150,20] , 'Max' , 1 , 'string' , '0' );
Généralement, Il faut associer un texte fixe pour préciser le rôle de la fenêtre de saisie à
l'utilisateur. Exemple : le texte est placé à gauche de la fenêtre de saisie
uicontrol ( fig1 , 'style' , ' texte' , 'position', [10,50,90,20] , 'string' , 'Valeur A' );
Liste de choix
La liste de choix ou pop-up menu permet de sélectionner une valeur parmi une liste.
Généralement, cette valeur est un texte . La valeur retournée lors du choix (paramètre 'Value') est le
numéro de ligne du choix.
choix1 = uicontrol ( gcf , 'Style' , 'popup' , 'String' , 'Pierre|Paul|Jacques' , 'Position' , [10 10 100 80] );
La liste des texte est modifiable après la création de la fenêtre de choix, en modifiant la
propriété 'String' .
Bouton Radio
Le bouton Radio permet de fixer un paramètre binaire ( 0 ou 1 ), représentant souvent un
choix ou une option dans une application.
fig1 = figure ;
radio1 = uicontrol( fig1 , 'style' , 'Radio' , 'Position' , [ 30 20 130 25 ] , 'String' , ' OptionA ' );
radio2 = uicontrol( fig1 , 'style' , 'Radio' , 'Position' , [ 30 45 130 25 ] , 'String' , ' OptionB ' );
uicontrol( fig1 , 'style' , 'Text' , 'Position' , [ 30 70 130 30 ] , 'String' , ...
' Choix des Options ' , 'FontWeight', 'bold' );
Pierre Bonnet - USTL
Introduction Matlab - Compléments GUI
7
Remarquer que les choix ne sont pas exclusifs (chaque choix peut être sélectionner). Pour
obtenir l'exclusion mutuelle, il faut agir sur les valeurs de choix par les callbacks.
set( bradio1 , ' Value' , 1 );
set( radio1 , 'callback' , 'set( radio2 , ' ' Value' ' , 0 ) ' ) ;
set( radio2 , 'callback' , 'set( radio1 , ' ' Value' ' , 0 ) ' ) ;
Cadre
Le cadre permet de dessiner un rectangle de présentation (par exemple regroupement de
diverses entités graphiques dans un rectangle).
Le cadre se déclare par :
cadre1 = uicontrol ( fig1 , 'style' , 'frame' , 'position' , [ posX ,posY,tailleX,tailleY])
Graphiques
Les graphiques se dessinent dans une partie de la fenêtre définie par la fonction 'subplot',
dont les paramètres sont différents de l'emploi classique (division de la fenêtre en sous-fenêtres de
taille égale)
subplot( 'Position' , [ Xpos Ypos Xtaille Ytaille])
Les paramètres se définissent en % de la fenêtre (redimensionnement automatique des zones
graphiques avec le redimensionnement de la fenêtre). Il est possible d'ouvrir plusieurs zones
graphiques dans une même fenêtre. Les zones ne doivent pas se chevaucher, sous peine
d'effacement de la zone située sous la nouvelle zone.
fig1 = figure ;
z1 = subplot ( 'Position' , [ .05 .1 .4 .4 ] ) ;
plot ( sin( 0: 10))
z2 = subplot ( 'Position' , [ .55 .1 .4 .4 ] ) ;
plot ( exp( 0 : 10))
Pierre Bonnet - USTL
Note d’application
Acquisition de
données séries
binaires via une
interface
graphique
Matlab®
P09AB08 : Odométrie ferroviaire par fusion de données
accélérométriques et GPS
Présentation
Cette note d’application a pour but de présenter une manière simple et efficace de
réaliser l’acquisition sur PC de données séries binaires pour permettre un traitement
ultérieur.
L’outil choisi est Matlab®, pour la polyvalence qu’il permet en aval de l’acquisition.
Matlab® fonctionne à partir d’un langage interprété dont les bases ne sont pas l’objet de
cette note. Un minimum de connaissances dans la syntaxe et la gestion des objets graphiques
(figures, axes… ) est recommandé pour une bonne compréhension.
L’intérêt de l’utilisation d’un GUI pour l’acquisition de données série est de pouvoir
paramétrer de façon simple la connexion et de pouvoir sauvegarder facilement le résultat.
Page 1 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
Présentation ..........................................................................1
1 Rappels sur la liaison série .............................................4
1.1 Format des données .......................................................................................................... 4
1.2 Interface série sur PC ........................................................................................................ 4
2 Présentation du GUI Matlab® utilisé ...........................4
2.1 Fonctionnalités..................................................................................................................... 4
2.2 Structure ............................................................................................................................... 5
3 Structure serial..............................................................7
4 Précautions d’usage .........................................................8
4.1 Allocation dynamique/Pré allocation.............................................................................. 8
4.2 Ouverture/fermeture de ports......................................................................................... 9
4.3 Vidage du buffer d’entrée ................................................................................................ 9
5 Exemple des callbacks liés aux éléments du GUI.....10
5.1
5.2
5.3
5.4
5.5
5.6
Bouton – Ouvrir port ...................................................................................................... 10
Bouton – Fermer port .................................................................................................... 11
Bouton – Lancer acquisition ......................................................................................... 11
Bouton – Stopper acquisition ....................................................................................... 12
Bouton – Mise en forme des données....................................................................... 12
Bouton – Sauver Données ............................................................................................ 12
6 Synchronisation des données reçues ..........................13
6.1 Différences avec la réception de données ASCII .................................................... 13
6.2 Réception de données complexes............................................................................... 13
Bibliographie ........................................................................14
Contacts................................................................................14
Page 2 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
Code 1 : GUI contenu dans acquisition_serie_donnees.m ....... 7
Code 2 : Callback - Ouvrir port..................................................... 10
Code 3 : Callback – Fermer port .................................................... 11
Code 4 : Callback – Lancer acquisition.......................................... 11
Code 5 : Callback – Stopper acquisition ........................................ 12
Code 6 : Callback – Sauvegarde des données................................. 12
Figure 1 : Visualisation de l'interface .............................................. 5
Figure 2 : Propriétés de l’objet serial (sous Windows®) .............. 8
Figure 3 : Perte de données par non vidage du buffer .................... 9
Tableau 1 : Format d'une trame RS232........................................... 4
Tableau 2 : Exemples de constructeurs des objets sériels ............... 7
Page 3 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
1 Rappels sur la liaison série
1.1 Format des données
Le format RS232 définit la transmission de données sous forme de trames,
comprenant un paquet de données de 5 à 8 bits.
Bit0
Longueur
1
Signification Start
Bit1
1
D0
Bit2
1
D1
Bit3
1
D2
Bit4
1
D3
Bit5
1
D4
Bit6 Bit7 Bit8
Bit9 Bit10
0–1 0–1 0–1 0–1 1-2
D5
D6
D7 Parité Stop
Tableau 1 : Format d'une trame RS232
Nous traiterons dans le cadre de cette note des données 8 bits sans vérification de
parité, et avec un bit de stop.
Ceci permet de transmettre la majorité des données binaires : par exemple, la
réception d’une donnée 8, 16, 32 bits peut se faire respectivement par la réception d’une, de
deux, ou de quatre trames 8 bits.
1.2
Interface série sur PC
La liaison série sur PC, et principalement son connecteur associé (DB9) tend à
disparaître des nouvelles machines. De nombreux adaptateurs série USB permettent
d’émuler des ports séries et donc de contourner le problème de connectique.
Tous les systèmes d’exploitation courants sont capables de gérer ce type de
périphériques, mais il faut noter que la plupart ne proposent que des drivers Windows®.
2 Présentation du GUI Matlab® utilisé
2.1
Fonctionnalités
Le GUI1 utilisé ici a été créé dans un but de simplicité. Il doit permettre l’ouverture
d’un port série directement sur Matlab®, et proposer la configuration de la vitesse et du
port à utiliser.
Note : Matlab® n’est pas en mesure de détecter directement les ports connectés à un
périphérique. Il est nécessaire d’avoir identifié au préalable, via le système d’exploitation par
exemple, le port série concerné.
On a donc les fonctionnalités suivantes :
•
•
•
•
1
Ouverture, fermeture d’un port série
Configuration des paramètres de bases de la liaison (vitesse, port)
Lancement, et arrêt de l’acquisition
Mise en forme des données (totalement dépendant de l’application)
GUI : Graphic User Interface
Page 4 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
•
Sauvegarde des données produites.
Figure 1 : Visualisation de l'interface
2.2
Structure
Voici un aperçu d’une version simple du GUI.
%------------------------------------------------------------%Creation du GUI
%------------------------------------------------------------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','Lancer acquisition');
%Bouton : stopper acquisition
handle(3) = uicontrol('pos',[250,120,140,30],...
'style','pushbutton',...
'callback',@cb_stop_acquisition,...
'String','Stopper acquisition');
%------------------------------------------------------------%Zone mise en forme et sauvegarde
Page 5 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
%------------------------------------------------------------%Bouton : Mise en forme des données
handle(4) = uicontrol('pos',[250,50,140,30],...
'style','pushbutton',...
'callback',@cb_mise_forme_donnees,...
'String','Mise en forme données');
%Bouton : Sauver donnees
handle(5) = uicontrol('pos',[250,10,140,30],...
'style','pushbutton',...
'callback',@cb_sauv_donnees,...
'String','Sauver données');
%------------------------------------------------------------%Zone paramètres liaison série
%------------------------------------------------------------%Bouton : Ouvrir port
handle(6) = uicontrol('pos',[30,90,80,30],...
'style','pushbutton',...
'callback',@cb_ouvrir_port,...
'String','Ouvrir port');
%Bouton : Fermer port
handle(7) = uicontrol('pos',[135,90,80,30],...
'style','pushbutton',...
'callback',@cb_fermer_port,...
'String','Fermer port');
%Champ de texte : Vitesse du port
handle(8) = uicontrol('pos',[28,148,40,30],...
'style','text',...
'string','Vitesse du port',...
'backgroundcolor',[0.7,0.7,0.7]);
%Champ parametrable de la vitesse
handle(9) = uicontrol('pos',[80,150,80,30],...
'style','edit',...
'string','115200',...
'tag','champ_vitesse');
%Popupmenu choix port serie
handle(10) = uicontrol('pos',[80,120,80,30],...
'style','popupmenu',...
'String',{'COM1','COM2','COM3',...
'COM4','COM5','COM6','COM7',...
'COM8','COM9','COM10'},...
'tag','selection_com');
%------------------------------------------------------------%Zone nom de l'acquisition
%------------------------------------------------------------%Affichage choix du nom
handle(11) = uicontrol('pos',[10,40,180,15],...
'style','text',...
'string','Nom de l''acquisition (.mat)',...
'backgroundcolor',[0.9,0.9,0.9]);
%Champ contenant le nom
handle(13) = uicontrol('pos',[10,20,225,20],...
Page 6 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
'style','edit',...
'string','acquisitions\acquisition.mat',...
'tag','champ_nom');
%------------------------------------------------------------data=guihandles(gcf);
guidata(gcf,data);
%------------------------------------------------------------%Fin : Creation du GUI
%------------------------------------------------------------Code 1 : GUI contenu dans acquisition_serie_donnees.m
3 Structure serial
L’objet serial permet l’accès aux différents ports série d’une machine. Plusieurs
possibilités existent pour l’ouverture d’un port, suivant le système d’exploitation.
Système d’exploitation
Linux / Linux 64
Mac OS
Solaris 64
Windows 32/64
Constructeur type
serial('/dev/ttyS0');
serial('/dev/tty.KeySerial1');
serial('/dev/term/a');
serial('com1’);
Tableau 2 : Exemples de constructeurs des objets sériels
L’appel de la primitive serial renvoie un identifieur contenant tous les paramètres de
la liaison série.
Dans le cas où nous l’utilisons :
•
•
•
8 bits
pas de parité
un bit de stop
et vis à vis des valeurs par défaut des propriétés de l’objet serial, il faut configurer au
minimum les champs Port, BaudRate, InputBuffer (choix de la tailler du buffer d’entrée) et
Timeout (si la valeur par défaut de 0.01s ne convient pas à l’application) .
Page 7 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
s = serial('COM1');
set(s)
ByteOrder: [ {littleEndian} | bigEndian ]
BytesAvailableFcn
BytesAvailableFcnCount
BytesAvailableFcnMode: [ {terminator} | byte ]
ErrorFcn
InputBufferSize
Name
OutputBufferSize
OutputEmptyFcn
RecordDetail: [ {compact} | verbose ]
RecordMode: [ {overwrite} | append | index ]
RecordName
Tag
Timeout
TimerFcn
TimerPeriod
UserData
SERIAL specific properties:
BaudRate
BreakInterruptFcn
DataBits
DataTerminalReady: [ {on} | off ]
FlowControl: [ {none} | hardware | software ]
Parity: [ {none} | odd | even | mark | space ]
PinStatusFcn
Port
ReadAsyncMode: [ {continuous} | manual ]
RequestToSend: [ {on} | off ]
StopBits
Terminator
Figure 2 : Propriétés de l’objet serial (sous Windows®)
4 Précautions d’usage
4.1
Allocation dynamique/Pré allocation
Ce point est critique dans la réception des données. L’acquisition série sous Matlab®,
en flux continu et avec un débit élevé (au delà de quelques ko.s-1), ne peut pas se faire
directement sur un vecteur de taille inconnue au départ. L’augmentation constante de la
taille du vecteur force une série de réallocations qui ont pour effet de provoquer une perte
de données à chaque fois.
La technique la plus simple consiste à préallouer un vecteur de taille suffisante au
regard du débit et de la durée d’acquisition.
Page 8 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
4.2
Ouverture/fermeture de ports
La gestion des ports série est rigoureuse dans Matlab®. Il est important de toujours
respecter la séquence suivante :
1.
2.
3.
4.
5.
ouverture du port
lancement de l’acquisition
arrêt de l’acquisition
mise en forme ou près traitement si nécessaire
fermeture du port
et en particulier, il faut impérativement éviter (sous peine de devoir relancer Matlab®) :
•
•
•
d’ouvrir deux fois le même port
d’ouvrir un port qui n’est pas connecté
de quitter le GUI sans avoir fermé le port
4.3 Vidage du buffer d’entrée
Lors du démarrage de l’acquisition, si le flux est permanent, il faut impérativement
vider le buffer d’entrée, quelle que soit sa taille.
Données
perdues
Flux série
Lecture
du buffer
Asynchronisme et
perte de données
Ouverture
du port
Fin de
remplissage
du buffer
Début de la
lecture du
buffer
Figure 3 : Perte de données par non vidage du buffer
La perte de données peut être simple si les données n’ont qu’une seule signification,
elle peut être plus complexe à gérer si la réception se fait sous forme de trames : la
synchronisation est perdue.
Page 9 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
5 Exemple des callbacks liés aux éléments du
GUI
5.1 Bouton – Ouvrir port
Cette fonction a pour but de créer l’objet serial avec les paramètres choisis dans le GUI.
%------------------------------------------------------------%Callback : ouvrir port
function cb_ouvrir_port(obj,event)
data=guidata(gcbf);
global s;
%selection du port en fonction du popup menu
switch get(data.selection_com,'value')
case 1,
port = 'COM1';
case 2,
port = 'COM2';
case 3,
port = 'COM3';
case 4,
port = 'COM4';
case 5,
port = 'COM5';
case 6,
port = 'COM6';
case 7,
port = 'COM7';
case 8,
port = 'COM8';
case 9,
port = 'COM9';
case 10,
port = 'COM10';
otherwise,
port = 'COM1';
end;
s = serial(port,'BaudRate', str2num(get(data.champ_vitesse,'string')));
set(s,'InputBuffer', 8192);
fopen(s);
guidata(gcbf,data);
Code 2 : Callback - Ouvrir port
L’objet serial s, assimilable à un fichier, est déclaré en tant que variable globale : en
effet, il doit être accessible par la fonction de fermeture du port, et d’acquisition des
données.
Page 10 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
5.2 Bouton – Fermer port
%------------------------------------------------------------%Callback : fermer port
function cb_fermer_port(obj,event)
data=guidata(gcbf);
global s;
fclose(s);
delete(s);
clear s;
%séquence obligatoire de fermeture de l’objet
guidata(gcbf,data);
Code 3 : Callback – Fermer port
5.3 Bouton – Lancer acquisition
Le démarrage de l’acquisition doit se faire en respectant les règles décrites
précédemment : le buffer d’entrée doit être vidé avant de démarrer, et un vecteur
d’acquisition doit être préalloué.
%------------------------------------------------------------%Callback : start acquisition
function cb_start_acquisition(obj,event)
data=guidata(gcbf);
global out;
global acqu_on;
global s;
limite_taille = 10000000;
out = zeros(1,limite_taille); %préallocation
index = 1;
acqu_on = 1;
%vidage du buffer
flushinput(s);
pause(0.01);
%acquisition, tant que acqu_on =1 et limite de taille non atteinte
while ((acqu_on)&&(index < (limite_taille-get(s,’InputBuffer’)))
nb_octets = get(s,'BytesAvailable');
if nb_octets
out(index:(index + nb_octets - 1)) = fread(s,nb_octets);
index = index + nb_octets;
end;
%rend la main a Matlab pour permettre le passage de acqu_on à 0
pause(0.2);
end;
%suppression des elements non ecrits si arret manuel
out(index:limite_taille) = '';
guidata(gcbf,data);
Code 4 : Callback – Lancer acquisition
Page 11 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
5.4 Bouton – Stopper acquisition
L’arrêt de l’acquisition, s’il n’est pas donné par la saturation du vecteur préalloué
(out) est commandé par la valeur de acqu_on. Le passage à 0 fait sortir le callback
cb_start_acquisition de sa boucle principale.
%------------------------------------------------------------%Callback : stop acquisition
function cb_stop_acquisition(obj,event)
data=guidata(gcbf);
global acqu_on;
acqu_on = 0;
guidata(gcbf,data);
Code 5 : Callback – Stopper acquisition
5.5 Bouton – Mise en forme des données
Cette fonction n’a pas d’intérêt à être présentée ici, étant donné qu’elle dépend
entièrement du type de données reçues. On peut envisager simplement de convertir
plusieurs octets en un nombre de dynamique plus grande, ou reconstituer des chaines de
caractères…
De façon générale, et en accord avec l’interface, cette fonction doit générer un
vecteur ou un tableau, ou une structure donnees_formatees à partir du vecteur out.
5.6 Bouton – Sauver Données
La sauvegarde des données reçues peut se faire sous différentes formes, ici on crée
directement un fichier .mat ouvrable par Matlab®. On peut envisager de tester la fin de la
chaine de caractères du nom (ici get(data.champ_nom,'string') ) pour rajouter si nécessaire
l’extension .mat, mais on peut aussi pour simplifier obliger à saisir nom de fichier contenant
la bonne extension.
%------------------------------------------------------------%Callback : sauvegarde des données
function cb_sauv_donnees(obj,event)
data=guidata(gcbf);
global out;
global donnees_formatees;
%enregistrer sous le nom de champ_nom le vecteur out, et données formatées
save(get(data.champ_nom,'string'),'out','donnees_formatees');
guidata(gcbf,data);
Code 6 : Callback – Sauvegarde des données
Page 12 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
6 Synchronisation des données reçues
6.1
Différences avec la réception de données ASCII
Les caractères ASCII permettent, au prix d’une surcharge d’information (pour le
transfert d’une valeur 8 bits, il faut transférer 2 octets hexadécimaux), de réserver un bon
nombre de caractères comme terminateurs d’une trame série (champ Terminator de
l’objet serial).
La réception de données binaires ne peut pas fonctionner sur le même schéma. Les
trames ne peuvent, par définition, pas être bornées par des valeurs connues, sauf dans
certains cas particuliers.
6.2 Réception de données complexes
Les données reçues via la liaison série mise en œuvre ne sont pas forcement une
succession de valeurs 8 bits représentant une même grandeur. Dans un cas aussi simple,
aucun problème de synchronisation n’est à relever.
Si les données reçues sont plus complexes, i.e. représentant des grandeurs
différentes et/ou de types différents, il faut choisir un motif que l’on peut prévoir a priori.
Il faut garder en tête que des valeurs binaires, sauf si elles sont bornées, peuvent
prendre toutes les valeurs de leur dynamique. Une simple valeur ne peut donc pas servir
artificiellement de terminateur. En revanche, on peut supposer qu’une succession de
plusieurs valeurs connues et dans une séquence connue peut représenter un motif
assimilable à un terminateur. Il convient de s’assurer que la probabilité d’occurrence de ce
motif est très faible parmi les autres données.
Page 13 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS
Note d’application – P09AB08
Acquisition de données séries binaires via une interface graphique Matlab®
Bibliographie
Briot, Jérôme. «Développement efficace des interfaces graphiques.» Devellopez.com. 17 03
2009.
—. «Présentation des objets graphiques.» Developpez.com. 17 03 2009.
RS232 Specifications and standard. http://www.lammertbies.nl/comm/info/RS-232_specs.html
(accès le 01 24, 2010).
Contacts
Cette note d’application a été réalisée par Jean Doucement. Pour toute question ou
précision :
jean.doucement@polytech.univ-bpclermont.fr
ou
jean.doucement@gmail.com
Page 14 sur 14
Projet odométrie ferroviaire par fusion de données
accélérométriques et GPS