1

数日間の調査とプログラミングの結果、バイナリ、ソース コード、32 ビット、64 ビット、アドレス ラッパーなど、inpout32.dll と inpoutx64.dll のすべての亜種を試すようになりました。None work: ポートの出力ビットに変化は見られません。

ただし、パラレル ポート出力を行う市販の別のプログラムを使用すると、0 ~ 255 の値を渡すことで 8 つの出力ビット (D0 ~ D7) すべてでトリガー (状態変化) を検出できるため、可能であることはわかっています。私は自分のアプリケーションでやりたい。

少なくとも次のページのすべてのアドバイスに従いました。

Windows 7、64 ビットを使用しています。また、私の SIIG Cyber​​pro ポートは、アドレス 0xCCD8 に LPT3 としてマップされ、アドレス 0xCCD4 に 4 つのステータス ビットがあります。0x0378 で LPT1 としてマップされた別の ECP プリンター ポートがありますが、それも機能しません。

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);
        }
    }
}
4

1 に答える 1

1

ご参考までに:

追加したところ

 [DllImport("inpout32.dll")]
 private static extern void DlPortWritePortUshort(ushort PortAddress, ushort Data);

Out32(ushort addr, ushort value) ではなくその関数を呼び出して、コードが機能しました。

正確なインターフェイスが重要な理由はわかりませんが、重要です。おそらくそれは、示唆されているように、16ビットポートアドレスの符号拡張によるものです[どこかTBD]。

于 2013-06-03T22:36:53.107 に答える