Matlab串口编程
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])