Matlab串口编程

来源:互联网 发布:yum 重装 编辑:程序博客网 时间:2024/06/14 19:28

MATLAB串口通信例子

(一)  直接读取

首先,我们来试试编写一个.m程序,直接读取串口数据。更多技术细节在程序中的注释中说明。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 函数功能: 串口接收数据程序

% 将接收到的数据显示在命令行,每次仅读取一个字节

% 需要用虚拟串口 VSPD 虚拟一对串口,这里虚拟连接的串口是 COM1和COM2

% 用UartAssist(串口调试助手)设置为COM2,作为发送数据端

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function ReadWriteSerial

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

obj1=instrfind('Type','serial','Port','COM1','Tag','');

if isempty(obj1)

   obj1=serial('COM1');

else

   fclose(obj1);

   obj1=obj1(1);

end

% 串口的一些设置

set(obj1,'BaudRate',9600,'FlowControl','none','Timeout',0.1);

set(obj1,'Inputbuffersize',512,'Outputbuffersize',...

   512,'parity','none','databits',8,'stopbits',1);

fopen(obj1);

while(1)

   if obj1.BytesAvailable

       data=fread(obj1,1);   % 按照每次读取一个字节

       string=setstr(data);  % 将ASCII码转换为字符

       string                % 显示在命令行

   end

end

fclose(obj1);

delete(obj1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

(二)  GUI界面读写串口数据

在命令行窗口输入guide命令或者在菜单栏中File->New->GUI,探出以下界面


然后我们选择创建一个新的GUI界面,我们创建以下控件元素,注意,有几个很重要空间的Tag属性的修改,比如打开串口为btnOpen,关闭按钮为btnClose,发送按钮Tag为btnSend,清楚按钮为btnClear,选择串口的下拉框为selectCom,波特率的下拉框为baudRate,接收数据的编辑框为editRecv,发送数据的编辑框为editSend,左边最大的那个是坐标轴,Tag为axesShow。



编写程序如下:

 

function varargout = SerialPort(varargin)

% SERIALPORT M-file for SerialPort.fig

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

                   'gui_Singleton',  gui_Singleton, ...

                   'gui_OpeningFcn',@SerialPort_OpeningFcn, ...

                   'gui_OutputFcn',  @SerialPort_OutputFcn, ...

                   'gui_LayoutFcn',  [] , ...

                   'gui_Callback',   []);

if nargin && ischar(varargin{1})

   gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

   [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

   gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 在此做初始化工作

function SerialPort_OpeningFcn(hObject,eventdata, handles, varargin)

% 初始化数据

global COM;

global rate;

COM='COM1'

rate = 9600;

set(handles.axesShow,'YLim',[-40,40]);  % 设置坐标轴的范围

set(handles.axesShow,'XLim',[-40,40]);  % 设置坐标轴的范围

set(handles.axesShow,'YGrid','on');  % 设置坐标网格显示

set(handles.axesShow,'XGrid','on');  % 设置坐标网格显示

set(handles.selectCom,'value', 1);

set(handles.baudRate,'value',2);

set(handles.btnClose,'Enable','off');

% 画图用的数组

global DATA; % 数据块

global UNIT;  % 数据单元,可以由多个字节构成

UNIT=0;

DATA=[];

handles.output = hObject;

guidata(hObject, handles);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function varargout =SerialPort_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 选择串口的回调函数

function selectCom_Callback(hObject,eventdata, handles)

global COM;

val=get(hObject,'value');

switch val

   case 1

       COM='COM1';

   case 2

       COM='COM2';

   case 3

       COM='COM3';

   case 4

       COM='COM4';

   case 5

       COM='COM5';

   case 6

       COM='COM6';

end

function selectCom_CreateFcn(hObject,eventdata, handles)

if ispc &&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 选择波特率回调函数

% --- Executes on selection change inbaudRate.

function baudRate_Callback(hObject,eventdata, handles)

global rate;

val=get(hObject,'value');

switch val

   case 1

       rate=4800;

   case 2

       rate=9600;

   case 3

       rate=14400;

end

 

function baudRate_CreateFcn(hObject,eventdata, handles)

 

if ispc &&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 打开串口回调函数

function btnOpen_Callback(hObject,eventdata, handles)

clc

instrreset

global s;

global rate;

global COM;

global out;

global N;

N=50;

out=1;

s=serial(COM);

set(s,'BaudRate',rate);%%%Baud初始化

set(s,'DataBits',8);%%%设置数据长度

set(s,'StopBits',1);%%%设置停止位长度

set(s,'InputBufferSize',1024000);%%%设置输入缓冲区大小为1M

set(handles.btnOpen,'Enable','off');

set(handles.btnClose,'Enable','on');

 

%串口事件回调设置

% s.BytesAvailableFcnMode='terminator';

s.BytesAvailableFcnMode='byte';

s.BytesAvailableFcnCount=1; %输入缓冲区存在1个字节触发回调函数

s.BytesAvailableFcn={@recvData,handles};%回调函数的指定

fopen(s);%打开串口

 

global count;

count=1;

fprintf('ceshi_dakaichuankou\n');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%串口接收到数据的回调函数

function recvData(seri,e,handles)

global DATA;

global UNIT;

global N;

data=fread(seri,1);

string=setstr(data)  % 将ASCII码转换为字符

if string=='S'  % 停止位

   DATA=[DATA,str2double(UNIT)]; % 保存数据

   text=get(handles.editRecv,'String');

   text=strcat(text,UNIT);

   set(handles.editRecv,'string',text);

   UNIT='';

    %画图

   if length(DATA)>N

       DATA=DATA(2:N); % 放弃旧数据

   end

   plot(handles.axesShow,1:length(DATA),DATA,'-r.');

   set(handles.axesShow,'XLim',[-40,40]);

else

   UNIT=strcat(UNIT,string);

end

 

%set(handles.text4,'string',x);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 关闭串口的回调函数

function btnClose_Callback(hObject,eventdata, handles)

global s;

fclose(s);

delete(s);

set(handles.pbOpenSerial,'Enable','on');

set(handles.pbCloseSerial,'Enable','off');

% fprintf('Close_COM');

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function editSend_Callback(hObject,eventdata, handles)

% --- Executes during object creation,after setting all properties.

function editSend_CreateFcn(hObject,eventdata, handles)

if ispc &&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 点击发送消息按钮的回调函数

function btnSend_Callback(hObject,eventdata, handles)

global s;

d=get(handles.editSend,'String');

% 发送数据

fprintf(s,'%s',d);

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function editRecv_Callback(hObject,eventdata, handles)

% --- Executes during object creation,after setting all properties.

function editRecv_CreateFcn(hObject,eventdata, handles)

if ispc &&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 点击清除按钮的回调函数

function btnClear_Callback(hObject,eventdata, handles)

set(handles.editRecv,'string','');

set(handles.editSend,'string','');

 

% 画图

function draw(handle,Array)

plot(handle,1:length(Array),Array,'-ro');

set(handle,'XLim',[1,50])

 

 

 

 

原创粉丝点击