|
|
|
|
||||||||||||||||||||
Программа для работы с LPT-портом / Примеры программ / C# |
Управление LPT портом из C#Иногда появляется потребность из компьютера управлять внешним устройством. Например, светильником. У меня встала задача сбрасывать зависший модем. Программа управления модемом (звонилка) была кустарная и работала не совсем корректно, от чего модем зависал.Встал вопрос, как перезагружать модем, если он завис. Можно было взять готовое реле времени на 10-30 минут. Такое реле в виде платы продаются во многих магазинах радиодеталей и стоят рублей 300-500. Устанавливаются в разрыв цепи питания и периодически перезапускают модем. Но лучше сделать по-нормальному. А именно, если от модема не приходят некоторое время команды, его нужно перезагрузить. Если модем дорогой и в нем 2 процессора, то можно перезагрузить программно, отправив DTR (но такие модемы редкость, я ни одного не видел). Самый простейший способ управления внешними устройствами - через LPT порт. Сейчас он почти нигде не используется в отличии от COM и USB и не занят. Распиновка порта показана на Рис. 1. Нас интересуют только контакты 2-9 - это регистр данных (18-25 - общий вывод), в него из программы можно записать двоичное число. То есть можно без проблем подавать на эти контакты 0В или 5В. Меняя число, управлять работой 8-ми устройств. Стандартный порт, в который надо записать число, 0x378 или 888 в десятичной системе. На новых материнских платах он может быть другим и выставляться в BIOS. А также быть виртуальным, тогда ничего не выйдет. Для управления LPT портом из C# понадобится библиотека Inpout32.dll. Она бесплата для некоммерческого использования. Для использования в коммерческом софте, сделайте небольшое пожертвование автору. Для удобства создайте CS-файл с именем ComInterop.cs и пропишите в нем вызов функции из неуправляемого кода: using System; using System.Runtime.InteropServices; public class PortAccess { [DllImport("inpout32.dll", EntryPoint="Out32")] public static extern void Output(int adress, int value); } А в нужном участве кода пишем в порт таким образом: PortAccess.Output(0x378, 1);//Подает 5В на контакт "2" относительно общего вывода. Вот, собственно, весь код. Остальное - дело техники. В моем случае та программа записывала отчет в файл, а в своей программе я ввел проверку на последнюю дату записи в файл и если она отличалась более чем на 10 минут, контакты перезапускались. Скачать исходник «Управление LPT из C#» |