zoukankan      html  css  js  c++  java
  • C#实现并口输出输入高低电位

    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下操作成功,附上源码如下

    [csharp] view plaincopy
    1.     public class WinIo  
    2.     {  
    3.         [DllImport("WinIo32.dll")]  
    4.         public static extern bool InitializeWinIo();  
    5.         [DllImport("WinIo32.dll")]  
    6.         public static extern void ShutdownWinIo();  
    7.         [DllImport("WinIo32.dll")]  
    8.         public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);  
    9.         [DllImport("WinIo32.dll")]  
    10.         public static extern bool SetPortVal(IntPtr wPortAddr,int dwPortVal, byte bSize);  
    11.         //以下是与并口无关  
    12.         [DllImport("WinIo32.dll")]  
    13.         public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);  
    14.         [DllImport("WinIo32.dll")]  
    15.         public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);  
    16.         [DllImport("WinIo32.dll")]  
    17.         public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);  
    18.         [DllImport("WinIo32.dll")]  
    19.         public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);  
    20.         [DllImport("user32.dll")]  
    21.         public static extern int MapVirtualKey(uint Ucode, uint uMapType);  
    22.   
    23.   
    24.         public bool online = false;                          //WinIo打开标志  
    25.         //数据端口共8位,控制端口共4位,可以组成1~12位的任意数字输出端口;  
    26.         //状态端口共5位,控制端口共4位,可以组成1~9位的任意数字输入端口  
    27.         private static IntPtr data_port = (IntPtr)0x378;     //数据端口地址 D0-D7 8个端口  
    28.         private static IntPtr state_port = (IntPtr)0x379;    //状态端口地址 S3-S7 只能读取5位  
    29.         private static IntPtr control_port = (IntPtr)0x37A;  //控制端口地址 C0-C3 只能控制或输出4位  
    30.   
    31.         /// <summary>  
    32.         /// 设定DataPort输出  
    33.         /// </summary>  
    34.         /// <param name="WriteValue">设定值:范围为0~255</param>  
    35.         private void setDateBuff(int WriteValue)  
    36.         {  
    37.             IntPtr m_nport = data_port;                 //数据端口地址data_port  
    38.   
    39.             int m_nValue = WriteValue;  
    40.   
    41.             //调用WinIo库函数SetPortVal写端口值  
    42.             SetPortVal(m_nport, m_nValue, 1);           //write a BYTE value to an I/O port  
    43.         }  
    44.   
    45.         /// <summary>  
    46.         /// 设定ControlPort输出  
    47.         /// 高4位默认设置,请不要修改,因此输出时保持高位值不变,将要输出的值从低4位输出  
    48.         /// Control端口C2读写正常,C0、C1、C3写入0则输出高电平,写入1输出低电平;读取亦然  
    49.         /// </summary>  
    50.         /// <param name="WriteValue">设定值</param>  
    51.         private void setControlBuff(int WriteValue)  
    52.         {  
    53.             IntPtr m_nport = control_port;              //获得控制端口地址  
    54.             //获得控制端口的值,  
    55.             int temp_dwPortVal = 0;  
    56.             GetPortVal(m_nport, out temp_dwPortVal, 1); //reads a BYTE value from an I/O port  
    57.   
    58.             int temp_aa = temp_dwPortVal & 0xF0;        //将低4位置为0;高4位不变  
    59.   
    60.             int WriValue = WriteValue & 0x0F;           //取设定值低4位;高4位为0  
    61.             temp_aa = temp_aa | WriteValue;             //合并端口值高4位与设定值低4位  
    62.             temp_aa = temp_aa ^ 0x0B;                   //将低4位中C0、C1、C3取反(0->1;1->0)(保证设定值与实际电平相吻合)  
    63.             SetPortVal(m_nport, temp_aa, 1);            //写出的值中,高4位保持端口原来的值不变,低4位实际输出  
    64.         }  
    65.   
    66.         /// <summary>  
    67.         /// 读取ControlPort值  
    68.         /// Control端口C2读取正常,C0、C1、C3高电平则读入0,低电平则读入1  
    69.         /// </summary>  
    70.         /// <returns>返回C0-C3 四个端口的值:范围为0~15</returns>  
    71.         private int getControlBuff()  
    72.         {              
    73.             IntPtr m_nport = control_port;              //控制端口地址data_port  
    74.   
    75.             int m_nValue = 0;  
    76.             //调用WinIo库函数SetPortVal写端口值  
    77.             GetPortVal(m_nport, out m_nValue, 1);      //reads a BYTE value from an I/O port  
    78.   
    79.             int ValueGet = m_nValue ^ 0x0B;            //将低4位中C0、C1、C3取反(0->1;1->0)  
    80.             ValueGet = ValueGet & 0x0F;                //去掉高4位值  
    81.             return ValueGet;  
    82.         }  
    83.   
    84.         /// <summary>  
    85.         /// 读取StatePort值  
    86.         /// State端口S7高电平则读入0,低电平则读入1;其他正常  
    87.         /// </summary>  
    88.         /// <returns>返回S3-S7 五个端口的值:范围0-31</returns>  
    89.         private int getStateBuff()  
    90.         {             
    91.             IntPtr m_nport=state_port ;               //控制端口地址state_port  
    92.               
    93.             int dwPortVal =0;  
    94.             GetPortVal(m_nport, out dwPortVal, 1);    //reads a BYTE value from an I/O port  
    95.   
    96.             int ValueGet = dwPortVal ^ 0x80;          //将S7取反(保证读取与实际电平相吻合)  
    97.             ValueGet = ValueGet & 0xF8;               //去掉S0 ~S2位;  
    98.             ValueGet = ValueGet >> 3;                 //右移3位,将S7~S3变为低5位  
    99.             return ValueGet;  
    100.         }  
    101.   
    102.         public bool OpenWinIo()  
    103.         {  
    104.             if (InitializeWinIo())  
    105.             {  
    106.                 this.online  = true;  
    107.                 return true;  
    108.             }  
    109.             else   
    110.             {  
    111.                 this.online  = false;  
    112.                 return false;  
    113.             }  
    114.         }  
    115.   
    116.         public void CloseWinIo()  
    117.         {  
    118.             ShutdownWinIo();  
    119.             this.online  = false;  
    120.         }  
    121. }  

    附上WinIo3.0库:WinIo

    及小弟例程源码:源码

    更多0
    相关主题推荐
    数据 源码 sel
  • 相关阅读:
    drf中的请求模块和渲染模块
    drf基础
    vue中的路由传参及跨组件传参
    vue项目环境搭建与组件介绍
    vue基础指令了解补充及组件介绍
    整理的几个防止刷新后退重复提交数据的方法
    程序员心灵之塔
    怎么样才是好的程序员
    using在namespace里面还是外面有区别吗
    高级.net工程师必备
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/3645764.html
Copyright © 2011-2022 走看看