weixin_44849612
weixin_44849612
采纳率100%
2019-10-07 16:21

matlab串口禁用bytesavailablefcn

175
  • c++
  • c语言
已采纳

我在matlab上用串口读取stm32发送给电脑的数据,设置为缓冲区接收到32个字节就进入回调函数,但是弹出这个警告:The BytesAvailableFcn is being disabled. To enable the callback property either connect to the hardware with FOPEN or set the BytesAvailableFcn property.而且提示pause(5)这行代码有问题,不知道该怎么解决

clear;
clear s;
clc;

try
    s=serial('com5');
catch
    error('cant serial');
end
set(s,'BaudRate',115200,'ByteOrder','littleEndian','DataBits',8, ...
    'Parity','none','StopBits',1,'FlowControl','none');
set(s,'timeout',1);
s.inputbuffersize=10240000;   %设置串口接收缓冲区
s.OutputBufferSize=10240000;
s.BytesAvailableFcnMode = 'byte';
s.BytesAvailableFcnCount = 32;
s.BytesAvailableFcn  = @callback1;

fopen(s);

pause(5);
fclose(s);
delete(s);
clear s;
close all;
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • weixin_43716859 weixin_43716859 2年前

    我觉得是你的回调函数存在问题,可能你回调函数中有一些判断条件不符合,导致每次接受串口数据就会出错

    点赞 评论 复制链接分享
  • zqbnqsdsmd zqbnqsdsmd 2年前

    s=serial('com2');
    s.BytesAvailableFcnMode='byte'; % 串口设置
    s.InputBufferSize=4096;
    s.OutputBufferSize=1024;
    s.BytesAvailableFcnCount=100;
    s.ReadAsyncMode='continuous';
    s.Terminator='CR';
    fopen(s); %打开串口
    out=fread(s,10,'uint8'); %一次读出10个字符

    fprintf('%3c',out); %一个字符占三位输出,%c字符,%d整型

    fid=fopen('serial_data.txt','w+'); % 'a+'读写方式打开,将文件指针指向文件末尾。
    假设文件不存在则尝试创建之
    fprintf(fid,'%3c',out); % 写入文件里

    fclose(fid);

    fclose(s);
    delete(s);

    实验2:
    相同的功能。用函数写更规范,代码例如以下:

    % 打开串口
    function scom = OpenSerial(sname, HReadFcn)
    scom = serial(sname);
    scom.BytesAvailableFcnMode = 'terminator';
    scom.Terminator = '.';
    scom.BytesAvailableFcn = HReadFcn;
    try
    fopen(scom);
    catch err
    fprintf('%s打开失败。
    \n', sname);
    end
    fprintf('%s成功打开。\n', sname);
    end
    % 写串口
    function WriteSerial(scom, str)
    fprintf(scom, str ,'async'); % 异步方式
    end
    % 读串口回调函数
    function ReadFcn_Com2(obj, ~)
    n = get(obj, 'BytesAvailable');
    if n
    a = fread(obj, n, 'uchar');
    c = char(a');
    fprintf('%s\n', c);
    end
    end
    % 关闭串口
    function CloseSerial(scom)
    try
    fclose(scom);
    catch err
    fprintf('%s关闭失败。

    ', scom.Name);
    return
    end
    delete(scom);
    end

    点赞 1 评论 复制链接分享

相关推荐