реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Матлаб и пакеты UDP
_Anatoliy
сообщение Jul 3 2017, 07:47
Сообщение #1


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 381
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Всем доброго времени суток!
Мне нужно принять информацию из разрабатываемого изделия в Матлаб посредством Ethernet , пакеты UDP. Протокол простой - отсылаю пакет с кодом команды и параметром, изделие в ответ высылает 4 пакета UDP с информацией. Вроде всё работает , но почему-то не могу прочитать нужное количество байт из принятых пакетов. В основном принимается 512 байт, иногда меньше. Мне же нужно принять из каждого пакета 1026 байт. Как решить эту задачу?
Код
    fwrite(u,[52 01]);
    C = fread(u,1026);
    D = fread(u,1026);
    E = fread(u,1026);
    F = fread(u,1026);
Go to the top of the page
 
+Quote Post
MiPe
сообщение Jul 3 2017, 08:00
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 17-08-11
Пользователь №: 66 760



По умолчанию размер входного буфера у объекта udp - 512 байт.
Если пользовательский код не успевает прочитать из буфера, то данные перезаписываются.
В документации к функции udp говорится о том, как поменять размер входного буфера, см. web(fullfile(docroot, 'instrument/udp.html')) и свойство InputBufferSize.
Go to the top of the page
 
+Quote Post
Swup
сообщение Jul 3 2017, 08:08
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Если у вас 4 пакета приходят сразу, то лучше дождаться их всех.
В udp объекте есть поле byteAvailable для этого. А потом все данные считать одним fread.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jul 3 2017, 08:24
Сообщение #4


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 381
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Swup @ Jul 3 2017, 11:08) *
Если у вас 4 пакета приходят сразу, то лучше дождаться их всех.
В udp объекте есть поле byteAvailable для этого. А потом все данные считать одним fread.

Спасибо! Только в хелпе не могу найти описание этого byteAvailable crying.gif
Нет ли у Вас примера какого?

Цитата(MiPe @ Jul 3 2017, 11:00) *
По умолчанию размер входного буфера у объекта udp - 512 байт.
Если пользовательский код не успевает прочитать из буфера, то данные перезаписываются.
В документации к функции udp говорится о том, как поменять размер входного буфера, см. web(fullfile(docroot, 'instrument/udp.html')) и свойство InputBufferSize.

Спасибо! Сейчас гляну.
Подправил так :
Код
u = udp('10.0.0.7',4660,'InputBufferSize',1026);


Тоже не проехало...

если же сделать 2048 байт
Код
u = udp('10.0.0.7',4660,'InputBufferSize',2048);

то считывается 1026 или 1022 байт непредсказуемо...
Вариант считывания каждого пакета мне подходит больше.
Прикрепленные изображения
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Swup
сообщение Jul 3 2017, 08:30
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Код
%шлем команду
fwrite(u_cmd, send_pack, 'uint32');

    % ждем либо таймаут 200мсек либо пока придет 16 байт
    waiting_packet_length = 4*4;
    answ = 1;
    pause_cnt = 0;
    pause_step = 0.01;
    pause_timeout = 0.2;
    while u_cmd.BytesAvailable < waiting_packet_length
        pause(pause_step);
        pause_cnt = pause_cnt+pause_step;
        if pause_cnt>pause_timeout
            answ = 0;
            break
        end
    end
    

    if(answ)
        % читаем данные
        answer_buff = fread(u_cmd,waiting_packet_length,'uint32');
        reg_data = answer_buff(4);
    res = 1;
    else
        % обрабатываем отсутствие ответа
        reg_data = 0;
        res = 0;
    end

%res и reg_data я дальше вывожу в вызывающую функцию


Я так читаю управляющие регистры, но с потоками данных и файлами, все примерно также
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jul 3 2017, 09:28
Сообщение #6


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 381
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Swup @ Jul 3 2017, 11:30) *
Я так читаю управляющие регистры, но с потоками данных и файлами, все примерно также

Большое спасибо! Буду пробовать.

Вот так написал для ответа квитанции (18 байт) и 256 пакетов с данными:
Код
waiting_packet_length = 256*1026+18;
    answ = 1;
    pause_cnt = 0;
    pause_step = 0.01;
    pause_timeout = 0.2;
    while u_cmd.BytesAvailable < waiting_packet_length
        pause(pause_step);
        pause_cnt = pause_cnt+pause_step;
        if pause_cnt>pause_timeout
            answ = 0;
            break
        end
    end


Переменная answ всегда равна нулю,т.е. обнуляется. Что нужно изменить?
Go to the top of the page
 
+Quote Post
Swup
сообщение Jul 3 2017, 15:58
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Цитата(_Anatoliy @ Jul 3 2017, 13:28) *
Переменная answ всегда равна нулю,т.е. обнуляется. Что нужно изменить?


Либо не приходит данных сколько надо, либо буфер маленький, либо таймаут маленький.
1. проверьте сниффером пакеты
2. проверьте настройки udp при создании
3. сделайте что-то типа
Код
  pause_step = 0.01;
    pause_timeout = 1;
    while u_cmd.BytesAvailable < waiting_packet_length
        pause(pause_step);
        pause_cnt = pause_cnt+pause_step;
        u_cmd.BytesAvailable
        if pause_cnt>pause_timeout
            answ = 0;
            break
        end
    end
        u_cmd.BytesAvailable

Увидите как BytesAvailable меняется и сколько в итоге набралось. По результатам увеличьте таймаут.
Кстати если быстрая реакция не нужна, сделайте pause_step побольше.


Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jul 4 2017, 12:16
Сообщение #8


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 381
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



У меня всё заработало, всем большое спасибо за советы!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2017 - 00:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016