Это понятно, что при вызове. Непонятно, в какой момент строка поступает, при выполнении каких условий.Если вы о парсинге строки, то он выполняется при вызове VISA Read.
Альтернатива VISA для работы с последовательным портом
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Куда поступает? Может, я не догоняю... ReadFile берёт строку из буфера драйвера порта (serial.sys на Windows), ниже уже просто ничего нет. А после этого строка лежит себе в оперативной памяти. С ней работают, как ни в чём ни бывало.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
Объясню на пальцах...
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Я выполнял VISA Read, когда строка уже целиком лежала в буфере драйвера Windows. Делал так: взял два компа, соединил нуль-модемным кабелем, на одном запустил терминал, на другом программу в . В терминале печатал строку, в нажимал кнопку чтения VISA Read.Borjomy_1 писал(а):Объясню на пальцах...
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
Ну это понятно. Когда все известно (в смысле, посылка уже есть), естественно, все просто выглядит. Самое интересное это реализация генерации события - и по принятому числу байт, по терминальному символу и таймауту. Сдается мне, что вычитка из буфера уже принятых данных (пусть даже с парсингом) и прием в реальном времени с контролем на размер буфера, терминальный символ и таймаут - это совершенно разные процедуры.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Ну, я думаю, делается так. Замеряется время перед чтением с помощью GetTickCount. Затем вызывается ReadFile в одном из двух режимов (синхронный/асинхронный). Замеряется время после вызова ReadFile или после вызова события. Анализируется разница времён относительно таймаута, в случае превышения пишется ошибка. Терминатор парсится в любом случае, раз это WinAPI. А размер буфера задаётся при инициализации порта (SetupComm).
Я проверял работу в синхронном режиме: В асинхронном будет вызываться viReadAsync, а не viRead. Документация на функции VISA лежит тут или тут, можете почитать. Если есть желание, ставьте бряк на функцию и смотрите, что там происходит. Мне пока не до этого...
Я проверял работу в синхронном режиме: В асинхронном будет вызываться viReadAsync, а не viRead. Документация на функции VISA лежит тут или тут, можете почитать. Если есть желание, ставьте бряк на функцию и смотрите, что там происходит. Мне пока не до этого...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Прошу прощения за археологию, но на какой версии вы используете эти ? Если на 7.1 и более поздних, то тогда это никакая не альтернатива Визе, так как все в \LabVIEW xxxx\vi.lib\Instr\serial.llb и в _sersup.llb содержат стандартные блоки VISA. Если речь о 6.1 и более ранних, то да, некоторый смысл есть, наверное. Сравните сами:Jakob Brontfeyn писал(а):Я с VISA никогда не работаю,
вот есть альтернативные VI
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
Хм.. Вы на дату сообщения смотрели? 4 года уже прошло. Может, технический прогресс его уже догнал.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Borjomy_1 писал(а):Вы на дату сообщения смотрели?
dadreamer писал(а):Прошу прощения за археологию
В профиле версия не указанаBorjomy_1 писал(а):Может, технический прогресс его уже догнал.
Ну, и это навело на мысли: http://labviewportal.org/viewtopic.php?p=65897#p65897
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
Мдя.. в таком случае, вы правы. С этим следует смириться....
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Нет, функция одна и та же. Просто чуть разное поведение в синхронном и асинхронном режимах. В обоих случаях используется связка SetCommTimeouts + ReadFile + GetOverlappedResult. В синхронном режиме она вызывается один раз, но в асинхронном выполняется каждую миллисекунду (!). Функция GetOverlappedResult как раз приостанавливает поток, в котором вызывается, на количество времени, указанное в структуре COMMTIMEOUTS. В асинхронном режиме тайм-аут устанавливается в 1 мс:Borjomy_1 писал(а):Сдается мне, что вычитка из буфера уже принятых данных (пусть даже с парсингом) и прием в реальном времени с контролем на размер буфера, терминальный символ и таймаут - это совершенно разные процедуры.
Код: Выделить всё
lpCommTimeouts:
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=1
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=500
Код: Выделить всё
lpCommTimeouts:
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=1000
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=500
Немного непонятно, почему не используется WaitForSingleObject, как в примерах, но видимо он не нужен, т.к. bWait = TRUE для GetOverlappedResult в обоих случаях. ReadFile и там, и там пытается считать 1 байт. Видимо, чтение всё-таки побайтовое. В общем, в словах Якова некоторый смысл есть:
Только вот выражение "тянет" получается неоднозначное[b][color=#003399]Jakob Brontfeyn[/color][/b] писал(а):как это делает элемент VISA внутри себя в каких циклах я не знаю или, наверное, при приходе каждого нового байта, он тянет при этом компьютерное время
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Проверил работу serpdrv на Линуксе (виртуалка Ubuntu 15.04 64-bit + 2010). Всё замечательно работает, данные по виртуальному каналу передаются между домашней и гостевой ОС. Файл serpdrv из архива нужно положить рядом с исполняемым файлом labview, у меня это каталог /usr/local/natinst/LabVIEW-2010/. В конфигах самого (/home/$USER/natinst/.config/LabVIEW-2010/labview.conf) ничего дополнительно прописывать не нужно. Единственный нюанс был с разрешениями юзера на доступ к порту. У меня по дефолту доступа не было, инструмент Serial Port Init.vi выдавал ошибку 37. Сначала я делал так:dadreamer писал(а):Если всё ещё актуально, как вариант, попробуйте этот serpdrv и из архива, у меня есть уверенность на 85%, что заработает, и всё-таки это лучше, чем городить огород из врапперов.
Код: Выделить всё
sudo chmod 777 /dev/ttyS0
Код: Выделить всё
sudo adduser $USER dialout
Есть и другие решения.
Обращаю внимание, что в папке /serpdrv/serpdrv_vis/ есть несколько инструментов с пометкой (Linux):
Open Serial Driver (Linux).vi
Serial Port Buffer Size (Linux).vi
Serial Port Reset (Linux).vi
Нужно оригинальные файлы заменить на эти (естественно, пометку убрать).
На классическом Маке serpdrv так же работает, проверял ранее.
-
IvanLis
- guru
- Сообщения: 5463
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Альтернатива VISA для работы с последовательным портом
Дошли руки и до этого.
Но результата не удалось получить положительного.
Система Ubuntu 16.04 LTS / LabVIEW 2010 - 32 bit
Нашел дома такую железяку 32-Channel Servo Controller Board (https://www.elechouse.com/elechouse/ind ... ts_id=1883)
Подключаем ее и ищем в системе:
Есть контакт, то что нужно ID 1208:0815.
Проверяем:
Получается, что устройство висит на /dev/ttyACM0
Хотя в Help к LabVIEW 6.1 из которой дергаем serpdrv (https://lost-contact.mit.edu/afs/rhic.b ... _Init.html) про эти порты не написано, попытался прогнать все порты до 100 (LabVIEW запускал на всякий случай из под root, но предварительно добавился еще и в группу dialout).
Результат плачевный, без Error 37 отработал только порт 0.
При попытке записать в него информацию, ничего не получается, настройки брал с ранее отработанного варианта в Windows, причем при передаче/приеме данных на железке моргает светодиод, у меня он тоже не моргал.
Так что пока "не вышел каменный цветок". Будет время покопаю еще.
Но результата не удалось получить положительного.
Система Ubuntu 16.04 LTS / LabVIEW 2010 - 32 bit
Нашел дома такую железяку 32-Channel Servo Controller Board (https://www.elechouse.com/elechouse/ind ... ts_id=1883)
Подключаем ее и ищем в системе:
Код: Выделить всё
ivan@Ivan-Net:~$ lsusb
Bus 002 Device 004: ID 046d:082b Logitech, Inc. Webcam C170
Bus 002 Device 006: ID 1208:0815
Bus 002 Device 003: ID 09da:9066 A4Tech Co., Ltd. F3 V-Track Gaming Mouse
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Проверяем:
Код: Выделить всё
ivan@Ivan-Net:~$ dmesg | tail
[ 909.389195] usbcore: registered new interface driver cdc_acm
[ 909.389199] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[ 957.426167] usb 2-1.3: USB disconnect, device number 5
[ 1294.005756] usb 2-1.3: new full-speed USB device number 6 using ehci-pci
[ 1294.100155] usb 2-1.3: New USB device found, idVendor=1208, idProduct=0815
[ 1294.100158] usb 2-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1294.100160] usb 2-1.3: Product: mini USB servo controller
[ 1294.100161] usb 2-1.3: Manufacturer: TOROBOT.com
[ 1294.100162] usb 2-1.3: SerialNumber: 8D8522585549
[ 1294.100566] cdc_acm 2-1.3:1.0: ttyACM0: USB ACM device
Хотя в Help к LabVIEW 6.1 из которой дергаем serpdrv (https://lost-contact.mit.edu/afs/rhic.b ... _Init.html) про эти порты не написано, попытался прогнать все порты до 100 (LabVIEW запускал на всякий случай из под root, но предварительно добавился еще и в группу dialout).
Результат плачевный, без Error 37 отработал только порт 0.
При попытке записать в него информацию, ничего не получается, настройки брал с ранее отработанного варианта в Windows, причем при передаче/приеме данных на железке моргает светодиод, у меня он тоже не моргал.
Так что пока "не вышел каменный цветок". Будет время покопаю еще.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
По дефолту serpdrv заточен на работу с устройствами ttySN, где N - номер порта, начиная с 0. Возможно, что в конфиге нужно прописать другое наименование порта перед тем, как работать с ним. На Винде перечисление портов выглядит так: http://digital.ni.com/public.nsf/allkb/ ... 33005AC9A5IvanLis писал(а):Получается, что устройство висит на /dev/ttyACM0
Полагаю, на Линуксе должно быть как-то так:
Код: Выделить всё
labview.serialDevices:/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2
http://forums.ni.com/t5/Instrument-Cont ... d-p/102618
The Linux Serial HOWTO: What Are The Names Of The Serial Ports?
Последний раз редактировалось dadreamer 06 ноя 2016, 21:28, всего редактировалось 1 раз.
-
IvanLis
- guru
- Сообщения: 5463
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Альтернатива VISA для работы с последовательным портом
dadreamer писал(а):По дефолту serpdrv заточен на работу с устройствами ttySN, где N - номер порта, начиная с 0. Возможно, что в конфиге нужно прописать другое наименование порта перед тем, как работать с ним.
Это врятли, конфиг я так понимаю необходим для сопоставления реального порта и его названия в VISA.dadreamer писал(а):В конфигах самого (/home/$USER/natinst/.config/LabVIEW-2010/labview.conf) ничего дополнительно прописывать не нужно.
У меня например в конфиге вообще о портах информации нет.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 7 Ответы
- 297 Просмотры
-
Последнее сообщение dadreamer
-
- 2 Ответы
- 657 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 240 Просмотры
-
Последнее сообщение Embedder74