|
|
  |
Матлаб и пакеты UDP |
|
|
|
Jul 3 2017, 07:47
|

Утомлённый солнцем
     
Группа: Свой
Сообщений: 2 646
Регистрация: 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);
|
|
|
|
|
Jul 3 2017, 08:00
|
Участник

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

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

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

|
Цитата(Swup @ Jul 3 2017, 11:08)  Если у вас 4 пакета приходят сразу, то лучше дождаться их всех. В udp объекте есть поле byteAvailable для этого. А потом все данные считать одним fread. Спасибо! Только в хелпе не могу найти описание этого byteAvailable Нет ли у Вас примера какого? Цитата(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 байт непредсказуемо... Вариант считывания каждого пакета мне подходит больше.
Прикрепленные изображения
|
|
|
|
|
Jul 3 2017, 08:30
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 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 я дальше вывожу в вызывающую функцию Я так читаю управляющие регистры, но с потоками данных и файлами, все примерно также
|
|
|
|
|
Jul 3 2017, 09:28
|

Утомлённый солнцем
     
Группа: Свой
Сообщений: 2 646
Регистрация: 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 всегда равна нулю,т.е. обнуляется. Что нужно изменить?
|
|
|
|
|
Jul 3 2017, 15:58
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 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 побольше.
|
|
|
|
|
Sep 26 2017, 15:48
|
Группа: Участник
Сообщений: 5
Регистрация: 26-09-17
Пользователь №: 99 485

|
А у меня не работает(((
|
|
|
|
|
Nov 15 2017, 22:24
|
Местный
  
Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639

|
Цитата(yanusa @ Sep 26 2017, 18:48)  А у меня не работает((( Если вы под Виндовозом, то он очень капризен по части скурпулёзности выставки параметров пакетов. В большинтсве случаев, если в IP-заголовке не верно установлен IP-адрес, или макушник, то Варешарк пакеты покажет, т.к. он "садится" прямо по верх специального сетевого драйвера-насадки, но до верхних приложений они не доберутся. Проверяйте, что IP-адрес и макушник соотвествуют хосту и у вас открыт UDP-порт, который прописан в UDP-заголовке пакетов. Кроме того, проверьте ещё раз, что контрольные суммы прописаны. UDP позволяет закатать значение +0 в поле КС, которое означает, что его не вычисляли, но такой пакет практически 100% не пройдёт через крупную сеть (тем более - через Инет). КС IP-заголовка, теоретически, тоже можно не считать, но такой пакет приедет в Варешарк, но будет 100% прибит системой и до Матлаба не доедет. Кроме того, у некоторых сетевых карта есть опция, позволяющая всасывать в хост пакеты даже с битым crc32! И, по закону подлости, она (конечно!) оказывается включённой по умолчанию. Такой пакет железно дальше драйвера не уедет. А вообще, если разрешается, то вот внешняя ссылка (http://we.easyelectronics.ru/electro-and-pc/neskolko-slov-ob-otladke-1gb-ethernet-proektov-na-plis-chast-ii.html) на мою статью на "Изиэлектроникс", там больше подробностей. Заранее прошу прощения у модераторов, если ссылку ставить нельзя.
Сообщение отредактировал Kluwert - Nov 15 2017, 22:35
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|