读取并行端口状态(简单的Push开关)
本文关键字:Push 开关 简单 并行端口 状态 读取 | 更新日期: 2023-09-27 18:17:43
我正在用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
谢谢你的帮助