matlab bytesAvailableCallback with empty buffer

时间:2014-12-25 16:55:39

标签: matlab buffer serial-communication

在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没有帮助 - 它执行了回调,因此仍然可以访问该函数。

1 个答案:

答案 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>

罗恩