读取并行端口状态(简单的Push开关)



我正在用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插头上吗?

如果有人能在这方面提供一些帮助/建议,我将不胜感激。非常感谢

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

有一些驱动程序允许读取I/O映射端口。您必须导入并调用DLL,然后几乎可以肯定地轮询pin:(

)

我真希望这个接口已经死了!

感谢您的回复。这是我最后得到的…

我在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

谢谢你的帮助

最新更新