使用 Inpout32.dll 从并行端口读取






4.51/5 (62投票s)
使用信号端口而不是数据端口读取数据。
引言
这是一篇关于与并行端口接口的好教程,更重要的是关于从端口读取。我看到的其他文章只展示了如何向端口写入。
在我继续之前,我使用的并行端口是 ECP (<!--?xml:namespace prefix = st1 /-->
扩展能力端口)。找出您的端口是否与我的相同,您的可能是 EPP 或 SPP。
转到“控制面板 / 系统 / 硬件选项卡 / 设备管理器 / 端口 (COM 和 LPT) / 打印机端口 (LPT1 或 LPT2) /”
它应该会显示您拥有哪种类型。您也可以转到“资源”选项卡来查看您端口的范围:我的 I/O 范围是 0378 – 037F,忽略其他 I/O 范围。
对于 ECP,如果我将数据端口用作输入和输出,则会有一些额外的开销。相反,我使用信号端口进行数据处理。
如果由于任何奇怪的原因您不理解本教程,请参阅页面底部的说明。或只在下方留下评论。
请注意,有关 inpout.dll 的所有信息均在 http://www.logix4u.net/。
请投票,以便我能了解是否值得我花时间更新。
测试
如前所述,我使用 DMM 测试了端口(尚未连接任何设备到端口),并使用了 inpout32.dll 中的读取函数,即 In(端口地址),我特定的端口地址是
- [数据端口] 地址:0x378H 或在 VB Express 中为 &H378S
- [状态端口] 地址:0x379H 或在 VB Express 中为 &H379S
- [控制端口] 地址:0x37AH 或在 VB Express 中为 &H37AS
*请注意,这些端口地址是以十六进制表示的
数据引脚 | 状态引脚 | 控制引脚 |
引脚 9:D7 | 引脚 10:S6 | 引脚 1:C0 |
引脚 8:D6 | 引脚 11:S7 | 引脚 14:C1 |
引脚 7:D5 | 引脚 12:S5 | 引脚 16:C2 |
引脚 6:D4 | 引脚 13:S4 | 引脚 17:C3 |
引脚 5:D3 | 引脚 15:S3 | |
引脚 4:D2 | ||
引脚 3:D1 | ||
引脚 2:D0 |
教程 #1
请注意,这是在 VB 2005 Express Edition 中完成的。
- 第 1 个教程:向“数据”端口写入并读取我们写入的内容。
- 第 2 个教程:从“状态”端口外部读取。
步骤 1
基本上;下载 input32.dll 文件后,将其复制到您的系统目录,即 C:\WINDOWS\system32。
第二步
然后在 VB 中;打开一个新文件。
步骤 3
在文本框中,为该项目输入一个名称。我称我的项目为“Port_Testing
”
步骤 4
将一个按钮“拖”到您的窗体窗口,然后“双击”该按钮。
步骤 5
进入代码编辑器后,在代码开头这样声明:
Option Strict Off
Option Explicit On
Module InpOut32_Declarations
'Inp and Out declarations for port I/O using inpout32.dll.
Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Short) As Short
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" _
(ByVal PortAddress As Short, ByVal Value As Short)
End Module
步骤 6
滚动到 Button1
的“事件处理程序”。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
End Sub
End Class
步骤 7
现在,在事件处理程序代码中,编写以下三行代码:
Out(&H378S, &HFFS) 'Print '1' to D7-D0 or 255 in Decimal
Dim Value1 As String 'String named Value1
Value1 = Inp(&H378S) 'Now Value1 has the values in 'data port'
MessageBox.Show(Value1) 'A popup will indicate the current value written
步骤 8
运行它!!!使用“F5 键”或转到“调试/开始调试”。
这是我们辛勤工作的成果!255 应该会出现在 messagebox
中。如果没有,说明您搞砸了。请回头重复。要查看不同的结果,您也可以通过在“Out(&H378S, [十六进制代码:仅限 &H0S 到 &HFFS ])
”中写入任何其他十六进制数来修改代码。*请注意,范围是 0(零)到 FF 十六进制,而不是 O。
教程 #2
步骤 1
如果您还没有完成教程 #1,并且您是新手,我建议您向上滚动。
第二步
转到“设计选项卡”并将另一个按钮拖到窗体窗口。
步骤 3
接下来,双击它,然后在 Button2
的“eventhandler
”中添加以下代码。
Dim Value2 As String 'String named Value2
Value2 = Inp(&H379S) 'Now Value2 has the values in 'signal port'
MessageBox.Show(Value2) 'A popup will indicate the current value written
步骤 4
运行它!!!按 F5 或转到调试/开始调试。
步骤 5
点击 Button2
并观察弹出窗口。它应该显示 120 十进制。
解释
什么是十六进制、二进制、十进制?
它们是不同基数的数字表示
- 十六进制 = 十六进制数(基数 16)
- 二进制 = 二进制数(基数 2)
- 十进制 = 十进制数(基数 10)
我们最熟悉的是基数 10,因为我们用十进制计数,但是计算机只熟悉基数 2;即 1 和 0,或“开”和“关”。我不会对此做更多阐述。要更改基数,只需使用 Microsoft Calculator(已内置)。只需记住将其从“标准视图”更改为“科学视图”。输入数字,然后只需单击您希望看到的数字的基数表示。
使用状态端口?
在教程 #1 中;我们看到了 MessageBox
弹出窗口显示值为 255
。您可能会问自己,为什么是这样。首先,傻瓜!我们向它写入了 255 十进制或 FF 十六进制,当然,我们可以写入任何其他值(0 - FF)。
在教程 #2 中;我们看到了 MessageBox
弹出窗口显示值为 120。同样,您可能会问自己,为什么是这样。答案并不像您想的那么明显。您可能认为值应该是“0
”,因为我们没有向它写入任何东西,并且还没有将任何东西连接到我们的并行端口。答案是信号端口的位 7 (S7) 是反相的!(啊啊啊)并且 S7 - S3 总是高电平有效。(是的!)
- S7' = 1' = 0
- S6 = 1
- S5 = 1
- S4 = 1
- S3 = 1
- S2 = 0
- S1 = 0
- S0 = 0
- 01111000bin = 120dec
那么您可能会问自己,我们如何使用状态端口!!!
只需将您的任何状态引脚(任何红色引脚)连接到接地(任何绿色引脚),然后再次运行我的程序时,您应该会看到一个值发生变化。
您看,在状态线上;引脚是“高电平”,即 5V。为了使它们能够读取,您必须将状态引脚接地。(哦!哦!哦!)
示例
示例 1
状态引脚未连接
结果应为:120
S7 | S6 | S5 | S4 | S3 | S2 | S1 | S0 |
0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
示例 2
状态端口 (S7),引脚 11 已接地
结果应为:248
S7 | S6 | S5 | S4 | S3 | S2 | S1 | S0 |
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
示例 3
状态端口 (S5),引脚 12,已接地
结果应为:88
S7 | S6 | S5 | S4 | S3 | S2 | S1 | S0 |
0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
评论与源代码
就这样!我知道这很长,但我希望它能有所帮助。如果您需要代码,我很乐意分享。不过,它是用 VB Express 写的。