VISA Bytes at Serial Port не выполняет своих функций
-
- user
- Сообщения: 95
- Зарегистрирован: 05 июл 2016, 21:02
- Версия LabVIEW: 12
- Контактная информация:
VISA Bytes at Serial Port не выполняет своих функций
Проблема в том, что инструмент VISA Bytes at Serial Port не видит количество байтов в этом самом порту! При подключении к VISA Read подает на неё 0. Хотя при этом информация в порте есть и при замене инструмента VISA Bytes at Serial Port на константу она считывается как надо. В чем может быть причина такой проблемы? Использовать константу не получится из-за особенностей ВИ.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
При подаче константы VISA будет ждать нужное количество байтов на протяжении некоторого времени (таймаута). Поэтому не факт, что у Вас моментально на момент чтения находятся в буффере байты - может там сначала ничего нет, а через пару миллисекунд уже есть данные. И если в буффере ничего нет, функция VISA Bytes at Serial Port выдает ноль, и функция VISA Read ничего уже не ждет.
Меня функция VISA Bytes at Serial Port не подводила, честно говоря...
А проверить просто - читайте при помощи константы, и считывайте при помощи VISA Bytes at Serial Port количество байтов (перед чтением) на индикатор. Должны увидеть количество байтов, которое возвращает VISA Bytes at Serial Port.
Меня функция VISA Bytes at Serial Port не подводила, честно говоря...
А проверить просто - читайте при помощи константы, и считывайте при помощи VISA Bytes at Serial Port количество байтов (перед чтением) на индикатор. Должны увидеть количество байтов, которое возвращает VISA Bytes at Serial Port.
Мы делили апельсин - много наших полегло...
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: VISA Bytes at Serial Port не выполняет своих функций
Потому что VISA Read ожидает поступления заданного количества байт. А Bytes At Port - показывает текущее состояние. Вывод - на момент вызова функции в буфере нет данных.
Попробуйте в Панели управления/система и т.д в настройках порта установить размер FIFO = 1 (это уменьшит задержки на доставку байта из порта в буфер, но никак не гарантирует, что программа будет всегда правильно работать).
Но вообще это принципиально неправильно использовать Bytes At Port.
Попробуйте в Панели управления/система и т.д в настройках порта установить размер FIFO = 1 (это уменьшит задержки на доставку байта из порта в буфер, но никак не гарантирует, что программа будет всегда правильно работать).
Но вообще это принципиально неправильно использовать Bytes At Port.
Почему? Правильно написанный протокол обмена дает возможность так или иначе определить размер посылки.Использовать константу не получится из-за особенностей ВИ.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
AlexOskar, таймаут операций чтения/записи делаете скажем 50-100 мс и анализируете кластер error out после VISA Read. Таким образом можно избежать использования VISA Bytes At Serial Port. Это в простом случае, когда не хотите заморачиваться с протоколом. Но лучше сделать так, как сказал Borjomy_1.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
Borjomy_1, почему? Что неправильного то?Borjomy_1 писал(а):Но вообще это принципиально неправильно использовать Bytes At Port.
Задача вычитки заранее неизвестного количества байт достаточно распространенная. Конкатенация принятых байт до некоторого размера и парсинг - это более профессиональный подход, нежели на каждую отдельную команду хардкодить определенный размер данных для чтения.
Пример: прибор самостоятельно отправляет служебную информацию в порт. Возможно такое? Легко! Всё, сели в калошу с константами.
Практика показывает, что размеры длин пакетов меняются несколько раз в процессе разработки. Далее, гораздо проще однажды определить заголовок пакета и позицию байта с длинной, чтоб потом его использовать везде. В крайнем случае, в коде надо будет поправить позицию байта длинны для корректного парсинга и всё. Если протокол сторонний(например от прибора информацию вычитываем), то тем более следует постоянно слушать порт и выгребать всё, что приходит, а затем анализировать. Исключение: прибор отправляет мусор в порт, а на запрос отвечает валидными данными. Отправил валидные данные и дальше мусор шпарит.
А хардкодить размер вычитываемых данных - это для попсовых и "тепличных" задач. Шаг влево, шаг вправо - программа не работает, нужны правки.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: VISA Bytes at Serial Port не выполняет своих функций
Я не предлагаю хардкорить чтение. Правильно написанный протокол обмена дает возможность так или иначе определить размер посылки, в том числе по типу посылки и по полям внутри ее.
Когда прибор отправляет мусор в порт, сам прибор надо отправлять в мусор. А программисту, который написало ПО для него, руки выдергивать.
Надо внимательно читать описание протокола. ИМХО в 100% случаев порт слушать через Bytes At Port БЕЗГРАМОТНО. Если так хочется анализировать внавал, читайте по 1 байту.
По поводу картинки. А вы в курсе, что обновление информации для Bytes At Port может происходить с интервалом до 50 мс? Не, не знали? А то, что посылка 1 байта занимает меньше 100мкс, т.е задержка в 10мс означает, что ловить 1 байт и 100 будете одинаковое время? И получите фатальное ограничение групповой скорости обмена.
Когда прибор отправляет мусор в порт, сам прибор надо отправлять в мусор. А программисту, который написало ПО для него, руки выдергивать.
Если протокол сторонний(например от прибора информацию вычитываем), то тем более следует постоянно слушать порт и выгребать всё, что приходит, а затем анализировать.
Надо внимательно читать описание протокола. ИМХО в 100% случаев порт слушать через Bytes At Port БЕЗГРАМОТНО. Если так хочется анализировать внавал, читайте по 1 байту.
По поводу картинки. А вы в курсе, что обновление информации для Bytes At Port может происходить с интервалом до 50 мс? Не, не знали? А то, что посылка 1 байта занимает меньше 100мкс, т.е задержка в 10мс означает, что ловить 1 байт и 100 будете одинаковое время? И получите фатальное ограничение групповой скорости обмена.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
Зря вы так. Данные копятся в буфере порта. Читать данные нужно пачками, а не по одному байту. Либо копить данные в течении N мс и выдавать на обработку. А не обрабатывать каждый приходящий пакет.Borjomy_1 писал(а):Надо внимательно читать описание протокола. ИМХО в 100% случаев порт слушать через Bytes At Port БЕЗГРАМОТНО. Если так хочется анализировать внавал, читайте по 1 байту. По поводу картинки. А вы в курсе, что обновление информации для Bytes At Port может происходить с интервалом до 50 мс? Не, не знали? А то, что посылка 1 байта занимает меньше 100мкс, т.е задержка в 10мс означает, что ловить 1 байт и 100 будете одинаковое время? И получите фатальное ограничение групповой скорости обмена.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: VISA Bytes at Serial Port не выполняет своих функций
В таком случае непонятно, что мешает вычитывать из буфера четко по 100 байт например. Частота выдачи известна пакетов(надеюсь). В вашем внутреннем буфере все равно поток склеенный. Вы и так и так не синхронизируетесь с прибором по посылам.Зря вы так. Данные копятся в буфере порта. Читать данные нужно пачками, а не по одному байту. Либо копить данные в течении N мс и выдавать на обработку. А не обрабатывать каждый приходящий пакет.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
Таймаут, обработка ошибок, бесконечное ожидание 100 байт, которые могут не набраться.Borjomy_1 писал(а):В таком случае непонятно, что мешает вычитывать из буфера четко по 100 байт например. Частота выдачи известна пакетов(надеюсь). В вашем внутреннем буфере все равно поток склеенный. Вы и так и так не синхронизируетесь с прибором по посылам.
Вы от меня что хотите то?
Я задал простой вопрос: "почему неправильно использовать Bytes At Port?"
Ответ: иногда это приводит к простою цикла вычитывания данных. Всё. Тут важен баланс.
Тем не менее, это не является какой-то принципиальной неправильностью. Повторяюсь, задача: подключиться к прибору и вычитывать всё, что от него приходит.
Решение: использование Bytes At Port с последующей конкатенацией полученных байт. Вы терминалом для COM-порта когда-нибудь пользовались? Там никто не требует указания количества ожидаемых байт на порте. Предполагаю, что там механизм взаимодействия построен на опросе буфера порта через определенную задержку(каждые N мс). И данные валят по мере поступления.
Меня устраивает баланс между регулировкой времени опроса порта и накоплением данных.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
Это же всё неоднократно обсуждалось. Зачем опять делать то же самое.
http://labviewportal.org/viewtopic.php?p=65830#p65830
http://labviewportal.org/viewtopic.php?p=65865#p65865
http://labviewportal.org/viewtopic.php?p=65830#p65830
http://labviewportal.org/viewtopic.php?p=65865#p65865
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
dadreamer, можно в двух словах? Там читать не перечитать.
Почему Bytes At Port использовать - лажа? А то у меня работает и всё хорошо, а оказывается я фигню напрограммировал...У меня от железки идёт поток данных, boudrate 115200(и выше). Цель: получать все сообщения, парсить, отображать. Мои простои в N мс. до фонаря. Главное чтоб вычитывал и выводил на экран более-менее быстро.
Второй вопрос: каким образом работают терминалы? Я предположил, что так же с опросом буфера по некоторому таймауту. Возможно побайтно конечно же, но сомнения меня терзают.
Почему Bytes At Port использовать - лажа? А то у меня работает и всё хорошо, а оказывается я фигню напрограммировал...У меня от железки идёт поток данных, boudrate 115200(и выше). Цель: получать все сообщения, парсить, отображать. Мои простои в N мс. до фонаря. Главное чтоб вычитывал и выводил на экран более-менее быстро.
Второй вопрос: каким образом работают терминалы? Я предположил, что так же с опросом буфера по некоторому таймауту. Возможно побайтно конечно же, но сомнения меня терзают.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
1. Лажа, не лажа, а это дополнительная операция, занимающая определённое время. Можно обойтись без этой операции. Кроме того, VISA Read итак организует внутри себя цикл побайтового чтения и склейки данных: http://labviewportal.org/viewtopic.php?p=65914#p65914 Потому совершенно нерационально сооружать поверх VISA Read второй цикл чтения и склейки, также отнимающий определённое время программы. Самый опциональный подход - однократное чтение данных из порта посредством VISA Read при правильно сконфигурированных параметрах порта (терминатор, таймаут и прочее). Borjomy_1 описал порядок действий при приёме данных, имеющих заранее известный формат, и бинарных (сырых) данных. В том случае, когда терминатор по каким-то причинам не может быть использован совсем, используется VISA Read с максимальным количеством байт, которое способен вместить порт (4096 по дефолту). Таким образом, все данные будут извлечены из порта, а кластер ошибки скажет, есть ли ещё данные в порту или нет.
2. Каждый терминал работает так, как его написал разработчик. Поэтому нужно разбирать работу в каждом конкретном случае. Может и так, как вы пишете. Может работать по WinAPI'шным событиям. Может и тупо по 1 байту читать. Если так интересно, берёте логгер/сниффер WinAPI и смотрите, что вызывается.
2. Каждый терминал работает так, как его написал разработчик. Поэтому нужно разбирать работу в каждом конкретном случае. Может и так, как вы пишете. Может работать по WinAPI'шным событиям. Может и тупо по 1 байту читать. Если так интересно, берёте логгер/сниффер WinAPI и смотрите, что вызывается.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
dadreamer, Хорошо, с этим разобрались. Но в этом случае получается, что вызывать функцию VISA Read придётся чаще.
Первым запросом читаем длину, вторым запросом читаем сообщение(как в TCP/IP-шном примере). Либо просто вызываем VISA Read, ждем N байт в течении N мс и завершаем работу по таймауту либо по терминатору(которого может и не быть). Но опять же таймаут есть и обработка ошибки. Зато вызвали функцию один раз. Не замерял я быстродействие вызова Bytes At Port, но сдаётся мне что этот вызов не приведёт к катастрофе временного исполнения программы в целом.
Первым запросом читаем длину, вторым запросом читаем сообщение(как в TCP/IP-шном примере). Либо просто вызываем VISA Read, ждем N байт в течении N мс и завершаем работу по таймауту либо по терминатору(которого может и не быть). Но опять же таймаут есть и обработка ошибки. Зато вызвали функцию один раз. Не замерял я быстродействие вызова Bytes At Port, но сдаётся мне что этот вызов не приведёт к катастрофе временного исполнения программы в целом.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: VISA Bytes at Serial Port не выполняет своих функций
Сам вызов ничего не стоит с точки зрения быстродействия. Но во-первых вы путаете частное с общим, во вторых при приеме данных в буфер значения о количестве байт обновляются не в реальном времени. Эти задержки нелимитированы, тем более, что минимальный дискрет опроса, который вы можете задать в цикле (1мс) в десять раз больше времени передачи 1 байта. Для более высоких скоростей разница еще больше. И тут мы попадаем в зону нечувствительности: либо 0, либо 10 (при непрерывном потоке). Если посылка некратна интервалу опроса, то получается задержка не менее одного цикла. Ваш метод годится для мизерного количества ситуаций и тем более неприемлем для диалогового обмена. Вызов функции VISA Read если в буфере есть данные - ничего не стоит. Повторюсь, что исследования показали, что размер буфера FIFO критически влияет на латентность функции к приему данных. Опять же, если мы даем советы, то начинать надо с фундаментальных вещей, а не "хакерства". Фундаментальная вещь в данном случае состоит в том, что принимающая сторона должна вычитывать посылку целиком, в соответствии со спецификацией. И если вы знаете формат посылки, то работать по таймауту также неправильно. Лично я ВСЕГДА использовал таймаут исключительно для определения: подключен прибор или нет.Не замерял я быстродействие вызова Bytes At Port, но сдаётся мне что этот вызов не приведёт к катастрофе временного исполнения программы в целом.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: VISA Bytes at Serial Port не выполняет своих функций
А если их нет в буфере? Посылка не кратна интервалу опроса, ага. Прочитаю с задержкой в N мс.Вызов функции VISA Read если в буфере есть данные - ничего не стоит.
Этот метод особо не отличается от вашего, типа true-шного методаВаш метод годится для мизерного количества ситуаций и тем более неприемлем для диалогового обмена.
Ответ: иногда это приводит к простою цикла вычитывания данных.Больше ничем не отличается.
Терминалы и тестовые программы по вашей логике тогда являются "хакерством", да? Ведь они(терминалы и тестовые программы) не руководствуются спецификацией, а просто сливают данные с порта и всё.Фундаментальная вещь в данном случае состоит в том, что принимающая сторона должна вычитывать посылку целиком, в соответствии со спецификацией.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 1 Ответы
- 247 Просмотры
-
Последнее сообщение Artem.spb
-
- 2 Ответы
- 657 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 240 Просмотры
-
Последнее сообщение Embedder74