在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没有帮助 - 它执行了回调,因此仍然可以访问该函数。
答案 0 :(得分:0)
我有同样的问题,但找到了解决方法。我写了一个程序,一次读取1个字节,直到它到达终结符(matlab没有自动识别终结符。添加这样的行后:
if u.bytesavailable == 0
fprintf(['function was called but buffer is epty' 13])
end
我注意到我读取的每个字节都会被调用一次-1。显然,每个改变缓冲区大小的事件(例如读取一个字节)都会再次调用读出函数。我发现的工作原理是不是一次读取整个缓冲区,而是读取触发事件的大小。例如:
fread(u,BytesAvailableFcnCount)
应该以牺牲速度为代价,不再需要额外的函数调用。它适用于我的少量数据,但我使用的是串行连接,而不是udp。
我尝试在回调函数本身内禁用bytesavailablefcn,因为禁用函数正在读取的任何函数调用,但我仍然有一个带空缓冲区的函数调用(我不知道为什么)。 / p>
罗恩