Иногда появляется потребность из компьютера управлять внешним устройством. Например, светильником. У меня встала задача сбрасывать зависший модем. Программа управления модемом (звонилка) была кустарная и работала не совсем корректно, от чего модем зависал.
Встал вопрос, как перезагружать модем, если он завис. Можно было взять готовое реле времени на 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 минут, контакты перезапускались.