Опять про размер буфера

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

Опять про размер буфера

Сообщение Vladimir_T »

Здравствуйте, уважаемые коллеги, скажите, почему функция VISA set I/O Buffer Size не работает! Размер буфера для приема/передачи установлен 4096 - его в моем случае недостаточно:
При приеме массива размером 12 кБ по COM-порту (через виртуальный порт), после приема 4096 байт пропадают 3-4 байта (видимо пока полный буфер копируется в рабочий) и с таким массивом уже ничего не сделать в дальнейщем.
Поэтому с помощью функции VISA Set I/O Buffer Size устанавливаю нужный размер, но размер буфера - не изменяется, а потому ошибка при приеме та же.
При приеме этого же массива через терминальную программу ошибок приема - нет.
Моя программа работы очень простая, стараюсь исключить любые задержки, но не помогает.

Посоветуйте, пожалуйста, варианты решения.
Заранее благодарен.
Вложения
VISA_IO_Buffer.png
Vladimir_T
user
user
Сообщения: 72
Зарегистрирован: 13 сен 2011, 18:06
Версия LabVIEW: 2009
Контактная информация:

Re: Опять про размер буфера

Сообщение Vladimir_T »

В справочнике LabView написано :
Note Not all serial drivers support user-defined buffer sizes so some implementations of VISA might not be able to perform this operation.

Видимо драйвер EXAR 14xx (это м/с моста USB-RS232) не позволяет менять размер буфера.
И все же я не поверю, чтобы LV на скорости 115200 не успевала вычитывать приемный буфер. Что-то тут у меня не так...
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Опять про размер буфера

Сообщение Borjomy_1 »

А где у вас конфигурация последовательного порта? По умолчанию, например, устанавливаются такие параметры, при которых вы вообще ничего не прочитаете.
Рекомендация: если у вас не требуется реакции, а только снятие телеметрии, то вычитывайте больше за один раз, а уже потом разбирайте полученное. При чтении из порта накладные расходы значительно выше циклической обработки.
И еще. если все правильно, но байты пропадают, может быть дело в контроллере COM-USB. Некоторые вообще подвешивают сбор в произвольный момент времени.
Vladimir_T
user
user
Сообщения: 72
Зарегистрирован: 13 сен 2011, 18:06
Версия LabVIEW: 2009
Контактная информация:

Re: Опять про размер буфера

Сообщение Vladimir_T »

Спасибо за ответ.
Конфигурацию порта я не стал приводить, но он действительно стандартная: скорость 115200/8/1/N без контроля терминаторов.
Данные читаются в потоке нормально, но только размер пакета должен быть не более 4096 байт. Поток данных вычитывается из порта за один раз в цикле. Понимаю, что обработка цикла вносит задержки.
Буду пробовать вычитывать пакет без цикла, если не пойдет, тогда придется разбивать пакет на блоки кратно размеру 4096 байт.
Хочется, сделать надежную систему, чтобы в последствии работала и на другом ПК.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Опять про размер буфера

Сообщение Borjomy_1 »

Далась вам кратность 4096... Считывайте пакеты по 100-1000 байт (вместо 2 указывайте 100, а потом строку преобразовывайте массив, у вас число для указания типа преобразования, вместо него указывайте массив этого-же типа, и цикл не понадобится). По 1-2 байтам, как у вас в примере - действительно, не надо.
Vladimir_T
user
user
Сообщения: 72
Зарегистрирован: 13 сен 2011, 18:06
Версия LabVIEW: 2009
Контактная информация:

Re: Опять про размер буфера

Сообщение Vladimir_T »

По паре байт приходится вычитывать, потому, что нужно все же на лету разобрать заголовок пакета для идентификации. Тело пакета также пословно читаю. Да и все нормально вроде, пока не запустил тестовый пакет, где и увидел ошибки приема. А статус приема VISA в порядке, без ошибок. Теперь тело пакета буду читать блоками.
Как быть, если указано принимать 100 байт, а пришел остаток пакета, пусть 20 байт? Будет ошибка таймаута, правда если контрольная сумма в порядке, тогда ошибку можно проигнорировать?
Спасибо за совет и желание помочь.
Аватара пользователя
dadreamer

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

Re: Опять про размер буфера

Сообщение dadreamer »

Vladimir_T писал(а):Теперь тело пакета буду читать блоками.
Посмотрите вот этот пример, может быть, подойдёт. Суть примера в том, что сразу после приёма данные из порта складываются в строковый массив (буфер). Отдельный элемент массива соответствует одному пакету. Разделение входных данных на пакеты производится по маркеру заголовка пакета. При желании можно выполнить анализ пакета ещё и по его длине.
В одном цикле вы можете выполнять парсинг и накопление входных данных в массив-буфер, а в другом цикле - чтение из массива и дальнейшую обработку. Связь между циклами выполняется обычной очередью. Таким образом у вас будут развязаны операции приема данных и обработки, и влияние одного на другое будет исключено.
Vladimir_T писал(а):Как быть, если указано принимать 100 байт, а пришел остаток пакета, пусть 20 байт? Будет ошибка таймаута, правда если контрольная сумма в порядке, тогда ошибку можно проигнорировать?
Добавляете полученные 20 байт к остальным, получаете цельный пакет, обрабатываете ошибку. По длине пакета и по его заголовку вы сможете определить, битый он или нет.
Ответить

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