找回密码
 注册

QQ登录

只需一步,快速开始

搜索

串口通信助手 MATLAB版本源程序

[复制链接]
coolice 发表于 2020-4-27 17:33:36 | 显示全部楼层 |阅读模式
matlab串口通信.rar (17.46 KB, 售价: 1 E币)
103414lb9ioeu9dg4ignrn.png
部分代码
function start_serial_Callback(hObject, eventdata, handles)
%   【打开/关闭串口】按钮的回调函数
%    打开串口,并初始化相关参数

%% 若按下【打开串口】按钮,打开串口
if get(hObject, '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', 10,...
        'BytesAvailableFcnMode', 'byte', 'BytesAvailableFcn', {@bytes, handles},...
        'TimerPeriod', 0.05, 'timerfcn', {@dataDisp, handles});
    %% 将串口对象的句柄作为用户数据,存入窗口对象
    set(handles.figure1, 'UserData', scom);
    %% 尝试打开串口
    try
        fopen(scom);  %打开串口
    catch   % 若串口打开失败,提示“串口不可获得!”
        msgbox('串口不可获得!');
        set(hObject, 'value', 0);  %弹起本按钮
        return;
    end
    %% 打开串口后,允许串口发送数据,清空接收显示区,点亮串口状态指示灯,
    %% 并更改本按钮文本为“关闭串口”
    set(handles.period_send, 'Enable', 'on');  %启用【自动发送】按钮
    set(handles.manual_send, 'Enable', 'on');  %启用【手动发送】按钮
    set(handles.xianshi, 'string', ''); %清空接收显示区
    set(handles.activex1, 'value', 1);  %点亮串口状态指示灯
    set(hObject, 'String', '关闭串口');  %设置本按钮文本为“关闭串口”
else  %若关闭串口
    %% 停止并删除定时器
    t = timerfind;
    if ~isempty(t)
        stop(t);
        delete(t);
    end
    %% 停止并删除串口对象
    scoms = instrfind;
    stopasync(scoms);
    fclose(scoms);
    delete(scoms);
    %% 禁用【自动发送】和【手动发送】按钮,熄灭串口状态指示灯
    set(handles.period_send, 'Enable', 'off', 'value', 0); %禁用【自动发送】按钮
    set(handles.manual_send, 'Enable', 'off');  %禁用【手动发送】按钮
    set(handles.activex1, 'value', 0);  %熄灭串口状态指示灯
end

function dataDisp(obj, event, handles)
global value
%        串口的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);

%保存成.txt文件   
% [FileName PathName]=uiputfile({'*.txt','Txt Files(*.txt)';'*.*','All Files(*.*)'},'choose a File');
% ysw= [PathName FileName];
% dlmwrite(ysw, strRec,'delimiter','\t');
% save ysw strRec
% save(char(ysw), 'strRec')


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-27 11:50

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表