Управление свойством Visa: Termination character enable

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Управление свойством Visa: Termination character enable

Сообщение sun170178 »

Здравствуйте любители и профессионалы :labview: У меня возникла проблема при взаимодействии прибора с :labview: :vi: : Дело в том, что в протоколе прибора предусмотрены команды в ASC II коде и каждая команда заканчивается символом LF.
Используя это свойство команд, я организовал инициализацию СОМ порта, как указано на приложеной картинке: Termination character enable.
И в принципе все отлично работает в плане организации Write Visa / Read Visa.
Но есть у меня в протоколе одна команда, когда нужно считать содержимое ячеек памяти RАМ FPGA системы управления прибора.
И это содержимое передается огромным массивом в HEX коде в :labview: :vi:
Поэтому, чтобы принять весь массив этих данных с помощью Read Visa я должен отключить Termination character уже открытого СОМ порта на время выполнения этой команды.
Вроде все решается просто: Перед принятием HEX кода я ставлю свойство, как указано на приложеной картинке Disable и выключаю свойство Enable termination char открытого СОМ порта, а после принятия Hex кода опять включаю это свойство для последующих обработок команд. Но :labview: :vi: не хочет так работать: Как только приходит первый попавшийся HEX "A", Write Visa воспринемает его за "LF" и прекращает дальнейшее чтение данных с CОМ порта, словно не произошло Disable Termination Char...???
Может кто-нибудь объяснить: Почему это так происходит и как можно решить данную проблему не прибегая к переинициализации СОМ порта?
Вложения

[Расширение tif было запрещено, вложение больше недоступно.]

[Расширение tif было запрещено, вложение больше недоступно.]

Аватара пользователя
dadreamer

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

Re: Управление свойством Visa: Termination character enable

Сообщение dadreamer »

Можете попробовать вместо 0xA (\n) (конец строки) использовать 0xD (\r) (перевод каретки) или какой-то другой символ. Ну, или вообще без терминатора работайте, принимайте столько байт, сколько есть в порту.
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Re: Управление свойством Visa: Termination character enable

Сообщение sun170178 »

Понимаете, xD, xA при приеме массива НЕХ могут встретиться в любой комбинации и сколько угодно раз...., а почему я выбрал имено такой прием, объясняю: раньше у меня был выбран метод: Write Visa, задержка по времени, Read Visa без терминатора... Вроде все времена отстрою, но программер, который пишет софтину в FPGA время от времени модифицирует код по разным причинам и периодически "уходят" времена, а у меня срабатывает time out.... А хотелась, чтобы мое приложение работало всегда, поэтому я ушел на терминатор.....
Аватара пользователя
dadreamer

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

Re: Управление свойством Visa: Termination character enable

Сообщение dadreamer »

То есть, в массиве может встретиться абсолютно любой символ из ASCII-таблицы? А размер этого массива известен? Может, сразу считать из порта его целиком, задав количество байт на приём? Мне все-таки кажется, что можно было бы обойтись и без терминатора, просто в цикле While с маленькой частотой (~50 ... 100 мс) проверять через :vi: Bytes At Port количество данных в порту, и если они есть, то сразу считывать всё количество (как в этом примере).
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Re: Управление свойством Visa: Termination character enable

Сообщение sun170178 »

А в каком примере?
Я как-то экспериментировал с нечто подобным, у меня не получалось... Потому что конкретно по этой команде я знаю точное количество байт, которое должно придти, а вот все другие команды имеют плавающее количество байт, в зависимости от конфигурации прибора, но за то они все в ASCII, и все заканчиваются "LF"
Borjomy_1

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

Re: Управление свойством Visa: Termination character enable

Сообщение Borjomy_1 »

Имеет смысл сделать отдельный поток, который читает либо побайтно (до символа возврата каретки), либо определенное число байт. Управляется внешней переменной (там, где вы в программе включаете/отключаете терминальный символ) и складывает результат в очередь. В том месте, где вы вычитываете данные из порта, поставить чтение из очереди, там и таймаут будет полезен.
Завтра с утра, если будет время, скину пример
Аватара пользователя
dadreamer

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

Re: Управление свойством Visa: Termination character enable

Сообщение dadreamer »

sun170178 писал(а):А в каком примере?
При прохождении по ссылке сообщение, содержащее пример, должно отображаться самым первым.
LabVIEW Portal • Просмотр темы - МастерФлоу Расходомер RS 232 через VISA.png
Ну, и собственно сам пример:
Изображение
все другие команды имеют плавающее количество байт, в зависимости от конфигурации прибора, но за то они все в ASCII, и все заканчиваются "LF"
Прибор при выполнении команды передачи в COM-порт отправляет сразу же определенное количество байт. Если Bytes At Port больше нуля, то сразу читаем все пришедшие данные через VISA Read. Можно и вообще читать непрерывно, складируя данные в какое-нибудь хранилище (очередь, строка, массив). Потом при обработке данных вырезать полезную информацию по наличию 0xA, 0xD.
Последний раз редактировалось dadreamer 01 мар 2017, 08:11, всего редактировалось 1 раз.
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Re: Управление свойством Visa: Termination character enable

Сообщение sun170178 »

Спасибо!
Идея хорошая, надо ее будет переварить!
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Re: Управление свойством Visa: Termination character enable

Сообщение sun170178 »

Алгоритмы хорошие и они работают, но вот почему не возможно менять при открытом СОМ порте своиство: Termination character enable???
Аватара пользователя
dadreamer

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

Re: Управление свойством Visa: Termination character enable

Сообщение dadreamer »

sun170178 писал(а):Алгоритмы хорошие и они работают, но вот почему не возможно менять при открытом СОМ порте своиство: Termination character enable???
Здесь есть ответ на ваш вопрос: http://digital.ni.com/public.nsf/allkb/ ... 54007F26DE и http://digital.ni.com/public.nsf/allkb/ ... 75006DB10A
Установите свойство "End Mode For Reads" ("ASRL End In") в ноль.
Serial Settings: End Mode for Reads
Short name: ASRL End In
Requires: Base Package
Classes: Instr, Serial Instr

Specifies the method used to terminate read operations. Valid values include: (0) None, (1) Last Bit, (2) TermChar. If the value is (2) TermChar, then the value of the property Termination Character Enable (TermChar En) is ignored. The default is (2) TermChar.

Descriptions
(0) None — The read does not terminate until all of the requested data is received (or an error occurs).

(1) Last Bit — The read terminates as soon as a character arrives with its last bit set.

(2) TermChar — The read terminates as soon as the character specified as Termination Character is received.
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Re: Управление свойством Visa: Termination character enable

Сообщение sun170178 »

dadreamer, попадание в точку!!! Проверил, все идеально работает, время отклика прибора - самое минимальное!
Получился очень даже красивый и простой алгоритм передачи/приема без всяких циклов.... и устойчивый к изменениям временным интервалам "запрос/ответ"
sun170178
beginner
beginner
Сообщения: 24
Зарегистрирован: 08 июн 2012, 20:49
Версия LabVIEW: LabVIEW2010
Контактная информация:

Re: Управление свойством Visa: Termination character enable

Сообщение sun170178 »

СПАСИБО за помощь!
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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