Вы находитесь на странице: 1из 3

1

PUERTO SERIAL USANDO MATLAB


El siguiente cdigo est escrito para la siguiente situacin:
Un dispositivo (para el caso en que se us este programa fue un
pic) est conectado a travs de un circuito a tres sensores: voltaje,
corriente y frecuencia. Mediante un conversor A/D enva al puerto
serial de la PC (a 9600 bauds) los datos en cdigo Ascii como
siguen:
1. El dispositivo enva primero una "A" (cod. Ascii 65) as el
programa en Matlab sabe que llegarn los dotos de una
muestra de corriente que se guardar en el vector A.
2. Para la muestra de corriente siempre llegarn cuatro
caracteres, por ejemplo, para 0.134 amperios, el dispositivo
enviar al puerto serial los cdigos Ascii de los caracteres "0",
".", "1", "3" y "4".
3. El dispositivo enva a continuacin una "B" (cod. Ascii 66) as
el programa en Matlab sabe que llegarn los dotos de una
muestra de voltaje que se guardar en el vector V.
4. Para la muestra de voltaje siempre llegarn cuatro caracteres,
por ejemplo, para 5.250 voltios, el dispositivo enviar al puerto
serial los cdigos Ascii de los caracteres "5", ".", "2", "5" y "0".
5. El dispositivo enva a continuacin una "F" (cod. Ascii 70) as
el programa en Matlab sabe que llegarn los dotos de una
muestra de frecuencia que se guardar en el vector F.
6. Para la muestra de frecuencia no se sabe cuntos caracteres
llegarn. Si se miden 50 Hz llegarn dos caracteres: "5" y "0".
Si se miden 1550 Hz llegarn cuatro caracteres: "1", "5", "5" y
"0". Nadie sabe cuantos caracteres llegarn, slo se sabe que
stos se terminan cuando se recibe nuevamente una "A" y
todo el ciclo (desde el paso 1) se vuelve a repetir.
El programa almacenar cien muestras por cada parmetro ledo
(voltaje, corriente y frecuencia), las almacenar en sus respectivos
vectores y mostrar estos en una grfica en pantalla. Todo esto se
repetir ochenta veces. Entonces el programa cierra el puerto y
finaliza.

El cdigo completo del programa es el siguiente:


clear all;
close all;
clc;
PS=serial('COM1');
set(PS,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(PS,'StopBits',1); % se configura bit de parada a uno
set(PS,'DataBits',8); % se configura que el dato es de 8 bits, debe
estar entre 5 y 8
set(PS,'Parity','none'); % se configura sin paridad
set(PS,'Terminator','CR/LF');% c caracter con que finaliza el envo
set(PS,'OutputBufferSize',1); % n es el nmero de bytes a enviar
set(PS,'InputBufferSize' ,1); % n es el nmero de bytes a recibir
set(PS,'Timeout',5); % 5 segundos de tiempo de espera
fopen(PS);
A=[]; %corriente
V=[]; %voltaje
F=[]; %frecuencia
A1=[]; %temp corriente
V1=[]; %temp voltaje
F1=[]; %temp frecuencia
Ch=0;
disp('presione enter para iniciar captura (solo se puede parar la
ejecucion mediante control-C)');
pause;
inn=1;
frec=0;
while inn<80
for j=1:100
if frec==65
Ch=frec;
else
Ch=fread(PS,1,'uchar'); % Ch: variable donde se almacena el dato
leido del puerto
end;
switch Ch
case 65
for k=1:4
A1 = [A1 fread(PS,1,'uchar')];
end;
frec=0;
case 66
for k=1:4
V1 = [V1 fread(PS,1,'uchar')];
end;
frec=0;
case 70
F1 = [F1 fread(PS,1,'uchar')];
while frec ~=65

3
frec= fread(PS,1,'uchar');
if frec ~=65
F1 = [F1 frec];
end;
end;
otherwise
continue;
end;
A1=char(A1); V1=char(V1); F1=char(F1); % conv ascii a caract
A=[A str2num(A1)]; % convierte de caract a numero
V=[V str2num(V1)];
F=[F str2num(F1)];
A1=[];
V1=[];
F1=[];
end;
A=A*200/5; V=V*24/5;
figure(1)
colordef(1,'black');
subplot(4,1,1)
plot(A,'r');
xlabel('tiempo')
ylabel('Amperios');
% axis([0 length(A) 0 225]);
subplot(4,1,2)
plot(F,'m');
xlabel('tiempo')
ylabel('Hz');
% axis([0 length(F) 0 10000]);
subplot(4,1,3)
plot(V,'b');
xlabel('tiempo')
ylabel('Voltios');
% axis([0 length(V) 0 30]);
subplot(4,1,4)
% plot(F,'m');
plot(F,A)
xlabel('Frecuencia')
ylabel('Corriente')
% xlabel('tiempo')
% ylabel('Hz');
axis([0 length(F) 0 length(A)]);
% axis([0 length(F) 0 10000]);
pause(0.1);
A=[]; %corriente
V=[]; %voltaje
F=[]; %frecuencia
inn=inn+1;
end;
fclose(PS);
delete(PS);
clear PS;