Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Input32.dll/Inputx64.dll是否处理所有并行端口之间的I/O?_C#_Windows_Driver_Parallel Port - Fatal编程技术网

C# Input32.dll/Inputx64.dll是否处理所有并行端口之间的I/O?

C# Input32.dll/Inputx64.dll是否处理所有并行端口之间的I/O?,c#,windows,driver,parallel-port,C#,Windows,Driver,Parallel Port,经过几天的研究和编程,我尝试了input32.dll和inputx64.dll的所有变体:二进制文件、源代码、32位、64位地址包装器。无工作:端口的输出位没有变化 然而,我知道这是可能的,因为使用另一个商用程序进行并行端口输出,我可以通过传递0到255之间的值来检测所有八个输出位(D0-D7)上的触发器(状态变化),这正是我在自己的应用程序中想要做的 我遵循了至少以下几页中的所有建议: 我使用的是Windows7,64位;我的SIIG Cyberpro端口映射为地址0xCCD8

经过几天的研究和编程,我尝试了input32.dll和inputx64.dll的所有变体:二进制文件、源代码、32位、64位地址包装器。无工作:端口的输出位没有变化

然而,我知道这是可能的,因为使用另一个商用程序进行并行端口输出,我可以通过传递0到255之间的值来检测所有八个输出位(D0-D7)上的触发器(状态变化),这正是我在自己的应用程序中想要做的

我遵循了至少以下几页中的所有建议:

我使用的是Windows7,64位;我的SIIG Cyberpro端口映射为地址0xCCD8处的LPT3,地址0xCCD4处有四个状态位。我有另一个ECP打印机端口映射为0x0378处的LPT1,但这也不起作用

我知道最好不要在Win7上直接调用_inp(),_outp()

有人能帮忙吗

如果我需要下载和修改驱动程序代码,我可以这样做,如果我必须的话,但我认为这应该不是那么困难

我的最终版本代码使用32位编译,与Input32.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);
        }
    }
}
供参考:

当我加上

 [DllImport("inpout32.dll")]
 private static extern void DlPortWritePortUshort(ushort PortAddress, ushort Data);
并调用了该函数而不是Out32(ushort addr,ushort value),代码运行正常


我不知道为什么确切的接口很重要,但它确实重要;也许这确实是因为16位端口地址上的符号扩展,正如[某处待定]所建议的那样。

您犯了一个标准错误,没有解释您如何知道它不起作用。如果术语“开放式采集器输出”对您没有任何意义,请访问electronics.stackexchange.com,询问如何检查并行端口是否工作。对不起,我太累了。我忘了。答案是:我有第二台计算机,它带有一个数据读取器/采集器,在一个移动的定时图形上,将每个并行端口输出位显示为一条彩色线。使用一些写入端口的商业软件,我可以选择一个单字节值来写入;我可以在图形上单独设置和识别每个位。使用我的软件(反映专有商业软件),我看不到输出出现,即使我做了与商业软件“相同”的事情,写一个字节。我没办法知道通讯软件是怎么做的。