自动处理从串行端口接收的数据
通过串行端口连接的某些设备以恒定速率(流数据)向你的程序发送数据或以不可预测的间隔发送数据。你可以将串行端口配置为自动执行功能,以便在数据到达时处理数据。这称为串行端口对象的 回调函数 。
必须设置串行端口的两个属性才能使用此功能:回调所需的函数名称(BytesAvailableFcn
),以及应触发执行回调函数的条件(BytesAvailableFcnMode
)。
有两种方法可以触发回调函数:
- 当在串行端口接收到一定数量的字节时(通常用于二进制数据)
- 在串行端口接收到某个字符时(通常用于文本或 ASCII 数据)
回调函数有两个必需的输入参数,称为 obj
和 event
。obj
是串口。例如,如果要打印从串行端口接收的数据,请定义用于打印名为 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;