【发布时间】:2013-05-31 19:22:44
【问题描述】:
几天的研究和编程使我尝试了 inpout32.dll 和 inpoutx64.dll 的所有变体:二进制文件、源代码、32 位、64 位、地址包装器。无效:端口的输出位没有变化。
但是,我知道这是可能的,因为使用另一个进行并行端口输出的商用程序,我可以通过传递 0 到 255 之间的值来检测所有八个输出位 (D0-D7) 上的触发(状态变化) ,正是我想在自己的应用程序中做的事情。
我至少遵循了以下页面中的所有建议:
- Write to parallel port in Windows 7
- C# LPT inpout32.dll
- C# - Read Parallel Port State (Simple Push Switch)
- Write to a parallel port on windows 7
- Parallel port with C#
- http://www.lvr.com/parport.htm
我使用的是 Windows 7,64 位;我的 SIIG Cyberpro 端口映射为地址 0xCCD8 处的 LPT3,地址 0xCCD4 处有四个状态位。我在 0x0378 处有另一个 ECP 打印机端口映射为 LPT1,但这也不起作用。
我知道最好不要尝试在 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);
}
}
}
【问题讨论】:
-
您犯了一个标准错误,即没有解释您如何知道它不起作用。术语“集电极开路输出”对您没有任何意义,然后前往 electronics.stackexchange.com 并询问如何检查并行端口是否工作。
-
对不起,我累了。我忘了。答案是:我有第二台带有数据读取器/收集器的计算机,它将每个并行端口输出位显示为移动定时图上的彩色线。使用一些写入端口的商业软件,我可以选择一个字节的值来写入;我可以在图表上单独设置和识别每个位。使用我的软件(反映专有商业软件),我看不到输出出现,即使我做与商业软件“相同”的事情,写一个字节。我无法知道 comm-sw 是如何做到的。
标签: c# windows driver parallel-port