
Data Serial por Matlab
Publicado por Pedro (2 intervenciones) el 25/08/2014 19:51:56
Hola,
Tengo un programa que lee data serial en RS232 que llega por el puerto COM5. Una parte de la cadena que llega la almaceno en un vector y la voy graficando con respecto al tiempo.
Se que el programa no es la mejor forma de hacer el manejo de la data pero es la forma que encontre.
MI PREGUNTA ES:
mi cadena tiene mas datos que me gustaria tomar y plotear tambien...para ser especificos tengo tres angulos (roll, pitch, yaw) y tres aceleraciones (ejes x, y, z) pero por el momento solo estoy graficando la aceleracion en X.
Como puedo agregar mas graficos a mi programa? quiero poner los tres angulos en un grafico y las tres aceleraciones en otro grafico, pero conservando el movimiento "scroll".
dejo el codigo por aqui:
clear all
clc
close all
%newobject = instrfind;
%fclose(newobject);
%propiedades definidas por el usuario
% define puerto COM #
serialPort = 'COM5';
% titulo del pot
plotTitle = 'Aceleración en el eje X';
% eje-x etiqueta
xLabel = 'Tiempo (s)';
% eje-y etiqueta
yLabel = 'Data (g)';
% 'off' para apagar el grid
plotGrid = 'on';
% y-min
min = -1.5;
% y-max
max = 1.5;
% periodo de ploteo
scrollWidth = 10;
% asegurar tiempo de muestreo mayor que la resolucion
delay = .01;
%definimos variables de la funcion
tiempo = 0;
cuenta = 0;
%BA = 0;
%EA = 0;
%HA = 0;
XA = 0;
YA = 0;
%ZA = 0;
%configuracion del plot
plotGraph = plot(tiempo,XA,...
'r',...
'LineWidth',1,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[.49 1 .63],...
'MarkerSize',2);
title(plotTitle,'FontSize',25);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
axis([0 10 min max]);
grid(plotGrid);
%definimos el puerto serial a utilizar
s = serial(serialPort);
%configuramos el baudrate del puerto
set(s,'BaudRate',9600);
set(s,'Terminator',13);
%abrimos el puerto serial
disp('Cerrar la figura para detener el programa');
fopen(s);
%definimos la matriz de almacenamiento
OUT = '';
tic
while ishandle(plotGraph);
dat = fscanf(s);
long = length(dat);
for i=1:long
out=dat(i);
if out ~= 'i' && out ~= 'I'
OUT = [OUT out];
else
val = OUT;
if length(val) < 63
val = ['0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0'];
end
cuenta = cuenta + 1;
tiempo(cuenta) = toc;
%BA(cuenta) = str2num(val(1:7));
%EA(cuenta) = str2num(val(8:13));
%HA(cuenta) = str2num(val(14:19));
XA(cuenta) = str2num(val(20:25));
%YA(cuenta) = str2num(val(26:31));
%ZA(cuenta) = str2num(val(32:37));
%Set Axis according to Scroll Width
if(scrollWidth > 0)
set(plotGraph,'XData',tiempo(tiempo > tiempo(cuenta)-scrollWidth),...
'YData',XA(tiempo > tiempo(cuenta)-scrollWidth));
axis([tiempo(cuenta)-scrollWidth tiempo(cuenta) min max]);
else
set(plotGraph,'XData',tiempo,'YData',XA);
axis([0 tiempo(cuenta) min max]);
end
pause(delay);
OUT = '';
end
end
end
fclose(s);
disp('Lectura terminada...');
Gracias
Tengo un programa que lee data serial en RS232 que llega por el puerto COM5. Una parte de la cadena que llega la almaceno en un vector y la voy graficando con respecto al tiempo.
Se que el programa no es la mejor forma de hacer el manejo de la data pero es la forma que encontre.
MI PREGUNTA ES:
mi cadena tiene mas datos que me gustaria tomar y plotear tambien...para ser especificos tengo tres angulos (roll, pitch, yaw) y tres aceleraciones (ejes x, y, z) pero por el momento solo estoy graficando la aceleracion en X.
Como puedo agregar mas graficos a mi programa? quiero poner los tres angulos en un grafico y las tres aceleraciones en otro grafico, pero conservando el movimiento "scroll".
dejo el codigo por aqui:
clear all
clc
close all
%newobject = instrfind;
%fclose(newobject);
%propiedades definidas por el usuario
% define puerto COM #
serialPort = 'COM5';
% titulo del pot
plotTitle = 'Aceleración en el eje X';
% eje-x etiqueta
xLabel = 'Tiempo (s)';
% eje-y etiqueta
yLabel = 'Data (g)';
% 'off' para apagar el grid
plotGrid = 'on';
% y-min
min = -1.5;
% y-max
max = 1.5;
% periodo de ploteo
scrollWidth = 10;
% asegurar tiempo de muestreo mayor que la resolucion
delay = .01;
%definimos variables de la funcion
tiempo = 0;
cuenta = 0;
%BA = 0;
%EA = 0;
%HA = 0;
XA = 0;
YA = 0;
%ZA = 0;
%configuracion del plot
plotGraph = plot(tiempo,XA,...
'r',...
'LineWidth',1,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[.49 1 .63],...
'MarkerSize',2);
title(plotTitle,'FontSize',25);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
axis([0 10 min max]);
grid(plotGrid);
%definimos el puerto serial a utilizar
s = serial(serialPort);
%configuramos el baudrate del puerto
set(s,'BaudRate',9600);
set(s,'Terminator',13);
%abrimos el puerto serial
disp('Cerrar la figura para detener el programa');
fopen(s);
%definimos la matriz de almacenamiento
OUT = '';
tic
while ishandle(plotGraph);
dat = fscanf(s);
long = length(dat);
for i=1:long
out=dat(i);
if out ~= 'i' && out ~= 'I'
OUT = [OUT out];
else
val = OUT;
if length(val) < 63
val = ['0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0' '0' '0'...
'0' '0' '0'];
end
cuenta = cuenta + 1;
tiempo(cuenta) = toc;
%BA(cuenta) = str2num(val(1:7));
%EA(cuenta) = str2num(val(8:13));
%HA(cuenta) = str2num(val(14:19));
XA(cuenta) = str2num(val(20:25));
%YA(cuenta) = str2num(val(26:31));
%ZA(cuenta) = str2num(val(32:37));
%Set Axis according to Scroll Width
if(scrollWidth > 0)
set(plotGraph,'XData',tiempo(tiempo > tiempo(cuenta)-scrollWidth),...
'YData',XA(tiempo > tiempo(cuenta)-scrollWidth));
axis([tiempo(cuenta)-scrollWidth tiempo(cuenta) min max]);
else
set(plotGraph,'XData',tiempo,'YData',XA);
axis([0 tiempo(cuenta) min max]);
end
pause(delay);
OUT = '';
end
end
end
fclose(s);
disp('Lectura terminada...');
Gracias
Valora esta pregunta


0