Интернет-журнал "Домашняя лаборатория", 2007 №5
Шрифт:
Сброс системы SOROS в исходное состояние осуществляется кнопкой Init на контроллере крейта CRATE. Кнопка Printer, там же, позволяет запустить минисервер для принтера. На окне этого сервера можно выбрать нужный принтер, подключится к нему, и выбрать имя для сервера. Подразумевается, что будет использован сетевой принтер, поскольку параллельный порт (порты) необходимы для подключения контрольно-измерительных устройств. Переключатель Strob запускает режим циклического чтения (когда не 0 и кликнута кнопка Read). Чем больше значение на переключателе, тем реже производится чтение (делитель частоты стробового импульса).
При
К мини-серверам пакета SOROS может подключаться и интерпретатор QSL. Для взаимодействия с серверами используется «клиент-сервер» модель и DDE. QSL всегда является клиентом с именем «QSL». Сервер может быть открыт как файл, командой open. Имена внешних программ (драйверов) должны предваряться символом #. Сами имена мини-серверов уже заложены внутри их программ, но входящий в них номер порта/карты выбирается при запуске с панели системы SOROS. К некоторым устройствам, таким как аудио и видео периферия, командные последовательности могут быть посланы через MCI (смотрите документацию на QSL и MCI). К настоящему моменту в пакет входит всего 4 сервера: принтер, параллельный порт, последовательный порт и звуковая карта, но каждый желающий может изменить их или добавить другие. Все источники предоставляются.
Далее следуют примеры программирования скриптов для работы с минисерверами.
Урок 4. И снова принтер
# Lesson 4
open (PRN, ">#printer) || die "";
print PRN "Nice weather today, isn't it?\n";
close PRN;
Надо полагать, что в этом примере все уже знакомо. Следует учесть только, что до его выполнения соответствующий сервер должен быть запущен и настроен. Тоже самое относится и к последующим примерам.
Урок 5. Параллельный порт
В действительности QSL не имеет каких-либо специальных команд для контроля драйверов. Одним из возможных решений этой проблемы может являться использование управляющих символов в выводимых данных и использование отрицательного размера буфера для ввода в стандартных командах ввода-вывода QSL.
# Lesson 5
open(LPT, "+#LPT1") || die "";
$reg = " ";
read(LPT, $reg, — 2); # read status and control registers
($sr, $cr) = unpack("CC", $reg);
printf "%x\n%x", $sr, $cr;
$cr |= 0x20; # bi-direct
$reg = pack("CC", 0x01, $cr); # SOH + control byte
print LPT $reg;
print LPT "Hello, world!\r";
sleep 3000;
close LPT;
warn " ";
Обратите внимание, что в команде чтения read размер буфера дан отрицательным, это является просьбой к серверу вернуть значения контрольного регистра и регистра чтения (два байта). Естественно, что сервер понимает это (смотрите программу этого сервера). Поскольку с сервера будет получена текстовая строка, переменная $reg была сделана
Для передачи значения регистров упаковываются в текстовую строку, команда unpack распаковывает ее ($reg) на два байта без знака (код С) и помещает, в соответствующие названиям регистров, переменные. Последующий printf, просто для наглядности, выводит значения этих регистров на консоль, в шестнадцатеричном формате. Далее, после нужного изменения содержимого регистров, они снова упаковываются в текстовую строку командой pack и отсылаются на сервер командой print. Параллельный порт готов к работе, если там имеется принтер, то можно отпечатать что-нибудь, но на самом деле этот порт необходим для управления контрольно-измерительными устройствами, подключаемыми через него, а принтер можно использовать и сетевой.
Знак + в начале имени файла означает, что файл нужен для чтения и записи. Операция |= (битовое «или»), просто сокращенная форма конструкции $сг = $сг | 0x20.
Урок 6. Последовательный порт
Последовательный порт (RS-232) тоже может быть использован для управления некоторыми устройствами, тем более что некоторые современные измерительные приборы имеют встроенный интерфейс для него. В нижеследующем примере использован другой подход к проблеме доступа к регистрам порта. В этом подходе первые 2 байта ввода/вывода содержат данные контрольного регистра, другие 2 байта — получаемые/посылаемые портом данные.
#Lesson 6
open(СОМ, "+#СОМ1") || die "";
$sr =2; # -1 for serial register and -1 or 0 for data means do not set/send
$sr <<= 16; # first 2 bytes are register, second 2 bytes are data
# actually for setting/sending is used only second byte in pair
print COM $sr; # DTR is set, it works like printf(COM "%d", $sr);
$str = "";
read(COM, $str, 12); # read serial register and data as decimal string
$sr = dec($str) >> 16; # converts string to bytes and gets register
# first 2 bytes are register, second 2 bytes are data
printf "0x%x", $sr;
close COM;
warn " ";
Операции << и >> производят сдвиг битов числа, соответственно влево и вправо на указанное количество позиций, добавляя на освободившиеся места нули. Каждый сдвиг это, по сути, умножение (влево) или деление (вправо) на 2.
Урок 7. Ввод-вывод звуковой карты
Нижеследующий скрипт считывает 160 байтов из звуковой карты и отправляет на нее, через мини-сервер, тоже 160, случайных байтов. Этого достаточно, чтобы услышать скрип в динамике.
#Lesson 7
open(AUDIO, "+#AUD1") || die "";
$str = "";
read(AUDIO, $str, 160);
@x = unpack("Cl60", $str);
printf "0x%x", $x[10];
srand;
for($idx =0; $idx < 160; $idx++) {
$x[$idx] += rand(50) — rand(50);
}
$str = pack("C160", 0x);