Вопрос о размере буфера приема Read Visa

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы

Вопрос о размере буфера приема Read Visa

Postby Vladimir_T on 10 Apr 2014, 11:17

Здравствуйте, уважаемые коллеги, подскажите в таком вопросе. Отлаживаю прибор, подключенный через переходник USART-USB посредством виртуального COM-порта, скорость 256000 б/сек. Прием/передача работают нормально, если размер массива данных (u32) менее 4095, если массив длиннее, то данные - нули, появляется ошибка приема по таймауту. Конечно определил размер буфера VISA с помощью функции, делаю очистку буфера перед приемом - ничего не помогает. Как можно увеличить размер буфера приема и как VISA работает в виртуальным портом? Кусок программы сбора данных приведен.
Attachments
Tst.png
Цикл чтения порта
Vladimir_T
junior
junior
 
Posts: 54
Joined: 13 Sep 2011, 18:06
LabVIEW Version: 2009
Karma: 0

Re: Вопрос о размере буфера приема Read Visa

Postby dadreamer on 10 Apr 2014, 20:29

А инструмент под названием VISA Set I/O Buffer Size проверяли? По умолчанию размер входного/выходного буфера в Визе равен 4096 байт. Вам нужно после конфигурирования порта (VISA Configure Serial Port) задать размер буфера заведомо больше, чем предельный размер ваших данных. Если данных очень много, то читайте их чаще в цикле, складывайте данные в массив или строковую переменную, а разберёте потом. Очистку буфера не рекомендую использовать без надобности, так вы можете потерять часть данных и вообще, это лишняя вещь при корректном приёме пакетов. Также вам бы не помешало сделать чтение по количеству имеющейся в порту информации: проверяйте число байт с помощью VISA Bytes At Port, если оно не равно 0, то читайте столько, сколько есть.
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

Re: Вопрос о размере буфера приема Read Visa

Postby Vladimir_T on 14 Apr 2014, 17:51

Здравствуйте, спасибо за ответ. Функцию VISA Set I/O Buffer Size я использую, как писал ранее. Размер буфера задал заведомо большим, но принитает все равно лишь 4096 слов u32, т.е. будто размер не меняется! Но ведь по умолчанию буфер - 4096 байт, а у меня принимает 4096 слов U32. Первые данные принимает, а следующие данные VISA не принимает, просто находится в ожидании, а заканчивает прием с ошибкой таймаута. Попробовал принмать блоками менее 4096, первый блок принимается, а следующий нет, ошибка приема по таймауту.
Vladimir_T
junior
junior
 
Posts: 54
Joined: 13 Sep 2011, 18:06
LabVIEW Version: 2009
Karma: 0

Re: Вопрос о размере буфера приема Read Visa

Postby dadreamer on 14 Apr 2014, 18:18

Vladimir_T
А вот так пробовали считывать данные?
2014-04-14_21-15-12.jpg

Что в терминале происходит? Нормально читается? И почему у вас такая странная скорость стоит (256000)? В Windows предельная скорость порта - 128 000 бит в секунду.
Attachments
2014-04-14_21-17-19.jpg
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

Re: Вопрос о размере буфера приема Read Visa

Postby Vladimir_T on 28 Apr 2014, 18:50

Скорость передачи для виртуального последовательного канала не имеет значения. Сейчас удается принимать блоки по 62 кБ и без ошибок. Вычитываю по методу, предложенному Вами, и все же около 960 последних байт теряю. Причем чтение в цикле for (i=0; i <= 62980; i++), вычитываю 62 кБ, цикл завершается корректно без таймаута, но остаток пакета в LV не доходят....
Vladimir_T
junior
junior
 
Posts: 54
Joined: 13 Sep 2011, 18:06
LabVIEW Version: 2009
Karma: 0

Re: Вопрос о размере буфера приема Read Visa

Postby dadreamer on 28 Apr 2014, 19:29

Vladimir_T wrote:Скорость передачи для виртуального последовательного канала не имеет значения.

Тут от многих факторов зависит: от производителя микросхемы, от драйвера, от возможностей ОС, от возможностей Визы, и того, как она воспринимает COM-порт. Мне кажется, что должно быть соответствие параметров в ОС и в среде разработки, иначе вероятны ошибки чтения/записи. Если устройство и драйвер способны передавать данные на бóльшей скорости, то они повысят её автоматом. Но всё равно для USB верхний порог передачи - способность самого интерфейса - для USB 2.0 это от 12 Мбит/с до 480 Мбит/с (в зависимости от режима работы и типа устройства), для USB 3.0 - до 5 Гбит/с.

Вы, кстати, нигде не упомянули производителя переходника USB-UART и маркировку схемы.

Причем чтение в цикле for (i=0; i <= 62980; i++), вычитываю 62 кБ, цикл завершается корректно без таймаута, но остаток пакета в LV не доходят

Может, лучше читать в цикле While, пока не будут считаны все данные? И что в терминале: есть потери или нет?
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet


Return to Коммуникация с приборами

Who is online

Users browsing this forum: No registered users and 19 guests

cron