Click here to Skip to main content
15,445,757 members
Articles / Programming Languages / XML
Posted 1 Aug 2006


83 bookmarked

Reading from Parallel Port using Inpout32.dll

Rate me:
Please Sign up or sign in to vote.
4.51/5 (64 votes)
8 Aug 2006CPOL6 min read
Using the Signal Port to read in data instead of Data Port


This is a good tutorial about interfacing with the parallel port; more importantly reading from the port. Other articles I've seen only show how to write to the port.

Before I get ahead of myself, the parallel port I used is an ECP (<!--?xml:namespace prefix = st1 /-->Extended Capability Port). Find out if your port is the same as mine, yours could be an EPP or SPP.

Go to “Control Panel / System / Hardware Tab / Device Manager / Ports (Com & LPT) / Printer Port (LPT1 or LPT2) /

It should indicate what type you have. You can also go to the ‘Resource’ Tab to indicate the range of your port: mine is I/O Range 0378 – 037F, ignore the other I/O range.

For the ECP, there are some over headers if I was to use the data port as both input and output. Instead, I used the signal port for data processing.

If by any odd reason you don't understand the tutorial, please refer to the explanation towards the bottom of the page. Or just leave a comment below.

Note that all information regarding the inpout.dll is on

Please vote so I can get an indication whether it's worth my time to update.


As mentioned before, I used a DMM to test out the ports (nothing connected to the ports yet) and I used the read function from the inpout32.dll, i.e., In(Port Address), my particular port address was:

  • [Data Port] Address: 0x378H or in VB Express &H378S
  • [Status Port] Address: 0x379H or in VB Express &H379S
  • [Control Port] Address: 0x37AH or in VB Express &H37AS

*note these port address are in HEX

Data Pins Status Pins Control Pins
Pin 9: D7 Pin 10: S6 Pin 1 : C0
Pin 8: D6 Pin 11: S7 Pin 14: C1
Pin 7: D5 Pin 12: S5 Pin 16: C2
Pin 6: D4 Pin 13: S4 Pin 17: C3
Pin 5: D3 Pin 15: S3
Pin 4: D2    
Pin 3: D1    
Pin 2: D0    

Tutorial #1

Note that this was done in VB 2005 Express Edition.

  • The 1st Tutorial: Writing to the 'data' port and reading what we wrote on it.
  • The 2nd Tutorial: Reading from the 'status' port externally.

Step 1

Basically; once you download the input32.dll file, copy it to your system directory, i.e., C:\WINDOWS\system32.

Step 2

Then in VB; open a New File.

Image 1

Step 3

In the text box, write a name for this project. I called my 'Port_Testing':

Image 2

Step 4

"Drag" a button to your form window and then "Double Click" on the button.

Image 3

Step 5

Once you are in the code editor, declare this as follows at the beginning of your code:

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

Step 6

Scroll down to the 'event handler,' of 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

Step 7

Now within the event handler code, write the following three lines of code:

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

Image 4

Step 8

Run It!!! Using 'F5 Key' or going to 'Debug/Start Debugging.'

Image 5

Here is the result of our hard earned work! 255 should appear on the messagebox. If not, you screwed up. Go back and repeat. To see different results, you can also modify the code by writing in any other number in hex within the 'Out(&H378S, [HEX CODE: Only from &H0S to &HFFS ]).' *Note that the range is 0 (zero) to FF hex & not O.

Tutorial #2

Step 1

If you haven't gone through Tutorial #1 and you are a novice, I suggest that you should scroll up.

Step 2

Go to the 'Design Tab' and drag another button to the form window.

Step 3

Next, double click on it and then add the following code in the 'eventhandler' for Button2.

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

Image 6

Step 4

Run It!!! Press F5 or go to Debug/Start Debugging.

Step 5

Click on Button2 and watch for the popup window. It should read 120 Decimal.


What are Hex, Bin, Dec?

They are representations of numbers at different bases:

  • Hex = Hexidecimal Numbers (Base 16)
  • Bin = Binary Numbers (Base 2)
  • Dec = Decimal Numbers (Base 10)

We are most familiar with base 10 since we count in decimal, however computers are only familiar with base 2; i.e., 1's and 0's or 'on' and 'off.' I'm not going to elaborate more than this. To change between bases, simply use Microsoft Calculator that is already built in. Just remember to change it from the 'Standard View' to the 'Scientific View.' Write in the numbers and then simply click on what base you would like to see the number represented in.

Using the Status Port?

In Tutorial #1; we saw the MessageBox popup window showing a value of 255. You might ask yourself, why is that. First of all, DUH! We wrote 255 Decimal or FF Hex to it and of course, we can write anything else (0 - FF).

In Tutorial #2; we saw the MessageBox popup window showing a value of 120. Again, you might as yourself, why is that. The answer is not as obvious. You might think the value should be '0' since we wrote nothing to it & we didn't connect anything to our parallel port yet. The answer is that Bit 7 (S7) of the signal port is inverted! (Ahhhhh) and S7 - S3 are always high enable. (Yes!)

  • S7' = 1' = 0
  • S6 = 1
  • S5 = 1
  • S4 = 1
  • S3 = 1
  • S2 = 0
  • S1 = 0
  • S0 = 0
  • 01111000bin = 120dec

So you might ask yourself, how do we use the status port!!!

Just tie any of your status pins (any red pin) to ground (any green pins) and you should see a value change when you run my program again.

You see, on the status line; the pins are 'high', i.e., 5V. To enable them for reading purposes, you'll have to ground your status pins. (OOOOOHHH!!!)


Example 1

Nothing Connected to Status Pins

The result should be: 120

S7 S6 S5 S4 S3 S2 S1 S0
0 1 1 1 1 0 0 0
Example 2

Status Port (S7), pin 11 is grounded

The result should be: 248

S7 S6 S5 S4 S3 S2 S1 S0
1 1 1 1 1 0 0 0
Example 3

Status Port (S5), pin 12, is grounded

The result should be: 88

S7 S6 S5 S4 S3 S2 S1 S0
0 1 0 1 1 0 0 0

Comments & Source Code

There you go! I know this was very long, but I hope it helps. If you need the code, I’ll be happy to share. It’s in VB Express although.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

QuestionThe program shows an Error Pin
Member 107215583-Apr-14 20:47
MemberMember 107215583-Apr-14 20:47 
QuestionCoding Problem Pin
Member 107215583-Apr-14 3:16
MemberMember 107215583-Apr-14 3:16 
QuestionStatus Pin Problem Pin
AYYANZ1113-Jan-13 23:25
MemberAYYANZ1113-Jan-13 23:25 
Questionexception in input and output commands Pin
laiza ramal1-Oct-12 8:22
Memberlaiza ramal1-Oct-12 8:22 
GeneralWorking or not depending on PC Pin
lukeer12-Jul-12 20:16
Memberlukeer12-Jul-12 20:16 
GeneralRe: Working or not depending on PC Pin
lukeer16-Jul-12 21:53
Memberlukeer16-Jul-12 21:53 
Questionreading from p Pin
Jembatan24-Jan-12 2:11
MemberJembatan24-Jan-12 2:11 
GeneralMy vote of 5 Pin
biondi_roma9-Nov-11 19:33
Memberbiondi_roma9-Nov-11 19:33 
QuestionProblem with result Pin
kamrul102-Oct-11 3:14
Memberkamrul102-Oct-11 3:14 
AnswerRe: Problem with result Pin
lukeer12-Jul-12 20:04
Memberlukeer12-Jul-12 20:04 
GeneralRe: Problem with result Pin
mustafa98212-Jun-13 13:01
Membermustafa98212-Jun-13 13:01 
GeneralRe: Problem with result Pin
lukeer12-Jun-13 23:02
Memberlukeer12-Jun-13 23:02 
GeneralRe: Problem with result Pin
mustafa98213-Jun-13 1:29
Membermustafa98213-Jun-13 1:29 
GeneralRe: Problem with result Pin
lukeer13-Jun-13 19:22
Memberlukeer13-Jun-13 19:22 
GeneralRe: Problem with result Pin
mustafa98214-Jun-13 10:19
Membermustafa98214-Jun-13 10:19 
GeneralRe: Problem with result Pin
lukeer16-Jun-13 19:46
Memberlukeer16-Jun-13 19:46 
QuestionParallel Port Problem Need Urgent Help Pin
Saddam Khan20-Sep-11 17:33
MemberSaddam Khan20-Sep-11 17:33 
QuestionPort Address Pin
PinkPurple3-Sep-11 5:41
MemberPinkPurple3-Sep-11 5:41 
GeneralHow to set parallel port in VB6 programming? Pin
saathis26-Apr-11 23:53
Membersaathis26-Apr-11 23:53 
GeneralHow to set parallel port in VB programming? Pin
saathis26-Apr-11 23:53
Membersaathis26-Apr-11 23:53 
GeneralThanks! Pin
C1sc03-Sep-10 13:56
MemberC1sc03-Sep-10 13:56 
GeneralMy vote of 3 Pin
gotohellda4-Jul-10 23:11
Membergotohellda4-Jul-10 23:11 
GeneralThanx Pin
Khalido8r27-Apr-10 21:22
MemberKhalido8r27-Apr-10 21:22 
NewsParallel Port Digital Oszilloscope and Logic Analyzer Pin
Elmue24-Apr-10 3:49
MemberElmue24-Apr-10 3:49 

If you came to this article from Google because you are looking for a way to measure digital signals via parallel port then have a look at the following article:
17 Channel Logic Analyzer!

* Digital Oscilloscope / Logic Analyzer with up to 17 input lines
* Uses the parallel (printer) port for input.
* While Logic Analyzers normally are very expensive, this one is for zero cost
* Written in speed optimized C++ to get the maximum possible sample rates
* The program is a stand alone single EXE file which neither needs any additional DLLs nor any framework. It runs out of the box
* Runs on all Windows platforms (95, 98, ME, NT, 2000, XP, 2003, Vista, 2008, Windows 7, 2008 R2)
* Runs on 32 Bit Windows and 64 Bit Windows
* When first run, installs a driver to access hardware IO ports on all NT platforms
* Plays a sound via PC speaker to prove that the driver works correctly
* Shows the actual state of the input lines life in the LED's of the GUI
* Captures up to 500.000 samples / second (depending on your hardware and OS)
* Captures to memory (rather than disk) for maximum speed
* Capturing runs always with the maximum frequency that the hardware allows
* Memory saving capture technology stores only the changes of the input lines rather than storing all lines with each sample that is taken
* The capture process is independent of data analyzing so you can try various settings to display the captured data in the best way
* The analyzer generates coloured oscilloscope diagrams with a raster grid
* The output is written into an HTML file and one or multiple GIF files
* So the analyzer results can easily be shared with other people who must not install any program to view a proprietary binary format
* You can write an individual heading into each analyzer output to distinguish them later in a multitude of files
* When analyzing data, you can choose to delete old analyzer output or keep the old files
* The time axis shows absolute or relative time with microsecond precision (Performance Counter)
* Automatic detection of inactive input lines shows only the channels that have activity
* Automatic detection of idle time cuts out long phases of inactivity
* Automatic detection of input frequency chooses the adequate raster unit like on a real oscilloscope (10 µs, 20 µs, 25 µs, 50 µs, 100 µs, etc..)
* Automatic detection of context switches of the operating system
* Decoding of serial protocols like I2C Bus, PS/2 Bus, SMBus, ModBus, SPI Bus, Asynchronous (RS232, RS422, RS485), Infrared Remote Controls, Smartcards is partially already implemented or may be added by you.
* Decoded serial data (Start Bit, Parity, Acknowledge, Stop Bit) and the Byte that they represent is written into the diagram
* Very cleanly written source code with a proper error handling and plenty of comments

QuestionReading port status change event Pin
sairfan113-Dec-09 3:58
Membersairfan113-Dec-09 3:58 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.