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 слишком велико для короткого! изменил его на неподписанный короткий.

Спасибо за вашу помощь

Другие вопросы по тегам