仅在存在时读取数据

Reading data only when present

我正在尝试从 COM3 端口读取数据。
我正在使用此代码:

in = fscanf(s);
    if(in == 'A')
        fclose(s);
        break;
    end

问题是com3端口没有数据发送时,fscanf()会等待一定的时间间隔,然后给出超时。

有没有办法只在数据存在时读取数据?

仅在数据存在时读取

你可以读出串行对象sBytesAvailable-属性来知道缓冲区中有多少字节准备读取:

bytes = get(s,'BytesAvailable');    % using getter-function
bytes = s.BytesAvailable;           % using object-oriented-addressing

然后您可以检查 bytes 的值是否符合您的条件。假设一个 char 是 1 个字节,那么您可以在读取缓冲区之前轻松地检查它。

if (bytes >= 1)
     in = fscanf(s);
     % do the handling of 'in' here
end

尽量减少等待时间

您可以手动将串行对象 sTimeout-属性 设置为较低的值,以作为默认超时继续执行。

set(s,'Timeout',1);       % sets timeout to 1 second (default is 10 seconds)

您很可能会收到以下警告:

Unsuccessful read: A timeout occurred before the Terminator was reached..

fscanf之前执行以下命令即可抑制。

warning('off','MATLAB:serial:fscanf:unsuccessfulRead');

举个例子:

s = serial('COM3');

set(s,'Timeout',1);       % sets timeout to 1 second (default is 10 seconds)

fopen(s);

warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
in = fscanf(s);
warning('on','MATLAB:serial:fscanf:unsuccessfulRead');

if(in == 'A')
    fclose(s);
    break;
end