КТвП    

  Задание на практику ~ 
  Доступ к осциллографу ~ 
  Проверка доступа ~ 
  Язык SCPI ~ 
  Справка по gnuplot ~ 
  Справка по GD ~ 
  Справка по Xlib ~ 
  Справка по SDL ~ 
/Студентам/КТвП/Доступ к осциллографу

При выполнении работы доступ к осциллографу осуществляется удаленно (через сеть), а при демонстрации результатов - локально (через специальный файл /dev/ttySx). Далее описано, какими способами можно организовать локальный и удаленный доступ.

Удалённый доступ

Осциллограф подключен к одной из машин, IP-адрес которой (а также TCP-порт) сообщает преподаватель.

Для осуществления удалённого доступа предлагается на выбор (по желанию студента) 3 способа:

Первый способ подразумевает установление соединения с узлом, к которому подключен осциллограф, непосредственно в программе (на основе BSD sockets API)

Второй и третий способ основаны на возможностях существующих программ-редиректоров. Программы-редиректоры (bidilink, socat и подобные им) предназначены для связывания двух потоков данных. Источниками данных могут служить сокеты, последовательные порты, псевдотерминалы и др. При этом все данные, поступающие из одного источника, перенаправляются во второй и наоборот.

При таком подходе нужно сначала запустить с нужными параметрами программу-редиректор, а потом - программу, "общающуюся" с осциллографом. Соответствующие примеры приведены ниже.

Далее описываются все 3 способа удаленного доступа к осциллографу

Доступ без программ-редиректоров

Ниже приведен пример программы, которая устанавливает соединение с заданным узлом, отсылает осциллографу команду "*idn?" и принимает от него ответ:

Более современный вариант, умеет работать и по IPv4, и по IPv6:

Использование bidilink

На рабочих местах bidilink следует запускать следующим образом:


bidilink pty:symlink tcp-client:host:port

Здесь symlink - это произвольное имя символической ссылки на один из специальных файлов, соответствующих псевдотерминалам, а host - доменное имя (или IP-адрес) машины, к которой подключен осциллограф. Если ссылка с именем, указанным параметром symlink, уже существует, то bidilink откажется запускаться. В этом случае нужно стереть эту ссылку и повторить попытку запуска bidilink.

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

Замечание: поскольку bidilink "не умеет" задавать режимы работы псевдотерминала, а драйвер последнего по умолчанию работает в режиме "эхо-вывода", то без принятия некоторых мер bidilink будет отправлять ответы от осциллографа обратно ему же, чего, разумеется, не должно происходить. Кроме того, драйвер псевдотерминала может воспринять некоторые байты входного потока как управляющие символы, что может привести к потере данных в осциллограмме.

Чтобы этого не происходило, нужно настроить драйвер псевдотерминала на работу в прозрачном режиме (raw mode) непосредственно из программы.

Ниже приведен исходный текст программы, которая "соединяется" с узлом, к которому подключен осциллограф, посылает ему команду "*idn?" и принимает ответ. После открытия псевдотерминала (через ссылку) программа настраивает его на работу в прозрачном режиме при помощи пары функций tcgetattr()/tcsetattr().

Замечание: в приведённом примере предполагается, что ссылка на псевдотерминал имеет имя "osc". Разумеется, можно задать любое другое имя, допустимое в рамках используемой файловой системы.

Использование socat

Принципиально использование редиректора socat ничем не отличается от использования редиректора bidilink, разница лишь в синтаксисе параметров:


socat tcp:host:port pty,link=symlink

Еще одно отличие этого редиректора от bidilink состоит в том, что при завершении программы последний также завершает свою работу, а socat - нет (то есть можно опять запускать свою программу).


Примечание для любопытных:

На машине, к которой подключен осциллограф, используется редиректор bidilink, запускаемый следующим образом:

bidilink tty:/dev/ttyS0 tcp-server:port

Это означает, что связаны два потока данных - один из последовательного порта (к которому и подключен осциллограф) и второй из сокета. Данные от программы-клиента, подключившейся к указанному TCP-порту, будут поступать в последовательный порт и далее в осциллограф. И, соответственно, наоборот, данные от осциллографа в конечном итоге уйдут к программе-клиенту.

При этом запуск bidilink на узле, к которому подключен осциллограф, осуществляется "автоматически" процессом init. Для этого нужно в файл /etc/inittab добавить следующую строчку:

	S0:2345:respawn:/etc/gds.sh

Здесь S0 - это последовательный RS232-интерфейс, к которому подключен осциллограф, а gds.sh - скрипт вот с таким содержимым:


#!/bin/bash

#  clocal  : disable modem control signals
# -cstopb  : один стоповый бит
# -parenb  : без бита четности
#  sc8     : размер символа 8 бит
# -crtscts : без запросов-подтверждений приема-передачи

# то есть в итоге имеем '9600 8N1'

/bin/stty -F /dev/ttyS0 9600 clocal -crtscts cs8 -cstopb -parenb
/usr/local/bin/bidilink tty:/dev/ttyS0 tcp-server:9999

Этот скрипт устанавливает параметры передачи данных для соответствующего последовательного интерфейса при помощи программы stty и затем запускает bidilink. Параметры передачи должны совпадать с таковыми у осциллографа; у последнего их можно задать, нажав на панели управления кнопку "Утилиты" и затем "F2".

После правок конфигурационного файла /etc/inittab нужно сообщить процессу init, что его конфигурационный файл изменился, что достигается посылкой ему сигнала SIGHUP:

	kill -1 1

Локальный доступ

Демонстрация результатов практикума производится непосредственно на машине, к одному из последовательных портов которой подключен осциллограф.

При этом учтите следующее:

Далее приведён пример программы, работающей с осциллографом "напрямую". Обратите внимание, что программа сама задаёт параметры передачи для интерфейса RS-232:

Не забываем, что параметры приёма-передачи, задаваемые программой, должны совпадать с таковыми на стороне осциллографа.

Опустошение буферов данных

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

Для предотвращения этого перед началом работы нужно опустошить обозначенные буферы (то есть вычитать все данные от осциллографа, оставшиеся в них от предыдущих сеансов работы). Один из возможных "рецептов" опустошения описан в следующем абзаце.

Перед началом работы нужно перевести дескриптор в неблокирующий режим. Это нужно для того, чтобы в случае, если никаких данных нигде не осталось, программа не ушла бы в состояние ожидания навсегда. После этого нужно побайтно считывать данные до тех пор, пока вызов read() не вернет -1 (при этом переменая errno должна содержать EAGAIN). Это и будет означать, что данных больше нет. Наконец, нужно перевести дескриптор обратно в блокирующий режим. Ниже приведен фрагмент исходного кода, демонстрирующий, как это делается.

Успехов в выполнении задания! )

Дата последней модификации: 2013-12-05


/Студентам/КТвП/Доступ к осциллографу

Содержимое данного сайта может быть использовано кем угодно, когда угодно, как угодно и для каких угодно целей. Автор сайта не несёт абсолютно никакой ответственности за землетрясения, наводнения, финансовые кризисы, глобальные потепления/похолодания, разбитые тарелки, зуд/онемение в левой/правой пятке читателя, эпидемии/пандемии свинячьего/птичьего/тараканьего и иных гриппов, а также за прочие негативные, равно как и позитивные, последствия, вызванные прямым или косвенным использованием материалов данного сайта кем бы то ни было, включая самого автора. При копировании/цитировании материалов данного сайта любым технически возможным в настоящее время способом, а также способом, могущим стать возможным в будущем, указание (либо неуказание) ссылки на первоисточник лежит, блин, тяжким грузом на совести копирующего/цитирующего.

Valid HTML 4.0 Strict Valid CSS!