Как получить данные из функции обратного вызова в Matlab для дальнейшей обработки? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь получить 16000 значений в секунду в MatLab из сокета UDP с помощью функции обратного вызова.

Пока это работает, но я не знаю, как получить значения полученныхпакеты для дальнейшей постобработки (например, записать их в базу данных SQL / построить их), поскольку переменные являются только локальными и не записываются в мое рабочее пространство?

Код, который я использую в данный момент:

%% Specify a Server (host name or IP address) with Port 8080
u = udp('192.168.0.164', 8080);  %UDP Object


u.InputBufferSize = 1024;
u.ReadAsyncMode = 'continuous';
u.DatagramReceivedFcn = @DatagramReceivedFcn;
u.DatagramTerminateMode = 'on';
u.Terminator = '!';

%% Oeffnen der Verbindung
fopen(u);

 if (~strcmp(u.Status,'open'))
     NetworkError(u,'Connection failed!');
 end


%% Start Data transmission by trigger
fprintf(u, 'Requesting Data')


%% Callback Funktion
function DatagramReceivedFcn(u,~) 
    %avail = u.BytesAvailable;
    datagram = fscanf(u);
    disp('Data Received!');
    disp(datagram);

end

1 Ответ

0 голосов
/ 05 ноября 2019

Я думаю, вы можете использовать здесь вложенную функцию, которая действует как «замыкание»! Создайте переменную для использования в качестве буфера за пределами вашей функции, а затем укажите / присвойте ее внутри вложенной функции DatagramReceivedFcn.

Чтобы это работало, весь остальной код должен быть в функциисам по себе.

function DoTheThing

%% Specify a Server (host name or IP address) with Port 8080
u = udp('192.168.0.164', 8080);  %UDP Object

% Here's your buffer in the enclosing function
myBuffer = {};

u.InputBufferSize = 1024;
u.ReadAsyncMode = 'continuous';
u.DatagramReceivedFcn = @DatagramReceivedFcn;

% [...]

%% Start Data transmission by trigger
fprintf(u, 'Requesting Data')


%% Callback Function
function DatagramReceivedFcn(u,~) 
    %avail = u.BytesAvailable;
    datagram = fscanf(u);
    disp('Data Received!');
    disp(datagram);
    myBuffer{end+1} = datagram;  % References myBuffer in the enclosing function!
end

end

И, вероятно, было бы более читабельным, если бы вы переместили функцию обратного вызова вверх, чтобы быть рядом с инициализацией myBuffer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...