Альтернатива VISA для работы с последовательным портом

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы

Re: Альтернатива VISA для работы с последовательным портом

Postby Borjomy_1 on 16 Sep 2015, 13:21

Если вы о парсинге строки, то он выполняется при вызове VISA Read.

Это понятно, что при вызове. Непонятно, в какой момент строка поступает, при выполнении каких условий.
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 16 Sep 2015, 13:36

Куда поступает? Может, я не догоняю... ReadFile берёт строку из буфера драйвера порта (serial.sys на Windows), ниже уже просто ничего нет. А после этого строка лежит себе в оперативной памяти. С ней работают, как ни в чём ни бывало.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby Borjomy_1 on 16 Sep 2015, 13:47

Объясню на пальцах...
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 16 Sep 2015, 13:51

Borjomy_1 wrote:Объясню на пальцах...
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?

Я выполнял VISA Read, когда строка уже целиком лежала в буфере драйвера Windows. Делал так: взял два компа, соединил нуль-модемным кабелем, на одном запустил терминал, на другом программу в :labview: . В терминале печатал строку, в :labview: нажимал кнопку чтения VISA Read.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby Borjomy_1 on 16 Sep 2015, 13:56

Ну это понятно. Когда все известно (в смысле, посылка уже есть), естественно, все просто выглядит. Самое интересное это реализация генерации события - и по принятому числу байт, по терминальному символу и таймауту. Сдается мне, что вычитка из буфера уже принятых данных (пусть даже с парсингом) и прием в реальном времени с контролем на размер буфера, терминальный символ и таймаут - это совершенно разные процедуры.
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 16 Sep 2015, 14:26

Ну, я думаю, делается так. Замеряется время перед чтением с помощью GetTickCount. Затем вызывается ReadFile в одном из двух режимов (синхронный/асинхронный). Замеряется время после вызова ReadFile или после вызова события. Анализируется разница времён относительно таймаута, в случае превышения пишется ошибка. Терминатор парсится в любом случае, раз это WinAPI. А размер буфера задаётся при инициализации порта (SetupComm).
Я проверял работу в синхронном режиме:
2015-09-16_16-23-14.jpg
2015-09-16_16-23-14.jpg (64.64 KiB) Viewed 11102 times

В асинхронном будет вызываться viReadAsync, а не viRead. Документация на функции VISA лежит тут или тут, можете почитать. Если есть желание, ставьте бряк на функцию и смотрите, что там происходит. Мне пока не до этого...
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 17 Sep 2015, 10:43

Jakob Brontfeyn wrote:Я с VISA никогда не работаю,
вот есть альтернативные VI

Прошу прощения за археологию, но на какой версии :labview: вы используете эти :vi: ? Если на 7.1 и более поздних, то тогда это никакая не альтернатива Визе, так как все :vi: в \LabVIEW xxxx\vi.lib\Instr\serial.llb и в _sersup.llb содержат стандартные блоки VISA. Если речь о 6.1 и более ранних, то да, некоторый смысл есть, наверное. Сравните сами:
Attachments
2015-09-17_12-35-44.jpg
Open Serial Driver.vi (LV ≥ 7.1)
2015-09-17_12-37-27.jpg
Open Serial Driver.vi (LV ≤ 6.1)
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby Borjomy_1 on 17 Sep 2015, 11:25

Хм.. Вы на дату сообщения смотрели? 4 года уже прошло. Может, технический прогресс его уже догнал.
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 17 Sep 2015, 11:30

Borjomy_1 wrote:Вы на дату сообщения смотрели?

dadreamer wrote:Прошу прощения за археологию

Borjomy_1 wrote:Может, технический прогресс его уже догнал.

В профиле версия :labview: не указана :dntknw:
Ну, и это навело на мысли: viewtopic.php?p=65897#p65897
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby Borjomy_1 on 17 Sep 2015, 11:42

Мдя.. в таком случае, вы правы. С этим следует смириться....
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 18 Sep 2015, 21:34

Borjomy_1 wrote:Сдается мне, что вычитка из буфера уже принятых данных (пусть даже с парсингом) и прием в реальном времени с контролем на размер буфера, терминальный символ и таймаут - это совершенно разные процедуры.

Нет, функция одна и та же. Просто чуть разное поведение в синхронном и асинхронном режимах. В обоих случаях используется связка SetCommTimeouts + ReadFile + GetOverlappedResult. В синхронном режиме она вызывается один раз, но в асинхронном выполняется каждую миллисекунду (!). Функция GetOverlappedResult как раз приостанавливает поток, в котором вызывается, на количество времени, указанное в структуре COMMTIMEOUTS. В асинхронном режиме тайм-аут устанавливается в 1 мс:
Code: Select all
lpCommTimeouts:
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=1
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=500

В синхронном режиме тайм-аут соответствует тому, что указан в настройках VISA Configure Serial Port:
Code: Select all
lpCommTimeouts:
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=1000
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=500

В данном случае я брал 1 секунду.
Немного непонятно, почему не используется WaitForSingleObject, как в примерах, но видимо он не нужен, т.к. bWait = TRUE для GetOverlappedResult в обоих случаях. ReadFile и там, и там пытается считать 1 байт. Видимо, чтение всё-таки побайтовое. В общем, в словах Якова некоторый смысл есть:
Jakob Brontfeyn wrote:как это делает элемент VISA внутри себя в каких циклах я не знаю или, наверное, при приходе каждого нового байта, он тянет при этом компьютерное время

Только вот выражение "тянет" получается неоднозначное :D
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 08 Jul 2016, 15:14

dadreamer wrote:Если всё ещё актуально, как вариант, попробуйте этот serpdrv и :vi: из архива, у меня есть уверенность на 85%, что заработает, и всё-таки это лучше, чем городить огород из врапперов.

Проверил работу serpdrv на Линуксе (виртуалка Ubuntu 15.04 64-bit + :labview: 2010). Всё замечательно работает, данные по виртуальному каналу передаются между домашней и гостевой ОС. Файл serpdrv из архива нужно положить рядом с исполняемым файлом labview, у меня это каталог /usr/local/natinst/LabVIEW-2010/. В конфигах самого :labview: (/home/$USER/natinst/.config/LabVIEW-2010/labview.conf) ничего дополнительно прописывать не нужно. Единственный нюанс был с разрешениями юзера на доступ к порту. У меня по дефолту доступа не было, инструмент Serial Port Init.vi выдавал ошибку 37. Сначала я делал так:
Code: Select all
sudo chmod 777 /dev/ttyS0

Однако после перезагрузки ВМ права слетали. Нашёл решение получше - добавить пользователя в группу dialout:
Code: Select all
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 так же работает, проверял ранее.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby IvanLis on 06 Nov 2016, 20:58

Дошли руки и до этого.
Но результата не удалось получить положительного.
Система Ubuntu 16.04 LTS / LabVIEW 2010 - 32 bit

Нашел дома такую железяку 32-Channel Servo Controller Board (https://www.elechouse.com/elechouse/ind ... ts_id=1883)
Подключаем ее и ищем в системе:
Code: Select all
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

Есть контакт, то что нужно ID 1208:0815.
Проверяем:
Code: Select all
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

Получается, что устройство висит на /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, причем при передаче/приеме данных на железке моргает светодиод, у меня он тоже не моргал.
Так что пока "не вышел каменный цветок". Будет время покопаю еще.
User avatar
IvanLis
professor
professor
 
Posts: 4636
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 728
hardware VIP bloggers teachers

Re: Альтернатива VISA для работы с последовательным портом

Postby dadreamer on 06 Nov 2016, 21:22

IvanLis wrote:Получается, что устройство висит на /dev/ttyACM0

По дефолту serpdrv заточен на работу с устройствами ttySN, где N - номер порта, начиная с 0. Возможно, что в конфиге :labview: нужно прописать другое наименование порта перед тем, как работать с ним. На Винде перечисление портов выглядит так: http://digital.ni.com/public.nsf/allkb/ ... 33005AC9A5
Полагаю, на Линуксе должно быть как-то так:
Code: Select all
labview.serialDevices:/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2

Если не поможет, то есть вариант сделать свой ttySN-файл, правда, я не разбирался, как именно это делается.
http://forums.ni.com/t5/Instrument-Cont ... d-p/102618
The Linux Serial HOWTO: What Are The Names Of The Serial Ports?
Last edited by dadreamer on 06 Nov 2016, 21:28, edited 1 time in total.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

Re: Альтернатива VISA для работы с последовательным портом

Postby IvanLis on 06 Nov 2016, 21:28

dadreamer wrote:По дефолту serpdrv заточен на работу с устройствами ttySN, где N - номер порта, начиная с 0. Возможно, что в конфиге :labview: нужно прописать другое наименование порта перед тем, как работать с ним.

:dntknw:
dadreamer wrote:В конфигах самого :labview: (/home/$USER/natinst/.config/LabVIEW-2010/labview.conf) ничего дополнительно прописывать не нужно.


Это врятли, конфиг я так понимаю необходим для сопоставления реального порта и его названия в VISA.
У меня например в конфиге вообще о портах информации нет.
User avatar
IvanLis
professor
professor
 
Posts: 4636
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 728
hardware VIP bloggers teachers

PreviousNext

Return to Коммуникация с приборами

Who is online

Users browsing this forum: No registered users and 3 guests

cron