什么是端口?

端口包含了一系列信号线, 通过这个端口CPU可以同其他外部设备交换数据, 比如我们经常见到的Modem,打印机等.

通常情况下, 打开的信号是”1”, 关闭的信号是”0”. 并口在同一时间内可以发送8位的数据, 接收5位的数据. 而串口RS-232则只能发送1位数据, 但串口是多向的, 所以在同一时刻既可以发送也可以接收.

并口

D0-D7为数据线, S0-S7为状态线, 但是S0,S1,S2是看不见的(从图中你也可以看出), 状态线是用来读取数据的, 但S0却不同, 它是超时标志位, 其他的状态线从第10-11-12-13-15针是用来发送数据的(可以看出是5位). 那么我们怎么能得到这些数据端口呢? 很简单: 每一个并口都有一个地址.在Windows2000中, 你可以在打印机端口(LPT1)的属性中看到他们. 比如:我的是0378-037F, 如果是10进制, 那么就是888. 同样你也可以看到你的COM端口的地址. 让我以打印机为例解释一下这些针位的意义:

l         S0: 在EPP(增强的串口)模式下, 如果超时的话, 这位置1.

l         S1: 没用(估计是装饰).

l         S2: 大多数情况下没有使用.

l         S3: 如果打印机发生了错误则置0. 它通常被叫做nError或者nFault.

l         S4: 如果数据达到, 则置1.我们通常叫做Select.

l         S5: 如果没有打印纸了则置1.通常叫做PaperEnd或者PaperEmpty或者PError.

l         S6: 如果打印机得到了一个字节的数据则此位置0, 通常叫做nAck或者nAcknowledge.

l         S7: 如果打印机处于繁忙的状态则此位置0, 通常叫做Busy.

控制线:

这些线通常用来输出,但有时也可以用于输入. 他们占用C0-C7(如图), 但是在接口上C4, C5, C6, C7是不可见, 他们占用的端口地址是0x37A.

l         C0: 这一针脚是保留的. 他发送命令去读取端口上的数据(D0-D7). 当计算机启动的时候,这一位被置1,通常叫做nStrobe.

l         C1: 保留.通过他发送命令给打印机, 可以得到下一条打印线.(LF)

l         C2: 重置打印机并且清空数据缓冲区.(nInitialize)

l         C3: 保留.置高电平打开数据输入.启动计算机时置0.(nSelectIn)

地线:

从G0-G7的针是接地用的, 他们一般是用来完善电路的.

综上所述,在我的应用程序里使用数据线而不是具有保留位的控制线或者状态线作为数据传输。原因显而易见:我们可以发送任何数据到数据线上,比如00000000,这样8根针就没有任何电压(0伏特);当然也可以发送11111111(255),这样每根针都有+5伏特的电压。但是如果我们使用控制线,他有C0,C1和C3是保留,当我们发送0000000的时候,他却只能是0100,所以这样数据就不正确了。

信号

数据位

针脚

方向

-Strobe

¬C0

1

Output

+Data Bit 0

D0

2

Output

+Data Bit 1

D1

3

Output

+Data Bit 2

D2

4

Output

+Data Bit 3

D3

5

Output

+Data Bit 4

D4

6

Output

+Data Bit 5

D5

7

Output

+Data Bit 6

D6

8

Output

+Data Bit 7

D7

9

Output

-Acknowledge

S6

10

Input

+Busy

¬S7

11

Input

+Paper End

S5

12

Input

+Select In

S4

13

Input

-Auto Feed

¬C1

14

Output

-Error

S3

15

Input

-Initialize

C2

16

Output

-Select

¬C3

17

Output

Ground

-

18-25

Ground

电路

下面的电路图说明了我们的电路如何工作:

下面的图片是从不同角度拍摄的,说明了最终完成电路的样子:

     

我们再来看看到底都需要一些什么:

l         1-2米的并口电缆(3米也是可以的,不过这样电压将降低到4.7V)

l         9芯的电缆(8根用于连接二极管,1根用于接地)

l         一个电路实验板(图中白色的东西)

l         8个发光二极管

l         万用表(不是必要)

l         我的程序, 使得你的电路可以工作J

这里省略了原著中关于数制转换的介绍, 相信能看这篇文章的这都是小意思.

编码

在编码之前, 你应该先确定一下你的OS. 如果你使用Win98, 你可以通过”outputb”函数访问端口. 当你升级到Win2000后, 使用这个函数就不行了.在WinNT, Win2K, WinXP下是不能直接访问端口的. 在我的程序中使用inpout32.dll来访问端口, 在这个地址有这个Dll的源代码.

注意: 我是使用这个地址(http:/www.logix4u.net )的应用信息来导入函数的, 你访问的时候这个信息可能已经更新了.

在我的PortInterop.cs文件中, 我如下使用这个DLL

using System;
using System.Runtime.InteropServices;
 
public class PortAccess
{
    [DllImport("inpout32.dll", EntryPoint="Out32")]
    public static extern void Output(int adress, int value);
}

这个函数携带2个参数,一个是地址,一个是数据. 如果向LPT1发送数据, 那么就设置地址参数为888(16进制为0x378), 如果是LPT2, 那么就是0x278, 比如:

PortAccess.Output(, ); 

发送空数据就是这样:

PortAccess.Output(, ); 

呵呵, 如果是使用TruboC++就是这样:

#include <conio.h>
#include <dos.h> // For _out
#define port 0x378 // Port Address
#define data port+0 // Data Port of the parallel cable
void main (void)
{
  _out(data, ); // For all lights on
  _out(data, ); // For all lights off
}

简单的使用C#操作端口就是这样了, 如果你发挥你的想象力, 可以设计很多实用的电路, 你可以到其他一些电路方面的新闻组上去搜索一下, 相信你会找到更多的灵感, 比如你可以做个:

呵呵, 上面这幅图是我的下篇文章的创造, 先在这里卖个关子.

写在最后

译者(Aweay)是第一次翻译C#和硬件方面的文章, 如有什么地方翻译的不对还请指正,同时也欢迎您访问我的站点 http://siney.yeah.net.

用C#操作IO端口1-用并口控制发光二极管的更多相关文章

  1. /sys/class/gpio 文件接口操作IO端口(s3c2440)

    http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的 ...

  2. io端口与io内存详解

    (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址 ...

  3. IO端口、IO内存、IO空间、内存空间的含义和联系

    1,IO空间:X86一个特有的空间,与内存空间独立的空间,同样利用IO空间可以操作数据,只不过是利用对应的IO端口操作函数,例如inb(), inbw(), inl(); outb(), outw() ...

  4. IO端口和IO内存的区别及分别使用的函数接口

    每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Po ...

  5. IO端口和IO内存的区别 转

      目录(?)[-] Linux系统对IO端口和IO内存的管理 一.I/O端口 二.IO内存 三.IO端口和IO内存的区分及联系 四.外设IO端口物理地址的编址方式 统一编址 独立编址 优缺点 五.L ...

  6. X86 IO端口和MMIO

    X86 IO端口和MMIO I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O).前者就是我们常说的I/O端口,它实际上的 ...

  7. linux中的 IO端口映射和IO内存映射

    参考自:http://blog.csdn.net/zyhorse2010/article/details/6590488 CPU地址空间 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬 ...

  8. Linux系统对IO端口和IO内存的管理

    引用:http://blog.csdn.net/ce123_zhouwei/article/details/7204458 一.I/O端口 端口(port)是接口电路中能被CPU直接访问的寄存器的地址 ...

  9. <摘录>io端口和io内存

    linux中的 IO端口映射和IO内存映射 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 ...

随机推荐

  1. z=sin(xy)

    看了<千年难题>,第一章是黎曼猜想.里面有两个我很感兴趣的问题:一是关于函数的图形表示方式,比如z=sin(xy)的图像,二是大数的因子分解方式. 专业的数学软件应该能够很容易的生成各种函 ...

  2. int('x', base)中的base参数

    >>> int('12', 16) 16表示'12'就是16进制数,int()要将这个16进制数转化成10进制.

  3. java sundry tips

    1.关于Arrays 记得binarySearch方法返回的int 类型的数值的含义.    If the array contains multiple elements with the spec ...

  4. BZOJ 2530 Poi2011 Party 【枚举】

    BZOJ 2530 Poi2011 Party Description Byteasar intends to throw up a party. Naturally, he would like i ...

  5. JS 区分单击双击

    var timeout =null; $("#Btn").on("click",function(){ clearTimeout(timeout);//停止单击 ...

  6. flask第七篇——URL与视图函数的映射

    有兴趣的朋友可以添加微信公众号:自动化测试实战 今天开始就要进入正题了.大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法: ...

  7. VS2013中添加现有窗体项

    假如要从另一项目中拷贝窗体到本项目中,例如FmMain窗体, 需要. 把FmMain.cs 和 FmMain.Designer.cs 和 FmMain .resx 三个文件复制到程序目录下, 在vs里 ...

  8. Android.mk用法详解

    一.Android.mk介绍 Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握 ...

  9. #define用法

    1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i<MAXTIME) { // } 编译器在处理 ...

  10. hadoop之 distcp(分布式拷贝)

    概述 distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具. 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成. 它把文件和目录的列表作为map任务的输入,每个任务会 ...