[C#] Parallel port input controleren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Ik ben bezig met het schrijven van een programma dat de status van een paar ingangen van de paralle port weer moet gaan geven. Daar is genoeg over te vinden dus op zich lukt het wel, het enige waar ik niet uit kom is hoe ik het best kan zorgen dat het programma steeds de input blijft checken. Dus dat zodra de input veranderd het programma dit door heeft.

Is hier iets van een event voor? Of moet ik gewoon een functie schrijven die een bepaalde tijd wacht en dan de input checkt en dit blijft herhalen?

Acties:
  • 0 Henk 'm!

Verwijderd

volgens mij is er niks voor, ik heb het toen ik het een keer moest doen, een timer gepakt.
ga je de inpout32.dll gebruiken ?

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Ik ga inderdaad inpout32.dll gebruiken, en dan nog een kort vraagje:

Waarom werkt dit niet?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            PortInterop PortInterop = new PortInterop();
        }

        public void testinput()
        {
            int test = PortInterop.Input(889);
            label1.Text = test.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            testinput();
        }



    }
}


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public class PortInterop
    {
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void Output(int address, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int Input(int address);
    }
}


als ik nu namelijk op de knop druk loopt het programma vast.

[ Voor 96% gewijzigd door huub8 op 18-12-2010 15:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

krijg je geen foutmelding te zien uiteindelijk ?

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Probeer eens het data-register (888) uit te lezen, in plaats van het status-register(889). Inp32() is een blocking-methode, wat inhoud dat het probeert uit te lezen net zolang totdat er een waarde beschikbaar is. Doordat je dit in dezelfde thread uitvoert als het tekenen van het scherm, lijkt het net of het programma vast loopt.

Verder is er geen event voor het 'veranderen van data'. Wat je wel kunt doen binnen het .NET-framework is een StreamReader gebruiken. Het voordeel hiervan is dat de asynchroon data kunt uitlezen met BeginRead(). Wanneer er data beschikbaar is, dan zal de streamreader je op de hoogte houden door de delegatie die je mee geeft aan te roepen. Het is alleen jammer dat ik dit niet kan verifiëren omdat ik geen printer poort meer heb.

C#:
1
new System.IO.FileStream(@"\\.\LPT1");

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
nou, het probleem is dat ik visual studio heb staan op een computer met vista, dus daar gaat het waarschijnlijk toch al niet op werken, maar als ik de .exe uitprobeer op een computer met xp en inpout32.dll dan krijg ik deze foutmelding:

er is een fout opgetreden in test.exe, onze excuses voor het ongemak etc.

(het programma loopt dus wel echt vast)

ik weet wel dat het hier al fout gaat:
int test = PortInterop.Input(889);
label1.Text = test.ToString();


edit: ook met 888 krijg ik een foutmelding

[ Voor 8% gewijzigd door huub8 op 18-12-2010 15:22 ]


Acties:
  • 0 Henk 'm!

Verwijderd

je maakt wel ff een pin van je poort laag welke je wil inlezen ?

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
nee, er hangt op dit moment niets aan de printerpoort, moet er perse iets op aangesloten zijn?

edit:
Het werkt nu wel!, ik had blijkbaar niet een goede versie van inpout32.dll want nadat ik degene van deze website erin heb gezet werkt het.

Echter snap ik niet helemaal hoe het met die streamreader manier werkt.

[ Voor 66% gewijzigd door huub8 op 18-12-2010 15:40 ]


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Om het begin van de StreamReader FileStream uit te kunnen leggen, kan ik het beste naar een unix/linux systeem verwijzen. Daar zou je een '/dev/lp0' bestand kunnen uitlezen en naar toe kunnen schrijven. Wanneer het bestand wordt uitgelezen dan ontvang je rouwe gegevens vanaf de lpt-poort. Bij het schrijven is dit andersom. Ook binnen Windows is zo'n systeem te vinden. Hier heten ze Physical Device Object Names (mag je weer vergeten). Je opent dus in feite een bestand/stream om daar vanaf te kunnen lezen en/of schrijven. Verder kun je er natuurlijk ook gewoon bestanden mee uitlezen. :)

De asynchrone communcatie wordt gestart met BeginRead(). Op dat moment begint een programma met het vullen van een array (hieronder _bytes) met de gegevens die zijn binnen gekomen. Op het moment dat er niet meer gegevens beschikbaar zijn, of de array zit geheel vol, dan zal er dus een delegatie worden aangeroepen (hieronder ReadIsDone) om aan te geven dat hij vol is. Hierna kun je de gegevens gaan vergelijken, of deze veranderd zijn of niet. Ondertussen loopt jouw programma door en heb je dus geen last van 'vastlopers'.

Het voordeel is dat je dus zelf geen timers hoeft bij te houden. Want hoevaak moet je de timer laten afgaan? De kans is groot dat je dan te veel gaat vergelijken, of dat je wat gegevens mist. Ik hoop dat het hierdoor duidelijker is geworden, ik neig zelf altijd naar de wat technischere kant te duiken, maar ik hoop dat je er iets aan hebt.

Even een voorbeeld uit het hoofd:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.IO;

public static class Program
{
    private static byte[] _bytes = new byte[128];  

    public static void Main()
    {
        FileStream fs = new FileStream(@"\\.\LPT1");
        fs.BeginRead(_bytes, 0, _bytes.Length, ReadIsDone, fs);
    }

    private static void ReadIsDone(IAsyncResult ar)
    {
        FileStream fs = (FileStream)ar.AsyncState;  
        Int32 bytesRead = fs.EndRead(ar);
        
        if( bytesRead > 0 )
        {
            // Er is data beschikbaar,
            // dus we moeten iets gaan doen met _bytes
            
            // En weer opnieuw beginnen te lezen
            fs.BeginRead(_bytes, 0, _bytes.Length, ReadIsDone, fs);
        }
    }
}

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Tja, en nu het statusregister uitlezen?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1