C#实现并口输出输入高低电位

来源:互联网 发布:淘宝内部优惠券口令 编辑:程序博客网 时间:2024/05/01 04:20

PC并行口各阵脚定义:

1.选通,PC->Printer

2-9 数据(D0-D7

10.应答(ACK),Printer->PC

11.忙(BUSY),Printer->PC

12.无纸(PE),Printer->PC

13.联机(SLCT),Printer->PC

14.自动换行(AUTO FD),PC->Printer

15.错误(ERROR),Printer->PC

16.初始化(INIT),PC->Printer

17.选择输出(SELECT IN),PC->Printer

18.-25.地(GND

并口针脚定义

    并口开机时默认状态
                                       除了C317)针及地线外,全部为高;

    并口输出输入规则:
                                       DataPort      地址0x378   8个针脚(D0-D7) 正常,写入0输出低电平,写入1则输出高电平;

                                       ContorlPort  地址0x37A  4个针脚(C0-C3) C2正常,C0C1C3取反-----写入0输出高,写入1则输出低;读取同理;

                                       StatePort       地址0x379   5个针脚(S3-S7) S7取反,其他正常;

 PC并口的8DataPort 4ContorlPort都可以作为数字输出端口,两个端口可以组成112位的任意数字输出端口;而这4位StatePort、5位ContorlPort 都可以作为数字输入端口,状态端口共5位,控制端口共4位,两个端口可以组成19位的任意数字输入端口。


  本人使用WinIo3.0库操作并口,在XP下操作成功,附上源码如下

    public class WinIo    {        [DllImport("WinIo32.dll")]        public static extern bool InitializeWinIo();        [DllImport("WinIo32.dll")]        public static extern void ShutdownWinIo();        [DllImport("WinIo32.dll")]        public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);        [DllImport("WinIo32.dll")]        public static extern bool SetPortVal(IntPtr wPortAddr,int dwPortVal, byte bSize);        //以下是与并口无关        [DllImport("WinIo32.dll")]        public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);        [DllImport("WinIo32.dll")]        public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);        [DllImport("WinIo32.dll")]        public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);        [DllImport("WinIo32.dll")]        public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);        [DllImport("user32.dll")]        public static extern int MapVirtualKey(uint Ucode, uint uMapType);        public bool online = false;                          //WinIo打开标志        //数据端口共8位,控制端口共4位,可以组成1~12位的任意数字输出端口;        //状态端口共5位,控制端口共4位,可以组成1~9位的任意数字输入端口        private static IntPtr data_port = (IntPtr)0x378;     //数据端口地址 D0-D7 8个端口        private static IntPtr state_port = (IntPtr)0x379;    //状态端口地址 S3-S7 只能读取5位        private static IntPtr control_port = (IntPtr)0x37A;  //控制端口地址 C0-C3 只能控制或输出4位        /// <summary>        /// 设定DataPort输出        /// </summary>        /// <param name="WriteValue">设定值:范围为0~255</param>        private void setDateBuff(int WriteValue)        {            IntPtr m_nport = data_port;                 //数据端口地址data_port            int m_nValue = WriteValue;            //调用WinIo库函数SetPortVal写端口值            SetPortVal(m_nport, m_nValue, 1);           //write a BYTE value to an I/O port        }        /// <summary>        /// 设定ControlPort输出        /// 高4位默认设置,请不要修改,因此输出时保持高位值不变,将要输出的值从低4位输出        /// Control端口C2读写正常,C0、C1、C3写入0则输出高电平,写入1输出低电平;读取亦然        /// </summary>        /// <param name="WriteValue">设定值</param>        private void setControlBuff(int WriteValue)        {            IntPtr m_nport = control_port;              //获得控制端口地址            //获得控制端口的值,            int temp_dwPortVal = 0;            GetPortVal(m_nport, out temp_dwPortVal, 1); //reads a BYTE value from an I/O port            int temp_aa = temp_dwPortVal & 0xF0;        //将低4位置为0;高4位不变            int WriValue = WriteValue & 0x0F;           //取设定值低4位;高4位为0            temp_aa = temp_aa | WriteValue;             //合并端口值高4位与设定值低4位            temp_aa = temp_aa ^ 0x0B;                   //将低4位中C0、C1、C3取反(0->1;1->0)(保证设定值与实际电平相吻合)            SetPortVal(m_nport, temp_aa, 1);            //写出的值中,高4位保持端口原来的值不变,低4位实际输出        }        /// <summary>        /// 读取ControlPort值        /// Control端口C2读取正常,C0、C1、C3高电平则读入0,低电平则读入1        /// </summary>        /// <returns>返回C0-C3 四个端口的值:范围为0~15</returns>        private int getControlBuff()        {                        IntPtr m_nport = control_port;              //控制端口地址data_port            int m_nValue = 0;            //调用WinIo库函数SetPortVal写端口值            GetPortVal(m_nport, out m_nValue, 1);      //reads a BYTE value from an I/O port            int ValueGet = m_nValue ^ 0x0B;            //将低4位中C0、C1、C3取反(0->1;1->0)            ValueGet = ValueGet & 0x0F;                //去掉高4位值            return ValueGet;        }        /// <summary>        /// 读取StatePort值        /// State端口S7高电平则读入0,低电平则读入1;其他正常        /// </summary>        /// <returns>返回S3-S7 五个端口的值:范围0-31</returns>        private int getStateBuff()        {                       IntPtr m_nport=state_port ;               //控制端口地址state_port                        int dwPortVal =0;            GetPortVal(m_nport, out dwPortVal, 1);    //reads a BYTE value from an I/O port            int ValueGet = dwPortVal ^ 0x80;          //将S7取反(保证读取与实际电平相吻合)            ValueGet = ValueGet & 0xF8;               //去掉S0 ~S2位;            ValueGet = ValueGet >> 3;                 //右移3位,将S7~S3变为低5位            return ValueGet;        }        public bool OpenWinIo()        {            if (InitializeWinIo())            {                this.online  = true;                return true;            }            else             {                this.online  = false;                return false;            }        }        public void CloseWinIo()        {            ShutdownWinIo();            this.online  = false;        }}


附上WinIo3.0库:WinIo

及小弟例程源码:源码