Управление свойством Visa: Termination character enable
-
- beginner
- Сообщения: 24
- Зарегистрирован: 08 июн 2012, 20:49
- Версия LabVIEW: LabVIEW2010
- Контактная информация:
Управление свойством Visa: Termination character enable
Здравствуйте любители и профессионалы У меня возникла проблема при взаимодействии прибора с : Дело в том, что в протоколе прибора предусмотрены команды в ASC II коде и каждая команда заканчивается символом LF.
Используя это свойство команд, я организовал инициализацию СОМ порта, как указано на приложеной картинке: Termination character enable.
И в принципе все отлично работает в плане организации Write Visa / Read Visa.
Но есть у меня в протоколе одна команда, когда нужно считать содержимое ячеек памяти RАМ FPGA системы управления прибора.
И это содержимое передается огромным массивом в HEX коде в
Поэтому, чтобы принять весь массив этих данных с помощью Read Visa я должен отключить Termination character уже открытого СОМ порта на время выполнения этой команды.
Вроде все решается просто: Перед принятием HEX кода я ставлю свойство, как указано на приложеной картинке Disable и выключаю свойство Enable termination char открытого СОМ порта, а после принятия Hex кода опять включаю это свойство для последующих обработок команд. Но не хочет так работать: Как только приходит первый попавшийся HEX "A", Write Visa воспринемает его за "LF" и прекращает дальнейшее чтение данных с CОМ порта, словно не произошло Disable Termination Char...???
Может кто-нибудь объяснить: Почему это так происходит и как можно решить данную проблему не прибегая к переинициализации СОМ порта?
Используя это свойство команд, я организовал инициализацию СОМ порта, как указано на приложеной картинке: Termination character enable.
И в принципе все отлично работает в плане организации Write Visa / Read Visa.
Но есть у меня в протоколе одна команда, когда нужно считать содержимое ячеек памяти RАМ FPGA системы управления прибора.
И это содержимое передается огромным массивом в HEX коде в
Поэтому, чтобы принять весь массив этих данных с помощью Read Visa я должен отключить Termination character уже открытого СОМ порта на время выполнения этой команды.
Вроде все решается просто: Перед принятием HEX кода я ставлю свойство, как указано на приложеной картинке Disable и выключаю свойство Enable termination char открытого СОМ порта, а после принятия Hex кода опять включаю это свойство для последующих обработок команд. Но не хочет так работать: Как только приходит первый попавшийся HEX "A", Write Visa воспринемает его за "LF" и прекращает дальнейшее чтение данных с CОМ порта, словно не произошло Disable Termination Char...???
Может кто-нибудь объяснить: Почему это так происходит и как можно решить данную проблему не прибегая к переинициализации СОМ порта?
- Вложения
-
[Расширение tif было запрещено, вложение больше недоступно.]
-
[Расширение tif было запрещено, вложение больше недоступно.]
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
Можете попробовать вместо 0xA (\n) (конец строки) использовать 0xD (\r) (перевод каретки) или какой-то другой символ. Ну, или вообще без терминатора работайте, принимайте столько байт, сколько есть в порту.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 08 июн 2012, 20:49
- Версия LabVIEW: LabVIEW2010
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
Понимаете, xD, xA при приеме массива НЕХ могут встретиться в любой комбинации и сколько угодно раз...., а почему я выбрал имено такой прием, объясняю: раньше у меня был выбран метод: Write Visa, задержка по времени, Read Visa без терминатора... Вроде все времена отстрою, но программер, который пишет софтину в FPGA время от времени модифицирует код по разным причинам и периодически "уходят" времена, а у меня срабатывает time out.... А хотелась, чтобы мое приложение работало всегда, поэтому я ушел на терминатор.....
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
То есть, в массиве может встретиться абсолютно любой символ из ASCII-таблицы? А размер этого массива известен? Может, сразу считать из порта его целиком, задав количество байт на приём? Мне все-таки кажется, что можно было бы обойтись и без терминатора, просто в цикле While с маленькой частотой (~50 ... 100 мс) проверять через Bytes At Port количество данных в порту, и если они есть, то сразу считывать всё количество (как в этом примере).
-
- beginner
- Сообщения: 24
- Зарегистрирован: 08 июн 2012, 20:49
- Версия LabVIEW: LabVIEW2010
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
А в каком примере?
Я как-то экспериментировал с нечто подобным, у меня не получалось... Потому что конкретно по этой команде я знаю точное количество байт, которое должно придти, а вот все другие команды имеют плавающее количество байт, в зависимости от конфигурации прибора, но за то они все в ASCII, и все заканчиваются "LF"
Я как-то экспериментировал с нечто подобным, у меня не получалось... Потому что конкретно по этой команде я знаю точное количество байт, которое должно придти, а вот все другие команды имеют плавающее количество байт, в зависимости от конфигурации прибора, но за то они все в ASCII, и все заканчиваются "LF"
-
- doctor
- Сообщения: 2210
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 26 раз
Re: Управление свойством Visa: Termination character enable
Имеет смысл сделать отдельный поток, который читает либо побайтно (до символа возврата каретки), либо определенное число байт. Управляется внешней переменной (там, где вы в программе включаете/отключаете терминальный символ) и складывает результат в очередь. В том месте, где вы вычитываете данные из порта, поставить чтение из очереди, там и таймаут будет полезен.
Завтра с утра, если будет время, скину пример
Завтра с утра, если будет время, скину пример
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
При прохождении по ссылке сообщение, содержащее пример, должно отображаться самым первым. Ну, и собственно сам пример:sun170178 писал(а):А в каком примере?
Прибор при выполнении команды передачи в COM-порт отправляет сразу же определенное количество байт. Если Bytes At Port больше нуля, то сразу читаем все пришедшие данные через VISA Read. Можно и вообще читать непрерывно, складируя данные в какое-нибудь хранилище (очередь, строка, массив). Потом при обработке данных вырезать полезную информацию по наличию 0xA, 0xD.все другие команды имеют плавающее количество байт, в зависимости от конфигурации прибора, но за то они все в ASCII, и все заканчиваются "LF"
Последний раз редактировалось dadreamer 01 мар 2017, 08:11, всего редактировалось 1 раз.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 08 июн 2012, 20:49
- Версия LabVIEW: LabVIEW2010
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
Спасибо!
Идея хорошая, надо ее будет переварить!
Идея хорошая, надо ее будет переварить!
-
- beginner
- Сообщения: 24
- Зарегистрирован: 08 июн 2012, 20:49
- Версия LabVIEW: LabVIEW2010
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
Алгоритмы хорошие и они работают, но вот почему не возможно менять при открытом СОМ порте своиство: Termination character enable???
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
Здесь есть ответ на ваш вопрос: http://digital.ni.com/public.nsf/allkb/ ... 54007F26DE и http://digital.ni.com/public.nsf/allkb/ ... 75006DB10Asun170178 писал(а):Алгоритмы хорошие и они работают, но вот почему не возможно менять при открытом СОМ порте своиство: Termination character enable???
Установите свойство "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.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 08 июн 2012, 20:49
- Версия LabVIEW: LabVIEW2010
- Контактная информация:
Re: Управление свойством Visa: Termination character enable
dadreamer, попадание в точку!!! Проверил, все идеально работает, время отклика прибора - самое минимальное!
Получился очень даже красивый и простой алгоритм передачи/приема без всяких циклов.... и устойчивый к изменениям временным интервалам "запрос/ответ"
Получился очень даже красивый и простой алгоритм передачи/приема без всяких циклов.... и устойчивый к изменениям временным интервалам "запрос/ответ"
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 2 Ответы
- 637 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 187 Просмотры
-
Последнее сообщение Embedder74