C# - чтение состояния параллельного порта (простой нажимной переключатель)
Я обновляю в C# некоторые программы, которые изначально были написаны на VC++ V1.0 для DOS6.
Одним из аспектов программного обеспечения является проверка параллельного порта, к которому подключен простой кнопочный переключатель. В настоящее время я не знаю, к каким двум контактам подключен коммутатор, но у меня есть источник для старой программы, соответствующие разделы которого приведены ниже...
#define switch_mask 0x10
void main(int argc, char *argv[])
{
int NewState = 0, OldState = 0;
/* Check switch */
NewState = _bios_printer (_PRINTER_STATUS, 0, 0);
if (NewState != OldState)
{
checkParallelPort (NewState);
OldState = NewState;
}
}
void checkParallelPort (int portState)
{
int SwitchState;
/* Switch bit is Active LOW */
SwitchState = (portState & switch_mask) ? 1 : 0;
}
Теперь _bios_printer (в bios.h), очевидно, не доступен для меня в C#, но я изо всех сил пытаюсь найти альтернативу, которая может выполнить эту простую задачу.
Информация о _bios_printer находится здесь. Я много занимался поиском для чтения / записи в / из параллельного порта в.Net, но, похоже, ничто не дает мне статус порта.
Кроме того, вы можете сделать вывод из этого кода (и как он проверяет "статус"), где два провода переключателя подключены к штекеру DB25?
Я был бы признателен, если у кого-то есть помощь / совет по этому вопросу, пожалуйста. Большое спасибо
2 ответа
Кажется, что он проверяет "Ошибка", контакт 15. IIRC, он вытягивается внутри, поэтому ваш переключатель должен опустить контакт 15. Подключите его между контактами 15 и 18.
Доступны некоторые драйверы, которые позволяют считывать порты карты ввода / вывода. Вам придется импортировать и делать вызовы DLL, а затем почти наверняка опрашивать пин-код:((
Хотелось бы, чтобы этот интерфейс был мертв и похоронен!
Спасибо за ответ. Вот что у меня получилось...
Я использовал этот учебник по CodeProject... http://www.codeproject.com/KB/vb/Inpout32_read.aspx При преобразовании в C# я использовал нечто похожее на приведенное ниже. (Извиняюсь, если есть ошибка - я "перефразировал" приведенный ниже код из того, чем я закончил - это работает для меня!)
private void button1_Click(object sender, EventArgs e)
{
short InReg = 0x379; // Location of Port Status register
int NewState; // int named NewState
NewState = InpOut32_Declarations.Inp(InReg); //Now NewState has the values in 'Status port'
MessageBox.Show(NewState); //A popup will indicate the current value of NewState
}
static class InpOut32_Declarations
{
[DllImport("inpout32.dll", EntryPoint = "Inp32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
//Inp and Out declarations for port I/O using inpout32.dll.
public static extern int Inp(ushort PortAddress);
[DllImport("inpout32.dll", EntryPoint = "Out32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern void Out(ushort PortAddress, short Value);
}
Интересно, что поскольку мой параллельный порт начинается с 0xE800, а не с 0x378, мне пришлось изменить источник inpout32.dll, так как метод out32 принимает только короткое значение, а 0xE800 слишком велико для короткого! изменил его на неподписанный короткий.
Спасибо за вашу помощь