在matlab中打开任何通讯工具时,可以使用BytesAvailableFcn设置对象。 即u.BytesAvailableFcn = @bytesAvailable_callback;
每次调用回调时,它将完全清除缓冲区。 例如,对于udp客户端:
function bytesAvailable_callback(udp_obj, event)
bytesAvailable = get(udp_obj, 'BytesAvailable');
fprintf('callback - bytesAvailable = %d\n',bytesAvailable);
while bytesAvailable
data = fread(udp_obj, bytesAvailable, 'int32');
fprintf('rec = %d\n',data(1));
bytesAvailable = get(udp_obj, 'BytesAvailable');
end
end
接下来发生的问题是问题:缓冲区已被清除,但BytesAvailableFcn仍在调用堆栈中,将被调用很多次,仅不返回任何内容。
使用udp运行上述回调的示例:
clc
echoudp('on', 8000)
%
u = udp('127.0.0.1', 8000);
u.OutputBufferSize = 10000;
u.InputBufferSize = 10000;
u.BytesAvailableFcn = @bytesAvailable_callback;
u.BytesAvailableFcnCount = 10;
u.BytesAvailableFcnMode = 'byte';
fopen(u);
%
for i = 1:2
fprintf('send = %d\n',i );
fwrite(u, [i ones(1,10)], 'int32');
end
pause(1)
%%
fclose(u);
delete(u);
clear u
echoudp('off');
结果是:
send = 1
send = 2
callback - bytesAvailable = 88
rec = 1
rec = 2
callback - bytesAvailable = 0
callback - bytesAvailable = 0
callback - bytesAvailable = 0
callback - bytesAvailable = 0
callback - bytesAvailable = 0
callback - bytesAvailable = 0
callback - bytesAvailable = 0
我们可以轻松地看到有害的行为-InputBuffer为空时调用的回调。 在繁忙的程序中,上面的要求可能非常高,每个回调都很重要。 有没有一种方法可以“刷新”上述不需要的回调调用?
使用drawow并没有帮助-它执行了回调,因此仍然可以访问该函数。