Matlab串口:ErrorFcn超时后不执行回调

时间:2014-07-16 10:27:13

标签: matlab serial-port

我试图与matlab进行一些串行通信。 设置是: 9600 baude 8个数据位 0奇偶校验位 1站点

主.m文件

SYN = 1;
FIN = 2;
ACK = 4;
NAK = 8;
PWM = 16;
MAG = 32;

txByte = 0;
rxByte = 0;

serobj = serial('COM3');
set(serobj,'Baudrate', 9600);
set(serobj,'Parity', 'none');
set(serobj,'Databits', 8);
set(serobj,'StopBits', 1);
set(serobj,'FlowControl', 'none');
set(serobj,'ErrorFcn',@TimeOutErrorFcn);
set(serobj,'Timeout',1);


fopen(serobj);

% Start the handshake
fwrite(serobj, SYN, 'uint8');
% wait for answer
rxByte = fread(serobj,1,'uint8');
if(isempty(rxByte))
    rxByte = 255;
end
% what is the answer?
switch (rxByte(1))
    case ACK+SYN
        fwrite(serobj, ACK, 'uint8');
    case NAK
        fclose(serobj);
    otherwise 
        fwrite(serobj, NAK, 'uint8');
        fclose(serobj);
end

while(strcmp(get(serobj, 'Status'),'open'))
% Do some communication
end

回调函数为.m-file

function TimeOutErrorFcn(obj, event)
%TIMEOUTERRORFCN Summary of this function goes here
%   Detailed explanation goes here
    disp('Error');
% close the connection here, send FIN and do fclose(serobj)
end

超过超时后,不会调用TimeOutErrorFcn!我得到的是命令promt上的以下输出:

Warning: The specified amount of data was not returned within the Timeout period. 

Mathsworks帮助说: 超时

等待完成读取或写入操作的时间

将Timeout配置为等待完成读取或写入操作的最长时间(以秒为单位)。

如果发生超时,则读取或写入操作将中止。此外,如果在异步读或写操作期间发生超时,则:

An error event is generated.

The callback function specified for ErrorFcn is executed.

ErrorFcn

指定在发生错误事件时执行的回调函数 在页面中全部展开 描述

配置ErrorFcn以在发生错误事件时执行回调函数。

Note    An error event is generated only for asynchronous read and write operations.

发生超时时会生成错误事件。如果读取或写入操作未在Timeout属性指定的时间内成功完成,则会发生超时。不会为配置错误生成错误事件,例如设置无效的属性值。

如果RecordStatus属性值为on,并且发生错误事件,则记录文件会记录此信息:

The event type as Error

The error message

The time the event occurred using the format day-month-year hour:minute:second:millisecond

要了解如何创建回调函数,请参阅创建和执行回调函数。

所以,我真的没有看到我的错误。

1 个答案:

答案 0 :(得分:0)

您没有进行异步读取操作,因此不会发生错误事件。相反,这是一个警告。要强制运行错误函数,您需要告诉Matlab将该警告标记为错误。尝试将其添加到代码顶部:

  

警告('错误','工具:fread:unsuccessfulRead');

如果还有其他警告要标记为错误,可以通过发出“详细信息”来获取命令。