2017-04-05 77 views
1

我正在使用应用程序设计器(非常类似于GUIDE,但比GUIDE更好)创建一个MATLAB GUI,用于监视我的simulink模型的数据输出,实时显示Matlab GUI中的非阻塞UDP接收器

换句话说,我有一个simulink模型和一个GUI,都运行在同一个MATLAB实例中,我想通过UDP从simulink模型发送数据包,并在我的GUI中使用该数据更新图。但是,我不知道如何从UDP数据包中读取数据而没有阻塞。

有没有办法绑定一个处理程序,当收到一个数据包,以便我可以执行一个函数来更新图/字段?

+0

如果您通过UDP进行通信,为什么不直接在单独的MATLAB实例中运行GUI? – Suever

+0

@Suever因为我需要能够从gui访问我的simulink模型以及编写它的模型工作区 – Ortix92

回答

0

当然,除BytesAvailableFcn之外,matlab还有datagramreceivedfcn可以在新的dagatrams上调用你的自定义函数,当fread/fscanf阻塞(临时)时它是非阻塞的。

在MATLAB关于回调阅读events and cbs

可编译独立可能看起来像:

%% standalone main 
%{ 
    see docs/* 
%} 

function exitcode = main(port, remotePort) 

% sanitize input 
if(~exist('port','var') || ~exist('remotePort','var')) 
    disp(['args: port remotePort']); 
    exit(1); 
end 

if ischar(port) 
    port=str2num(port); 
end 
if ischar(remotePort) 
    remotePort=str2num(remotePort); 
end 

% create udp object 
u = udp('127.0.0.1',remotePort, 'LocalPort', port); 

% connect the UDP object to the host 
fopen(u); 
exitcode = 0; 

% since we poll, suppress warning 
warning('off','instrument:fscanf:unsuccessfulRead'); 
warning VERBOSE 

% specify callback on datagram 
while true 
    msgEnc= fscanf(u); 
    % timed out without datagram 
    if isempty(msgEnc) 
     continue 
    end 
    % do sth with msgEnc (which is a readable string) 
    fprintf(u, 'heard sth'); %answer 
end 
end 

如果你想使用Simulink模块使用udpreceive 具有非blokcking能力

一先进先出(FIFO)缓冲区接收数据。在每个步骤 步骤中,数据端口都会输出缓冲区中的请求值。在 非阻塞模式下,状态端口指示该块是否已收到 新数据。