自动处理从串行端口接收的数据

通过串行端口连接的某些设备以恒定速率(流数据)向你的程序发送数据或以不可预测的间隔发送数据。你可以将串行端口配置为自动执行功能,以便在数据到达时处理数据。这称为串行端口对象的 回调函数

必须设置串行端口的两个属性才能使用此功能:回调所需的函数名称(BytesAvailableFcn),以及应触发执行回调函数的条件(BytesAvailableFcnMode)。

有两种方法可以触发回调函数:

  1. 当在串行端口接收到一定数量的字节时(通常用于二进制数据)
  2. 在串行端口接收到某个字符时(通常用于文本或 ASCII 数据)

回调函数有两个必需的输入参数,称为 objeventobj 是串口。例如,如果要打印从串行端口接收的数据,请定义用于打印名为 newdata 的数据的函数:

function newdata(obj,event)
    [d,c] = fread(obj);  % get the data from the serial port
    % Note: for ASCII data, use fscanf(obj) to return characters instead of binary values
    fprintf(1,'Received %d bytes\n',c);
    disp(d)
end

例如,要在接收到 64 字节数据时执行 newdata 功能,请按如下方式配置串行端口:

s = serial(port_name);
s.BytesAvailableFcnMode = 'byte';
s.BytesAvailableFcnCount = 64;
s.BytesAvailableFcn = @newdata;

对于文本或 ASCII 数据,数据通常被划分为具有终止符的行,就像页面上的文本一样。要在收到回车符时执行 newdata 功能,请按如下方式配置串口:

s = serial(port_name);
s.BytesAvailableFcnMode = 'terminator';
s.Terminator = 'CR';  % the carriage return, ASCII code 13
s.BytesAvailableFcn = @newdata;