Sie sind auf Seite 1von 7

USANDO EL PUERTO SERIAL CON MATLAB 7

Sucedi que necesit recibir y enviar datos por el puerto serial. Dado que mis aproximadamente 40 lneas de script se los copiaron un montn de gente de la facu, decid liberar el cdigo (el 90% en realidad) y hacer este pequeo tutorial: Para configurar el puerto serial, antes de enviar o recibir data, se debe copiar esto al archivo .m (este cdigo me lo pas un profesor):

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.

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

Das könnte Ihnen auch gefallen