C # - чтение состояния параллельного порта (простой нажимной переключатель) - PullRequest
0 голосов
/ 14 декабря 2011

Я обновляю в 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 ]

1 голос
/ 14 декабря 2011

Кажется, что он проверяет «Ошибка», контакт 15. IIRC, он поднимается изнутри, поэтому ваш переключатель должен опустить контакт 15. Подключите его между контактами 15 и 18.

Есть некоторые драйверыдоступны, которые позволяют чтение портов ввода-вывода карты.Вам нужно будет импортировать и делать вызовы DLL, а затем почти наверняка опрашивать пин-код: ((

Хотелось бы, чтобы этот интерфейс был мертв и похоронен!

0 голосов
/ 20 декабря 2011

Спасибо за ответ.Вот чем я закончил ...

Я использовал этот учебник на 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 слишком большой для коротких!изменил его на unsigned short.

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

...