几天的研究和编程让我尝试了inpout32.dll和inpoutx64.dll的所有变种:二进制文件,源代码,32位,64位地址包装器。无效:端口的输出位没有变化。
但是,我知道这是可能的,因为使用另一个可以进行并行端口输出的商用程序,我可以通过传递0到255之间的值来检测所有8个输出位(D0-D7)的触发(状态改变) ,正是我想在自己的应用程序中做的事情。
我已经遵循了至少这些页面的所有建议:
我使用的是Windows 7,64位;我的SIIG Cyberpro端口映射为地址0xCCD8的LPT3,地址0xCCD4有四个状态位。我有另一个ECP打印机端口映射为LPT1在0x0378,但这也不起作用。
我知道比在Win7上尝试直接_inp(),_ outp()调用更好。
有人可以帮忙吗?
如果我需要下载和修改驱动程序代码,如果必须,我可以这样做,但我认为不应该那么困难。
我的最终版本代码使用32位编译,与inpout32.dll连接:
using System;
using System.Runtime.InteropServices;
namespace ParallelPort
{
public class PortAccess
{
//inpout.dll
[DllImport("inpout32.dll")]
private static extern void Out32(ushort PortAddress, short Data);
[DllImport("inpout32.dll")]
private static extern short Inp32(ushort PortAddress);
private ushort _PortAddress = 0;
public ushort PortAddress { get { return _PortAddress; } }
public PortAccess(ushort portAddress)
{
_PortAddress = portAddress;
short result = 0;
try
{
result = Inp32(portAddress);
}
catch (DllNotFoundException e)
{
throw new ArgumentException("Unable to find InpOut32.dll");
}
catch (BadImageFormatException)
{
result = 0;
}
if (0 == result)
throw new ArgumentException("Unable to open parallel port driver");
}
//Public Methods
public void Write(ushort Data)
{
Out32(_PortAddress, (short)Data);
}
public byte Read()
{
return (byte)Inp32(_PortAddress);
}
}
}
答案 0 :(得分:0)
供参考:
当我添加
[DllImport("inpout32.dll")]
private static extern void DlPortWritePortUshort(ushort PortAddress, ushort Data);
并调用该函数而不是Out32(ushort addr,ushort value)代码工作。
我不知道为什么确切的界面很重要,但确实如此;也许这确实是因为16位端口地址上的符号扩展,正如[某处TBD]建议的那样。