При открытии любого коммуникационного инструмента в 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 не помогло - он выполнил обратные вызовы, поэтому все еще обращается к функции.