Matlab bytesAvailableCallback с пустым буфером

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


person user1843913    schedule 25.12.2014    source источник


Ответы (1)


У меня такая же проблема, но нашел обходной путь. Я написал программу, которая будет читать по 1 байту за раз, пока не достигнет терминатора (matlab не распознает терминаторы автоматически. После добавления такой строки:

if u.bytesavailable == 0
    fprintf(['function was called but buffer is epty' 13])
end

Я заметил, что он будет вызываться один раз для каждого прочитанного байта -1. По-видимому, каждое событие, изменяющее размер буфера (например, чтение байта), снова создает вызов вашей функции чтения. Я обнаружил, что сработало чтение не всего буфера сразу, а размера, вызывающего событие. Так, например:

fread(u,BytesAvailableFcnCount)

должен оставить вас без дополнительных вызовов функций за счет скорости. У меня это работает для небольших объемов данных, но я использую последовательное соединение, а не udp.

Я попытался отключить bytes availablefcn внутри самой функции обратного вызова, чтобы отключить любые вызовы функций, когда функция читает, но у меня все еще есть загрузка вызовов функций с пустым буфером (я не знаю, почему).

Рон

person Ron Amram    schedule 07.01.2016