MATLAB+GUI串口调试助手 - GUI界面设计 - 谷速源码
下载频道> 资源分类> matlab源码> GUI界面设计> MATLAB+GUI串口调试助手

标题:MATLAB+GUI串口调试助手
分享到:

所属分类: GUI界面设计 资源类型:程序源码 文件大小: 17.21 KB 上传时间: 2019-06-17 22:37:19 下载次数: 68 资源积分:1分 提 供 者: zhangsan456 code
内容:
function varargout = serial_communication2(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @serial_communication2_OpeningFcn, ...
                   'gui_OutputFcn',  @serial_communication2_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
 
function serial_communication2_OpeningFcn(h , eventdata, handles, varargin)
handles.output = h ;
warning('off');
java = get(h , 'Java ');
java .setFigureIcon(javax.swing.ImageIcon('icon.jpg'));
%% 初始化参数
hasData = false; %表征串口是否接收到数据
isShow = false;  %表征是否正在进行数据显示,即是否正在执行函数dataDisp
isStopDisp = false;  %表征是否按下了【停止显示】按钮
numRec = 0;    %接收字符计数
strRec = '';   %已接收的字符串
%% 将上述参数作为应用数据,存入窗口对象内
setappdata(h , 'hasData', hasData);
setappdata(h , 'strRec', strRec);
setappdata(h , 'numRec', numRec);
setappdata(h , 'isShow', isShow);
setappdata(h , 'isStopDisp', isStopDisp);
guidata(h , handles);
 
function varargout = serial_communication2_OutputFcn(h , eventdata, handles) 
varargout{1} = handles.output;
 
function com_Callback(h , ~, handles)
 
function com_CreateFcn(h , eventdata, handles)
if ispc && isequal(get(h ,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(h ,'BackgroundColor','white');
end
 
function rate_Callback(h , eventdata, handles)
 
function rate_CreateFcn(h , eventdata, handles)
if ispc && isequal(get(h ,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(h ,'BackgroundColor','white');
end
 
function jiaoyan_Callback(h , eventdata, handles)
 
function jiaoyan_CreateFcn(h , eventdata, handles)
if ispc && isequal(get(h ,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(h ,'BackgroundColor','white');
end
 
function data_bits_Callback(h , eventdata, handles)
 
function data_bits_CreateFcn(h , eventdata, handles)
if ispc && isequal(get(h ,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(h ,'BackgroundColor','white');
end
 
function stop_bits_Callback(h , eventdata, handles)
 
function stop_bits_CreateFcn(h , eventdata, handles)
if ispc && isequal(get(h ,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(h ,'BackgroundColor','white');
end
 
function start_serial_Callback(h , eventdata, handles)
%   【打开/关闭串口】按钮的回调函数
%    打开串口,并初始化相关参数
global scom;
%% 若按下【打开串口】按钮,打开串口
if get(h , 'value')
    %% 获取串口的端口名
    com_n = sprintf('com%d', get(handles.com, 'value'));
    %% 获取波特率
    rates = [300 600 1200 2400 4800 9600 19200 38400 43000 56000 57600 115200];
    baud_rate = rates(get(handles.rate, 'value'));
    %% 获取校验位设置
    switch get(handles.jiaoyan, 'value')
        case 1
            jiaoyan = 'none';
        case 2
            jiaoyan = 'odd';
        case 3
            jiaoyan = 'even';
    end
    %% 获取数据位个数
    data_bits = 5 + get(handles.data_bits, 'value');
    %% 获取停止位个数
    stop_bits = get(handles.stop_bits, 'value');
    %% 创建串口对象
    scom = serial(com_n);
    %% 配置串口属性,指定其回调函数
    set(scom, 'BaudRate', baud_rate, 'Parity', jiaoyan, 'DataBits',...
        data_bits, 'StopBits', stop_bits, 'BytesAvailableFcnCount', 100,...
        'BytesAvailableFcnMode', 'byte', 'BytesAvailableFcn', {@bytes, handles},...
        'TimerPeriod', 0.1, 'timerfcn', {@dataDisp, handles});
    %% 将串口对象的句柄作为用户数据,存入窗口对象
    set(handles.figure1, 'UserData', scom);
    %% 尝试打开串口
    try
        fopen(scom);  %打开串口
    catch   % 若串口打开失败,提示“串口不可获得!”
        msgbox('串口不可获得!');
        set(h , 'value', 0);  %弹起本按钮 
        return;
    end
    %% 打开串口后,允许串口发送数据,清空接收显示区,点亮串口状态指示灯,
    %% 并更改本按钮文本为“关闭串口”
    set(handles.xianshi, 'string', ''); %清空接收显示区
    set(handles.activex1, 'value', 1);  %点亮串口状态指示灯
    set(h , 'String', '关闭串口');  %设置本按钮文本为“关闭串口”
    fwrite(scom,[115,116,97,114,116,10]);
else  %若关闭串口
    %% 停止并删除定时器
    t = timerfind;
    if ~isempty(t)
        stop(t);
        delete(t);
    end
    %% 停止并删除串口对象
    scoms = instrfind;
    stopasync(scoms);
    fclose(scoms);
    delete(scoms);
    %% 禁用【自动发送】和【手动发送】按钮,熄灭串口状态指示灯
    set(handles.activex1, 'value', 0);  %熄灭串口状态指示灯
    set(h , 'String', '打开串口');  %设置本按钮文本为“打开串口”
end
 
function dataDisp(obj, event, handles)
% 串口的TimerFcn回调函数
%   串口数据显示
%% 获取参数
hasData = getappdata(handles.figure1, 'hasData'); %串口是否收到数据
strRec = getappdata(handles.figure1, 'strRec');   %串口数据的字符串形式,定时显示该数据
numRec = getappdata(handles.figure1, 'numRec');   %串口接收到的数据个数
%% 若串口没有接收到数据,先尝试接收串口数据
if ~hasData
    bytes(obj, event, handles);
end
%% 若串口有数据,显示串口数据
if hasData
    %% 给数据显示模块加互斥锁
    %% 在执行显示数据模块时,不接受串口数据,即不执行BytesAvailableFcn回调函数
    setappdata(handles.figure1, 'isShow', true); 
    %% 若要显示的字符串长度超过10000,清空显示区
%     if length(strRec) > 10000
%         strRec = '';
%         setappdata(handles.figure1, 'strRec', strRec);
%     end
    %% 显示数据
    set(handles.xianshi, 'string', strRec);
    %% 更新接收计数
    set(handles.rec,'string', numRec);
    %% 更新hasData标志,表明串口数据已经显示
    setappdata(handles.figure1, 'hasData', false);
    %% 给数据显示模块解锁
    setappdata(handles.figure1, 'isShow', false);
end
 
function bytes(obj, ~, handles)
%   串口的BytesAvailableFcn回调函数
%   串口接收数据
 
%% 获取参数
strRec = getappdata(handles.figure1, 'strRec'); %获取串口要显示的数据
numRec = getappdata(handles.figure1, 'numRec'); %获取串口已接收数据的个数
isStopDisp = getappdata(handles.figure1, 'isStopDisp'); %是否按下了【停止显示】按钮
isShow = getappdata(handles.figure1, 'isShow');  %是否正在执行显示数据操作
%% 若正在执行数据显示操作,暂不接收串口数据
if isShow
    return;
end
%% 获取串口可获取的数据个数
n = get(obj, 'BytesAvailable');
%% 若串口有数据,接收所有数据
if n
    %% 更新hasData参数,表明串口有数据需要显示
    setappdata(handles.figure1, 'hasData', true);
    %% 读取串口数据
%     a=fscanf(scom,'%f');%读入串口数据
    a = fread(obj, n, 'uchar');
 
    %% 若没有停止显示,将接收到的数据解算出来,准备显示
    if ~isStopDisp 
        %% 根据进制显示的状态,解析数据为要显示的字符串
            c = char(a');
        %% 更新已接收的数据个数
        numRec = numRec + size(a,1);
        %% 更新要显示的字符串
        strRec = [strRec c];
    end
    %% 更新参数
    setappdata(handles.figure1, 'numRec', numRec); %更新已接收的数据个数
    setappdata(handles.figure1, 'strRec', strRec); %更新要显示的字符串
end
 
function stop_disp_Callback(h , eventdata, handles)
%% 根据【停止显示】按钮的状态,更新isStopDisp参数
if get(h , 'Value')
    isStopDisp = true;
else
    isStopDisp = false;
end
setappdata(handles.figure1, 'isStopDisp', isStopDisp);
 
function radiobutton1_Callback(h , eventdata, handles)
 
function radiobutton2_Callback(h , eventdata, handles)
 
function togglebutton4_Callback(h , eventdata, handles)
 
function clear_count_Callback(h , eventdata, handles)
%% 计数清零,并更新参数numRec和numSend
set([handles.rec, handles.trans], 'string', '0')
setappdata(handles.figure1, 'numRec', 0);
setappdata(handles.figure1, 'numSend', 0);
 
 
function figure1_CloseRequestFcn(h , eventdata, handles)
%   关闭窗口时,检查定时器和串口是否已关闭
%   若没有关闭,则先关闭
%% 查找定时器
t = timerfind;
%% 若存在定时器对象,停止并关闭
if ~isempty(t)
    stop(t);  %若定时器没有停止,则停止定时器
    delete(t);
end
%% 查找串口对象
scoms = instrfind;
%% 尝试停止、关闭删除串口对象
try
    stopasync(scoms);
    fclose(scoms);
    delete(scoms);
end
%% 关闭窗口
delete(h );

文件列表(点击上边下载按钮,如果是垃圾文件请在下面评价差评或者投诉):

icon.jpg
serial_communication2.asv
serial_communication2.fig
serial_communication2.m
serial_communication2_activex1

关键词: 串口调试助手

Top_arrow
回到顶部
联系方式| 版权声明| 招聘信息| 广告服务| 银行汇款| 法律顾问| 兼职技术| 付款方式| 关于我们|
网站客服网站客服 程序员兼职招聘 程序员兼职招聘
沪ICP备19040327号-3
公安备案号:沪公网安备 31011802003874号
库纳格流体控制系统(上海)有限公司 版权所有
Copyright © 1999-2014, GUSUCODE.COM, All Rights Reserved