Обработка параллельных исполнений UDP DatagramReceivedFcn в Matlab

Я пытаюсь прочитать значения глубины океана на нескольких частотах, которые передаются через пакеты UDP. Что я делаю, так это говорю программе регистрации возвращать значения глубины на определенный порт UDP, а затем использовать DatagramReceivedFcn для запуска функции при получении данных и, по существу, сохранения этой глубины.

u1 = udp(remoteip,dataport18,'ByteOrder','littleEndian','LocalPort',dataport18,'DatagramTerminateMode','off');
set(u1,'InputBufferSize',6000);
u1.DatagramReceivedFcn = {@receivedata18};
fopen(u1);

Таким образом, когда данные будут получены на порту, указанном в «dataport18», будет запущена функция ReceiveData18(). Однако я пытаюсь прочитать данные о глубине для нескольких частот, поэтому я создаю дополнительные объекты UDP:

u2 = udp(remoteip,dataport38,'ByteOrder','littleEndian','LocalPort',dataport38,'DatagramTerminateMode','off');
set(u2,'InputBufferSize',6000);
u2.DatagramReceivedFcn = {@receivedata38};
fopen(u2);

Однако я обнаружил, что сохраняются только данные для u1 (18 кГц). Я предполагаю, что, поскольку обе частоты пингуются одновременно, они оба отправляют свои UDP-пакеты и пытаются одновременно оценить свои соответствующие функции, на что Matlab не способен.

Это действительно то, что происходит? Если да, то есть ли способ обойти эту проблему, чтобы я мог одновременно читать данные о глубине, которые отправляются одновременно из двух отдельных пакетов UDP?

Спасибо!

Обновить

Мне интересно, понадобится ли мне Parallel Computing Toolbox для выполнения этого. У меня есть аналогичная программа на Python, которая выполняется практически так же, но проблем с ней нет. Я предполагаю, что Matlab не может выполнять одновременные функции без Parallel Computing Toolbox.


person Josiah    schedule 03.05.2012    source источник
comment
Каковы функции ReceiveData38/18? Что они делают? Вы передаете им правильную ссылку на объект udp? Может быть, они обращаются к одному и тому же буферу? Кроме того, что вы имеете в виду под частотой? Я считаю, что вы должны использовать асинхронные режимы для объектов, чтобы ваш код работал правильно.   -  person Jorge    schedule 06.05.2012
comment
Полученные функции data18/38 привязаны к объектам u1 и u2 соответственно. Следовательно, когда данные получены на портах u1 и u2, эти функции запускаются и считывают входной буфер на u1 и u2. Так что да, им передается правильная ссылка. Они получают доступ к одному и тому же буферу, только если я устанавливаю dataport18 равным dataport38. Возможно, мне нужно изучить использование асинхронного режима. Спасибо.   -  person Josiah    schedule 09.05.2012


Ответы (1)


Думаю, я должен обновить это, если кому-то не все равно. На самом деле это не ответ на мой вопрос, но то, что я сейчас делаю, работает.

Вместо того, чтобы отправлять данные на другой порт UDP, я просто отправляю их на один и тот же порт, а затем последовательно считываю их. Таким образом, я не читаю их синхронно, хотя на самом деле это не сильно замедляет работу.

person Josiah    schedule 27.09.2012