Сотовый телефон за 19$. Вы хотите обладать модным многофункциональным мобильником, оснащённым огромным TFT экраном и превосходной камерой, но в силу его большой стоимости не можете себе этого позволить? Мы решили проблему! Вы просто не представляете насколько легко достичь своей мечты или выполнить желание, лишь только захотев этого! Вам нужны доказательства
или Вы действительно хотите, чтобы Ваше желание осуществилось? Подробнее
Здравствуйте уважаемые подписчики!
LPT для разработчика представляет большой интерес в силу того, что может быть легко сопряжён со стандартными TTL-микросхемами, т. к. обеспечивает нужные уровни сигналов и предоставляет готовый параллельный код. Программируется он также легко. Но есть много "но".
Про параллельный порт PC в интернете можно найти массу разнообразной информации, однако, занявшись разработкой программы, работающей с портом напрямую, я столкнулся с массой трудностей. В этой статье изложен мой опыт, касающийся данной темы, рассмотрены некоторые проблемы, возникающие при этом и способы их. Следует однако оговориться, что будут обсуждаться проблемы, связанные с прямым доступом к порту, здесь я никак не коснусь
темы написания драйверов самодельных устройств для конкретных операционных систем (поскольку этим никогда и не занимался :).
Общая информация
Каждый нормальный компьютер имеет минимум 1 принтерный порт, имеющий адрес 0x378 и обзываемый LPT1. Ко второму контроллеру (если, конечно, он есть) можно обратиться по адресу 0x278. Есть ещё пара экзотических вариантов, но с ними я ни разу не сталкивался и, думаю, не столкнётесь и вы.
Темой статьи неявляется описание возможностей порта, поэтому я приведу их кратко.
При записи байта базовому адресу (например 0x378) на выводах 2-9 появляются логические уровни, напрямую соответствующие битам байта. Наример, при записи значения 0x01 на первом выводе данных (пин 2) будет присутствовать логический уровень 1 (около 5V).
Также для вывода можно использовать байт контроля порта, это базовый адрес + 2. Используются только первые 4 бита, причём здесь все сигналы логически инвертированы, кроме бита 2 (нумерация от 0). Этот сигнал по стандарту отвечает за инициализацию внешнего устройства.
Таким образом, истратив один из перечисленным 12 выводов под строб (управляющий сигнал, сообщающий внешнему устройству о необходимости чтения данных) – обычно это пин 1 – получаем 11 бит для вывода. Хотя обычно используются только стандартные 8 бит, а остальные сигналы являются управляющими.
Чтение стауса порта можно произвести по адресу "базовый + 1".
Проблема Windows NT и иже с ними
До какого-то момента на сиё явление можно было закрывать глаза, но нынче, когда семейству Win9x отводится всё более и более узкая ниша среди ОС для домашних ПК, следует задумываться и о работоспособности программы под Windows 2000/XP.
Итак, в чём вся трагедия. Пока мы жили под всевозможными DOS'ами и, если можно так выразиться, полудосами (т. е. Windows 95, 98...) мы могли, вышеописанным способом, просто писать по нужному адресу, ни о чём другом не задумываясь. Но вот "власть меняется". Во всех NT-совместимых ОС такие действия не допускаются системой, что делает, казалось бы, практически нереальным перенос "старых добрых" программ на новую платформу.
Самым удобным вариантом решения этой проблемы является, по-видимому, использование драйвера-заглушки. Как выяснилось, их существует великое множество. Один из наиболее популярных – giveio.sys. Этот файл и инструкцию по его установке легко найти через поисковые системы, но я предпочёл – и вам советую – самый "ленивый" способ: скачал замечательную программу для мониторинга системы (и управления вентиляторами) под названием
SpeedFan, которая ставит этот драйверок при своей установке. Что называется 2 in 1.
После после установки драйвера в результате выполнения магических строчек
h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
мы сможем работать, как обычно. Правда, сильно не лишним будет проверить h на INVALID_HANDLE_VALUE :). А то мало ли чего – драйверок не установлен...
Программирование LPT в языке Java
Пока мы имеем дело с обычными, зависимыми от платформы языками, такими как C++, Паскаль и т. д., мы можем работать с железом PC достаточно просто. Где-то я видел даже какую-то объектную обёртку для Delphi. Платформа Java предоставляет большие удобства для разработки объектно-ориентированных приложений, однако не даёт гибкости языков программирования, ориентированных на конкретную аппаратную платформу и операционную систему.
Для решения этой проблемы в контексте доступа к стандартным портам фирма Sun предлагает специальный Java Communication API, однако его запутанность, похоже, превышает функциональность, тем более что перенос программ, написанных на C сильно затруднён. Одним словом, покопавшись в нём пару дней, я решил использовать доступ "по старинке". Хотя это и не очень-то правильно...
Если необходим доступ к порту, аналогичный доступу в языке C (функции типа outp), можно использовать маленькую библиотечку DreamIO, как я её назвал. Написанная на C использованием JNI (Java Native Interface), она должна быть подключена к программе примерно таким образом:
package em.dreamio; public class DreamIO { private DreamIO() { } // ну не нужен тут конструктор, не хочу public static native int readByte(int address); public static native void writeByte(int address, int aByte); // названия методов должны соответствовать // именам в dll-ке (с учётом искажения имён) static
{ System.loadLibrary("DreamIO"); } // А вот само подключение dll-ки }
Соответственно исходный код библиотеки должен быть наподобие нижеследующего. Для пущей полезности добавим поддержку GiveIO.
Нелишне отметить, что эту dll-ку надо положить в каталог bin вашего JRE (НЕ JDK - компилятору до неё нет никакого дела).
Написанная связка позволит работать, разумеется, не только с LPT, но и с чем угодно, лишь бы вы знали как этому обратиться. Разумеется, ни о каком лозунге Java "Write ones, runs anywhere" говорить не приходится, хотя разве трудно перекомпилировать эту dll-ку под нужную платформу?
Заключение
Ну что тут ещё можно сказать? По-хорошему прямой доступ такого рода пропагандировать нельзя, однако когда хочется абстрагироваться от свойств драйверов ОС – особенно в случае с Java – вариант представляется вполне жизнеспособным. По крайней мере, для кустарных конструкций...
Ну и как всегда хочу добавить, что хомам свойственно ошибаться, а сапиенсам – тем более. Буду благодарен вашим поправкам. На сегодня все! С праздником дорогие женщины! Мы вас любим!
Сотовый телефон за 19$. Вы хотите обладать модным многофункциональным мобильником, оснащённым огромным TFT экраном и превосходной камерой, но в силу его большой стоимости не можете себе этого позволить? Мы решили проблему! Вы просто не представляете насколько легко достичь своей мечты или выполнить желание, лишь только захотев этого! Вам нужны доказательства
или Вы действительно хотите, чтобы Ваше желание осуществилось?Подробнее