仅在存在时读取数据
Reading data only when present
我正在尝试从 COM3 端口读取数据。
我正在使用此代码:
in = fscanf(s);
if(in == 'A')
fclose(s);
break;
end
问题是com3端口没有数据发送时,fscanf()
会等待一定的时间间隔,然后给出超时。
有没有办法只在数据存在时读取数据?
仅在数据存在时读取
你可以读出串行对象s
的BytesAvailable
-属性来知道缓冲区中有多少字节准备读取:
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
尽量减少等待时间
您可以手动将串行对象 s
的 Timeout
-属性 设置为较低的值,以作为默认超时继续执行。
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
我正在尝试从 COM3 端口读取数据。
我正在使用此代码:
in = fscanf(s);
if(in == 'A')
fclose(s);
break;
end
问题是com3端口没有数据发送时,fscanf()
会等待一定的时间间隔,然后给出超时。
有没有办法只在数据存在时读取数据?
仅在数据存在时读取
你可以读出串行对象s
的BytesAvailable
-属性来知道缓冲区中有多少字节准备读取:
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
尽量减少等待时间
您可以手动将串行对象 s
的 Timeout
-属性 设置为较低的值,以作为默认超时继续执行。
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