C# - 读取并行端口状态(简单按钮开关)

时间:2011-12-14 08:51:46

标签: c# c++ .net parallel-port

我正在用C#更新一些最初用VC ++ V1.0 for 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的信息是here。我已经做了很多搜索/从.Net的并行端口读取/写入,但似乎没有任何东西可以为我提供端口状态。

另外,您能从这段代码(以及它如何检查'状态')中得出结论,这两条开关线连接在DB25插头上?

如果有人对此有任何帮助/建议,我将不胜感激。 非常感谢

2 个答案:

答案 0 :(得分:1)

似乎检查'错误',引脚15. IIRC,这是内部上拉,所以你的开关应该拉下引脚15.在引脚15和18之间连接。

有一些驱动程序可用于读取I / O映射端口。您将必须导入并进行DLL调用,然后几乎肯定会轮询该引脚:((

我希望这个界面已经死了并埋葬了!

答案 1 :(得分:0)

感谢您的回复。这就是我最终的结果......

我在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太短了!将其改为无符号短片。

感谢您的帮助