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

UNIVERSIDAD CATLICA DE SANTA MARA

FACULTAD DE CIENCIAS E INGENIERAS FSICAS Y


FORMALES
PROGRAMA PROFESIONAL DE INGENIERA MECNICA,
MECNICA ELCTRICA Y MECATRNICA

PUERTO SERIAL CON MATLAB

PROFESOR:
HENRY ZEGARRA
Curso:
MECANICA COMPUTACIONAL II
Semestre:
IV
HECHO POR:
*PAUCA CUARITE CHRISTIAN YOVANNY
AREQUIPA-2014

PUERTO SERIAL CON MATLAB

Este es una forma bsica de conectarse al puerto serial utilizando


matlab.
%configurando puerto y dando de alta s como objeto asociado al
com1
s=serial('COM1', 'BaudRate', 9600);
% abriendo el puerto
fopen(s);
%lee una linea de texto y la almacena en "datos" no incluye
terminador
datos = fgetl(s);
%escribe datos en el puerto en binario
fwrite (s,datos);
% cerrando el puerto
fclose(s);
% borrando el objeto de memoria
delete(s)
clear s
%algunas instrucciones asociadas con este puerto en matlab
clear (serial)
delete (serial)
fgetl (serial)
fgets (serial)
fopen (serial)
fprintf (serial)
fread (serial)
fscanf (serial)
fwrite (serial)
get (serial)
instrcallback
instrfind
instrfindall
isvalid (serial)
length (serial)
load (serial)
readasync
record
save (serial)
serial
serialbreak

set (serial)
size (serial)
stopasync
Para enviar datos por el puerto serial se debe tener claro cual
es el puerto al que esta conectado el perifrico con el cual se
quiere comunicar. En el ejemplo es COM3
ps = serial('COM3'); %se crea un objeto que representa el puerto
set(ps,'Baudrate',9600); % se fijan las caracteristicas del objeto (no
es necesario, estas estn por default)
set(ps,'DataBits',8);
set(ps,'Parity','none');
set(ps,'StopBits',1);
set(ps,'FlowControl','none');
fopen(ps);
% se abre el objeto para poder utilizarlo
fwrite(ps,dato,'uint8');
% se envia un dato de tipo entero sin
signo de 8 bits, por el objeto ps
fclose(ps);
% se cierra el objeto; si no se cierra y luego se intenta
abrir de nuevo, este puerto se bloquea
delete(ps);
clear ps
Para no tener que construir un circuito, se puede utilizar
arduino para que reciba los datos de MATLAB
la programacin en arduino es como sigue:
en este ejemplo se cambia la frecuencia de parpadeo del led segun el
dato que se recibe desde matlab
/////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
byte dato;
void setup(){
// initialize the serial communications:
Serial.begin(9600);
pinMode(13, OUTPUT);
// establece el pin digital como
salida
}
void loop()
{
if(dato==1){
digitalWrite(13, HIGH);

// enciende el LED

delay(1000);
// espera por un segundo
digitalWrite(13, LOW); // apaga el LED
delay(1000);
}else if(dato==2){
digitalWrite(13, HIGH); // enciende el LED
delay(2000);
// espera por un segundo
digitalWrite(13, LOW); // apaga el LED
delay(2000);
}else{
digitalWrite(13, HIGH); // enciende el LED
delay(400);
// espera por un segundo
digitalWrite(13, LOW); // apaga el LED
delay(400);
}
}

void serialEvent()
{
if (Serial.available()) {
dato=Serial.read();
// Serial.println(dato);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////Para configurar el
puerto serial, antes de enviar o recibir data, se debe copiar esto al
archivo .m :
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);
El dispositivo que enva o recibe los datos (como un Pic o un DSP)
debe transmitir o recibir a la misma velocidad que el programa de
Matlab (o viceversa) en este caso: 9600 baudios, y enviando un bit a
la vez.
Con la instruccin "fopen" se abre el puerto.
Para leer datos binarios se usa la instruccin: variable =
fread(PS,1,'uint8');
Esto le dice al Matlab como qu tipo de datos se interpretan los bits
que se estn recibiendo. Los tipos de datos pueden ser enteros sin
signo, enteros con signo, de punto flotante, de 8 bits, de 16 bits, etc.
(para ms informacin consultar el archivo de Ayuda de Matlab).
Si el dispositivo, como un pic, est mandando cdigos Ascii, se debe
poner:
variable= fread(PS,1,'uchar');
"variable" almacenar un nmero que corresponde al cdigo Ascii del
caracter recibido. Si es la 'A', "variable" almacenar el nmero 65.
Para convertir a caracter se hace: variable= char(variable);
Una vez utilizado el puerto, ste se debe cerrar:
fclose(PS);
delete(PS);
clear PS;
Si no se hace esto, al querer correr nuevamente el programa, nos
botar error.
Y ahora, una funcin que yo hice y que me fue muy til:
function h=convertir(hh);
q=quantizer('fixed','max',0.9999998,'min',-1,'format',[16
15],'round','wrap');
hexh=num2hex(q,hh);
h=hex2dec(hexh);
Lo que hace esta funcin es convertir los bits de un dato con coma
flotante de 32 bits a uno de tipo entero sin signo de 16 bits (as tena
que hacerse porque as reciba los datos el dispositivo conectado al
puerto serial), la informacin de estos bits se mantiene, pero lo que
cambia es cmo lo interpreta el Matlab y cmo los transmite al puerto

serial. Cuando le pona entero con signo, en lugar de un 7FFF


transmita un FFFF, para ahorrarme esos problemas de conversin
program esta funcin y declar el tipo de datos a transmitir como
entero sin signo. El dispositivo que reciba los bits en este caso fue
un DSP Motorola. (muchas veces es mejor trabajar con datos tipo
enteros sin signo o char sin signo, que con datos de coma flotante o
con bit de signo).
El programa que hace la transmisin es ste:
h=convertir(h);
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',2); % n es el nmero de bytes a enviar
set(PS,'InputBufferSize' ,2); % n es el nmero de bytes a recibir
set(PS,'Timeout',5); % 5 segundos de tiempo de espera
fopen(PS);
fwrite(PS,2,'uint16');
for i=1:1000
end;
for j=1:length(h)
fwrite(PS,h(j),'uint16');
end;
fclose(PS);
delete(PS);
clear PS;
Como se notar, este programa enva dos bytes cada vez. "h" es un
vector. para enviar ms de un dato es necesario un bucle. El Matlab
ya se encarga de la velocidad de transmisin y las esperas entre dato
y dato a medida que se ejecuta el bucle. Se ve que hay un bucle
vaco. En la prctica, con ese DSP Motorola, era necesario un pequeo
retardo en la transmisin, por eso le met un bucle vaco (es probable
que otros dispositivos no lo necesiten, el nmero 2 que se enva
inicialmente era un aviso al DSP que llegaban los datos, esto ya lo
hice acorde a cmo mi compaero El Giove lo program).
Para leer varios datos desde el puerto serial, datos del tipo char, hice
el siguiente programita, el cual reciba los datos desde un pic, las

condiciones eran que cada cuatro bytes hacan una muestra de una
seal capturada desde un sensor. Si el sensor registraba 2.03 el pic
enviaba los caracteres '2' '.' '0' '3' los que el Matlab lee como sus
respectivos cdigos Ascii: 50 46 48 51:
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);
K1= [];
for j=1:4
K1 = [K1 fread(PS,1,'uchar')];
end;
K1=char(K1);
K1= str2num(K1);
fclose(PS);
delete(PS);
clear PS;
INSTRFIND

La funcin str2num es para convertir la cadena '2' '.' '0' '3' en el


nmero 2.03 con el cual ya se puede operar.
Para recibir todo un vector de una seal capturada a travs de un
sensor se hace:
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);
K1= [];
K= [];
for i=1:lo_que_dure_el_muestreo
for j=1:4
K1 = [K1 fread(PS,1,'uchar')];
end;
K1=char(K1);
K=[K str2num(K1)];
K1=[];
end;
fclose(PS);
delete(PS);
clear PS;
INSTRFIND
La seal se va acumulando en el vector K. K1 slo recoge cada cuatro
caracteres (una muestra).

Acerca de INSTRFIND: Esta instruccin nos dice el estado del puerto


serial. Siempre debe estar cerrado una vez finalizado el programa que
lo utiliza. Si el puerto est cerrado, INSTRFIND nos botar:

Si el puerto est abierto, nos botar:

O cualquier otra informacin acerca del puerto o puertos que se


hayan abierto.

Вам также может понравиться