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)

并口开机时默认状态: 除了C3(17)针及地线外,全部为高;
并口输出输入规则: DataPort 地址0x378 8个针脚(D0-D7) 正常,写入0输出低电平,写入1则输出高电平;
ContorlPort 地址0x37A 4个针脚(C0-C3) C2正常,C0、C1、C3取反-----写入0输出高,写入1则输出低;读取同理;
StatePort 地址0x379 5个针脚(S3-S7) S7取反,其他正常;
PC并口的8位DataPort 、4位ContorlPort都可以作为数字输出端口,两个端口可以组成1~12位的任意数字输出端口;而这4位StatePort、5位ContorlPort 都可以作为数字输入端口,状态端口共5位,控制端口共4位,两个端口可以组成1~9位的任意数字输入端口。
本人使用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
及小弟例程源码:源码
- 上一篇:[对象的使用]请分清静态与非静态
- 下一篇:FormatMessage函数简介
C#实现并口输出输入高低电位的更多相关文章
- 【VB超简单入门】五、基本输出输入
之前讲了VB IDE的基本操作和概念,接下来要开始将VB语言的编程了. 程序最重要的部分是输出和输入,输入数据,经过计算机处理,再输出结果.本文将介绍两种最基本的输出输入方法,分别是Print.Msg ...
- Java基础(5)- 输出输入
输出输入 public class Input { public static void main (String[] args){ try { /** * 打开文件流进行读取 */ Scanner ...
- c++学习笔记---05--- C++输出输入小结
C++输出输入小结 题目: 这个程序将向用户提出一个"Y/N"问题,然后把用户输入的值赋值给answer变量. 要求: 针对用户输入'Y'或'y'和'N'或'n'进行过滤: 发掘程 ...
- c 整数的逆序输出 输入3,2就算 2+22+222的结果
#include<stdio.h> #include<math.h> //整数逆序输出 void nixu() { int num,i; i = ; scanf("% ...
- Python基础-变量定义-输出输入
一.变量的定义 字母.数字.下划线组成,不能以数字开头,同时区分大小写 二.输出 print() print(,) 输出空格 input() 读取键盘输入
- python/基础输出输入用法
输出及输入的简单用法 print print,中文意思是打印,在python里它不是往纸上打印,而是打印在命令行,或者叫终端.控制台里面.print是python里很基本很常见的一个操作,它的操作对象 ...
- C++ stringstream格式化输出输入探索
- 最近在笔试时经常遇见各种输入问题,于是细心总结一波: - 首先string str; cin>>str;遇到空格结束: - 于是乎产生了getline(),可与得到一行字符串:空格自动 ...
- GPIO口的输入输出模式
1.浮空输入 GPIO_Mode_IN_FLOATING 2.带上拉输入 GPIO_Mode_IPU 3.带下拉输入 GPIO_Mode_IPD 4.模拟输入 ...
- MR案例:输出/输入SequenceFile
SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).在SequenceFile文件中,每一个key-value对被看做是一条记 ...
随机推荐
- 每天一个linux命令(文件上传下载文件操作):【转载】gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...
- 监听器(Listener)学习(二)在开发中的常见应用
监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用: 统计当前在线人数 自定义Session扫描器 一.统计当前在线人数 在JavaWeb应用开发中,有时候 ...
- Linux多电脑ssh免密码登录
Linux多电脑ssh免密码登录 1.这里拿三台虚拟机举例子.版本为:CentOS7 第一步:;开机,连接. 第二步:确定你的其中一台为主机.(生成公共的密匙). 第三步:目的:创建.ssh文件 命令 ...
- 如何使用 MSBuild Target(Exec)中的控制台输出
我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程.但是,相比于 基于 Task 的方式,可控制的因素还是太少了. 有没有什么办法能够让 ...
- flask第七篇——URL与视图函数的映射
有兴趣的朋友可以添加微信公众号:自动化测试实战 今天开始就要进入正题了.大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法: ...
- C#通过StreamWriter对象实现把数值内容写到记事本
本文介绍下,用C#实现将数组内容写到txt文件中的一例代码,有需要的朋友,参考下吧. 代码示例:StreamWriter sw=new StreamWriter("F:\\ex.txt&qu ...
- Hangfire 任务调度
Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Ser ...
- Jacoco在eclipse上的集成使用
随着敏捷开发的流行,编写单元测试已经成为业界共识.但如何来衡量单元测试的质量呢?有些管理者片面追求单元测试的数量,导致底下的开发人员投机取巧,编写出大量的重复测试,数量上去了,质量却依然原地踏步.相比 ...
- qqbot 配置
qqbot 配置 用起来还是挺方便的,使用 pip install qqbot 就可以. 不过找配置文件没注意,以为是在程序目前,原来是在 C:\Users\xxx.qqbot-tmp 目录. 插件可 ...
- Web Service简介(一)
这篇博文,我们对Web Service进行一个简单的介绍和认识,作为Web Service的入门.在学习之前,你需要对HTML和XML有基本的了解,Web Service并不难,而且非常的简单. 什么 ...