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

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
Vladimir_T
user
user
Сообщения: 72
Зарегистрирован: 13 сен 2011, 18:06
Версия LabVIEW: 2009
Контактная информация:

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

Сообщение Vladimir_T »

Здравствуйте, уважаемые коллеги, подскажите в таком вопросе. Отлаживаю прибор, подключенный через переходник USART-USB посредством виртуального COM-порта, скорость 256000 б/сек. Прием/передача работают нормально, если размер массива данных (u32) менее 4095, если массив длиннее, то данные - нули, появляется ошибка приема по таймауту. Конечно определил размер буфера VISA с помощью функции, делаю очистку буфера перед приемом - ничего не помогает. Как можно увеличить размер буфера приема и как VISA работает в виртуальным портом? Кусок программы сбора данных приведен.
Вложения
Цикл чтения порта
Цикл чтения порта
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

А инструмент под названием VISA Set I/O Buffer Size проверяли? По умолчанию размер входного/выходного буфера в Визе равен 4096 байт. Вам нужно после конфигурирования порта (VISA Configure Serial Port) задать размер буфера заведомо больше, чем предельный размер ваших данных. Если данных очень много, то читайте их чаще в цикле, складывайте данные в массив или строковую переменную, а разберёте потом. Очистку буфера не рекомендую использовать без надобности, так вы можете потерять часть данных и вообще, это лишняя вещь при корректном приёме пакетов. Также вам бы не помешало сделать чтение по количеству имеющейся в порту информации: проверяйте число байт с помощью VISA Bytes At Port, если оно не равно 0, то читайте столько, сколько есть.
Vladimir_T
user
user
Сообщения: 72
Зарегистрирован: 13 сен 2011, 18:06
Версия LabVIEW: 2009
Контактная информация:

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

Сообщение Vladimir_T »

Здравствуйте, спасибо за ответ. Функцию VISA Set I/O Buffer Size я использую, как писал ранее. Размер буфера задал заведомо большим, но принитает все равно лишь 4096 слов u32, т.е. будто размер не меняется! Но ведь по умолчанию буфер - 4096 байт, а у меня принимает 4096 слов U32. Первые данные принимает, а следующие данные VISA не принимает, просто находится в ожидании, а заканчивает прием с ошибкой таймаута. Попробовал принмать блоками менее 4096, первый блок принимается, а следующий нет, ошибка приема по таймауту.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Vladimir_T
А вот так пробовали считывать данные?
2014-04-14_21-15-12.jpg
Что в терминале происходит? Нормально читается? И почему у вас такая странная скорость стоит (256000)? В Windows предельная скорость порта - 128 000 бит в секунду.
Вложения
2014-04-14_21-17-19.jpg
Vladimir_T
user
user
Сообщения: 72
Зарегистрирован: 13 сен 2011, 18:06
Версия LabVIEW: 2009
Контактная информация:

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

Сообщение Vladimir_T »

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

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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

Вы, кстати, нигде не упомянули производителя переходника USB-UART и маркировку схемы.
Причем чтение в цикле for (i=0; i <= 62980; i++), вычитываю 62 кБ, цикл завершается корректно без таймаута, но остаток пакета в LV не доходят
Может, лучше читать в цикле While, пока не будут считаны все данные? И что в терминале: есть потери или нет?
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»