Parallelle Poort Aansturen Met Visual Basic 1. Waarom? (Voor Beginners) Er zijn geregeld vragen over hoe je nu eigenlijk een parallelle poort moet aansturen. Op het internet is heel wat te vinden, maar voor mensen die weinig of helemaal geen ervaring hebben met programmeren is dit niet altijd even duidelijk. Daarom dit artikel waarbij ik stap per stap en aan de hand van code en afbeeldingen zal proberen uit te leggen hoe je de parallelle poort van je pc kan aansturen. Hierbij wordt ervan uitgegaan dat je het programma zal gebruiken op een pc die gebruik maakt van een besturingssysteem dat gebaseerd is op Windows NT (2000,XP, Vista ) en dat je programmeert met Visual Basic. 2. Wat is een printerpoort? De printerpoort is dus een parallelle poort. Dit wil zeggen dat bij het sturen van een waarde naar de poort de datalijnen tegelijk (parallel) wijzigen. Nu heeft een parallelle poort acht datalijnen. Er zijn 8 dus 2 mogelijke uitgangen. Hieronder zijn in een schematische figuur alle pinnen van de poort genummerd weergegeven. Voor ons zijn de belangrijkste pinnen die met nummer twee tot en met negen oftewel de acht datalijnen. Figuur: Aansluitingen Parallelle Poort Pin-nummer Uitgang 2 D0 3 D1 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 18-25 Massa Zoals met de meeste onderdelen in een pc heeft ook de parallelle poort een adres. Dit is een belangrijk element zodat we gericht onze waarde ergens kunnen naar toe sturen. Hieronder zijn enkele adressen weergegeven. In de voorbeeldcode die verder volgt wordt er van uitgegaan dat men LPT1 probeert aan te sturen. Indien u toch een andere poort wenst aan te sturen dient u uiteraard het juiste adres te kiezen. Adressering LPT1 LPT2 LPT3 Data bereik &H378 &H278 &H3BC Status bereik &H379 &H279 Control bereik &H37A &H27A Echter valt op te merken dat we met de recentere versies van Windows (XP, Vista ) de poort niet meer rechtreeks kunnen aanspreken. Deze worden door het OS (Operating System) afgeschermd om te vermijden dat niet het hele besturingssysteem het noorden kwijt raakt bij een fout. Daarom moeten we gebruik maken van een driver (.dll-file) die ons toegang biedt tot de poort. Dries Rollez Pagina 1
3. Programmeren 3.1. Benodigdheden Voor we effectief kunnen beginnen met programmeren hebben we een tweetal dingen nodig. Eerst en vooral hebben we noodt aan een programma dat we gaan gebruiken om in te programmeren. Voor de mensen die nog geen Visual Basic hebben kunnen een gratis versie downloaden op de website van Microsoft. (http://www.microsoft.com/express/) Ten tweede hebben we ook nood aan een driver. Waarom we die nodig hebben kan u hierboven lezen. De benodigde.dll-file kan u downloaden op via de volgende link. (http://www.geekhideout.com/iodll.shtml) Wie graag een open source driver gebruikt die ook nog op Vista werkt kan hier een driver (http://logix4u.net/legacy_ports/parallel_port.html) downloaden. In onderstaande voorbeelden maak ik echter gebruik van de io.dll. Echter zal de code niet zoveel verschillen. Voor meer info verwijs ik naar de site zelf. Download het bestand io.dll en plaats het in de map C:/WINDOWS/system32 (of in C:/WinNT/system32). Plaats het bestand ook best in de debug map van uw project. Dit zal hieronder nogmaals worden aangehaald als het zover is! 3.2. Programmeren 3.2.1. Nieuw Project Zo nu de voorbereidingen getroffen zijn kunnen we effectief beginnen. Hiertoe openen we Visual Basic. Als het programma is opgestart moeten we eerst een nieuw project starten. (File > New Project ) Nu opent zich een scherm waar u kan kiezen welk project u wil starten. We kiezen voor Windows Application en Vullen onderaan bij Name de naam in van het programma. Uiteraard klikken we vervolgens op OK. Dries Rollez Pagina 2
3.2.2. Eerste Form Nu het nieuwe project is aangemaakt, laadt zich het hoofdscherm. Voor u ziet u normaal een lege Windows form. Zorg er verder ook voor dat u volgende toolbars open hebt staan. (View > Toolbars) Dit voor een vlotte manier van volgen. - Toolbox - Properties - Solution Explorer Nu staan kunnen we het codevenster openen. Dit kan op twee manieren. 1) Dubbelklikken op de windows form, 2) In de toolbar Solution Explorer Rechts klikken op Form1.vb en kiezen voor View Code. Als alles goed is ziet u nu de onderstaande code staan in het code venster. Public Class Form1 Private Sub Form1_Load( ) 'Alles wat u hier typt qua code zal uitgevoerd worden bij het laden(openen) van het programma. Om nu de naam van de form aan te passen diennen we de form te selecteren en in het menu Properties de eigenschap Name en Text aan te passen. Indien u dit volgens de hungarian notations doet kan hetvolgende bekomen worden. Name = frmlptprogramma Text = LPT Programma We merken op dat we voor ieder grafisch object we invoegen we telkens tal van eigenschappen kunnen aanpassen in het menu Properties. Het is aan de lezer om wat grafische elementen te plaatsen en zelf wat te experimenteren met deze eigenschappen. 3.2.3. Grafische User Interface (GUI) opbouwen Vervolgens kunnen we de grafische interface opbouwen. Hiertoe gaan we opnieuw naar het Design venster. Om het heel simpel te houden gaan we eerst proberen om één datalijn van de printerpoort aan te passen. Daartoe gaan we gebruik maken van één enkele drukknop. Indien u dit onder de knie hebt kan u naar hartenlust knoppen toevoegen om zo alle datalijnen te besturen. Dries Rollez Pagina 3
We voegen een drukknop in door in het Toolbox menu dubbel te klikken op Button. Er verschijnt een standaard button op de form. U kan nu deze button naar de gewenste positie slepen. Ook hier kunnen we, net als bij de form, de naam en de tekst aanpassen door de knop te selecteren en in het menu Properties de eigenschap Name en de eigenschap Text aan te passen. Bijvoorbeeld: Name = btndata0 Text = Data 0 Het tussenresultaat ziet er als volgt uit: 3.2.4. Module invoegen We kunnen nu beginnen met het schrijven van de zogenaamde module. Dit is een deel van het programma dat de link zal maken met de driver io.dll. Om de module aan te maken gaan we naar de Solution Explorer. Daar klikken we rechts op LPTProgramma en kiezen voor Add Module Dries Rollez Pagina 4
We kiezen uiteraard voor module, geven die een duidelijke naam (bijvoorbeeld io.vb) en kiezen Add. De module opent zich. Nu kunnen we in de module de code schrijven die de dll-file aanspreekt. Dit is onderstaande code. U kan deze voor het gemak kopiëren en plakken. Option Strict Off Option Explicit On Module io Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer) Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long) Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte Public Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean End Module In bovenstaand kader hebben we nu eigenlijk allemaal functies aangemaakt die we later kunnen oproepen om de status van de poort aan te passen. Een beschrijving van de functies vindt u op: http://www.geekhideout.com/iodll.shtml Nu kan je best ook de driver io.dll in de debug map van je project zetten. Open daartoe de map waarin je je project gezet hebt. Klik door naar bin en vervolgens debug.(mapproject>bin>debug) We kunnen voor de volledigheid de driver ook in voegen in VB. Om de driver toe te voegen gaan we naar de Solution Explorer. Daar klikken we rechts op LPTProgramma en kiezen voor Add Existing Item Dries Rollez Pagina 5
3.2.5. Coderen (Schrijven naar poort) Tenslotte kunnen we beginnen met het schrijven van de effectieve code voor het aansturen van de poort. Hiervoor gaan we eerst terug naar het tabblad Disign. Om nu het event of de gebeurtenis van het klikken op de button aan te duiden, gaan we dubbelklikken op deze button. Dan komen we in het Code venster terecht zoals hieronder te zien is. Public Class frmlptprogramma Private Sub Form1_Load( ) Handles MyBase.Load 'Alles wat u hier typt qua code zal uitgevoerd worden bij het laden(openen) van het programma. Private Sub btndata0_click( ) Handles btndata0.click We gaan nu de code uit de module aanroepen. Aanroepen doen we met Call en sturen van de poort met PortOut(adres,waarde). We schrijven hier nu dus via de functie PortOut een opgegeven waarde naar het opgegeven adres. Voor meer uitleg over het gebruikte adres verwijs ik naar hoger Wat is een printerpoort?. Voor meer over de waarde zie lager. Om nu bijvoorbeeld de eerste datalijn hoog (+5V) te maken sturen we waarde 1 naar de parallelle poort. Want deze decimale waarde omgezet naar een binair woord bekomen we 0000 0001. We krijgen nu onderstaande code in ons code venster. Public Class frmlptprogramma Private Sub Form1_Load( ) Handles MyBase.Load 'Alles wat u hier typt qua code zal uitgevoerd worden bij het laden(openen) van het programma. Private Sub btndata0_click( ) Handles btndata0.click Call PortOut(&H378, 1) Adres Waarde Dries Rollez Pagina 6
Om nu deze datalijn weer laag te maken, kunnen we een tweede drukknop in het leven roepen. Dit doen we op dezelfde manier als we deden bij de vorige drukknop. Echter moeten we hem wel een andere naam geven om fouten in het programma te vermijden. Nu moeten we echter de digitale waarde 0 naar de poort sturen. Dit levert aan de poort een binaire 0000 0000. Zo staan meteen alle datalijnen laag. De code wordt dan: Public Class frmlptprogramma Private Sub Form1_Load( ) Handles MyBase.Load 'Alles wat u hier typt qua code zal uitgevoerd worden bij het laden(openen) van het programma. Private Sub btndata0hoog_click( ) Handles btndata0hoog.click Call PortOut(&H378, 1) Private Sub btndata0laag_click( ) Handles btndata0laag.click Call PortOut(&H378, 0) Dries Rollez Pagina 7
Zo nu kan je al een datalijn hoog en laag maken. Indien u ook andere datalijnen wenst hoog of laag te maken dient u een andere waarde naar de parallelle poort te schrijven. Bijvoorbeeld: Waarde Binair Datalijnen hoog 16 0001 0000 D4 52 0011 0100 D2, D4, D5 100 0110 0100 D2, D5, D6 Het moge duidelijk zijn dat de maximale waarde om weg te schrijven naar de poort 255 is. Er zijn 8 namelijk 2 mogelijkheden en aangezien we vanaf 0 beginnen te tellen, is 255 de hoogste waarde. Zo zet u met waarde 0 alle datalijnen Laag en met 255 alle datalijnen hoog. 3.2.6. Coderen (Waarde aflezen) Zo, nu kunnen we een waarde wegschrijven naar de poort maar het kan ook handig zijn om de actuele waarde van de poort weer te geven aan de gebruiker van het programma. Hiertoe biedt de driver ons uiteraard ook een oplossing. We zullen de functie PortIn(adres) gebruiken. Hierbij zal de driver ons de huidige waarde teruggeven. Maar eerst en vooral gaan we op onze form een element plaatsen waar we de getalwaarde in kunnen plaatsen. Hiervoor biedt Visual Basic ons een aantal mogelijkheden: label, textbox Ik zal hier voor een label kiezen. Het werkt echter net hetzelfde met een textbox of een ander element. Het invoegen van een label gaat net hetzelfde als bij een button. Dubbelklikken op Label in het menu Toolbox. Het label verschijnt op de form en u kan het naar de gewenste positie slepen. Ook hier dienen we in het menu Properties de eigenschap Name en Text aanpassen. We kunnen bijvoorbeeld kiezen voor: Name = lblwaardelpt Text = leeg Public Class frmlptprogramma Private Sub Form1_Load( ) Handles MyBase.Load 'Alles wat u hier typt qua code zal uitgevoerd worden bij het laden(openen) van het programma. Private Sub btndata0_click( ) Handles btndata0hoog.click Call PortOut(&H378, 1) Private Sub btndata0laag_click( ) Handles btndata0laag.click 'Alles wat u hier typt qua co lblwaardelpt.text = PortIn(&H378) de zal uitgevoerd worden bij het klikken op de knop. Call PortOut(&H378, 0) lblwaardelpt.text = PortIn(&H378) Dries Rollez Pagina 8
Misschien wat uitleg over de bijgevoegde code. VB loopt het bij het geschreven coderegels af van boven naar onder. Dus zal de poort eerst hoog (of laag worden afhankelijk van welke knop) en daarna zal de coderegel met betrekking tot het label uitgevoerd worden. Bij het label zorgt de.- operator dat we eigenschap kunnen oproepen. Bij een label kunnen we de tekstwaarde aanpassen. Door deze tekstwaarde van het label gelijk te stellen aan de waarde die momenteel op de poort staat, wordt deze waarde in het label weergegeven. Zo kan de gebruiker via de GUI aflezen welke waarde er momenteel op zijn LPT Poort staat. Dries Rollez Pagina 9