[C#] Paralelle Poort aanspreken in Windows 7 x64

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-09 20:40
Als bezigheidstherapie voor de vakantie ben ik bezig met een klein projectje waarin ik de parallele poort van mijn pc wil gebruiken (soort input relais maken). Omdat dit project al een hele tijd loopt heb ik er al een aantal maanden over gedaan om het een en ander in elkaar te schroeven.

Tot voor kort werkte het uitlezen van de Parallele poort onder Windows XP en Vista prima (32bit).
Dit via het volgende stuk code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace ParPortTest
{
    public abstract class ParallelPort
    {
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        private static extern int Input(int adress);

        public static void WaitForChange(int adress)
        {
            int initialState = ParallelPort.Input(adress);
            while (true)
            {
                if (initialState != ParallelPort.Input(adress))
                    break;
                Thread.Sleep(20);
            }
        }
    }
}


Nu heb ik op mijn eigen systeem Windows 7 x64 staan (RC versie) en daar krijg ik het met geen mogelijkheid aan de praat.

Allereerst heb ik meerdere 64 bits driver versies geprobeerd voor de poort, maar ik krijg maar geen response.
Voor het testen sluit ik gewoon een status poort kort met een stukje ijzer.
Later zal dit gebeuren door een relais, en weet ik dus in de code dat het relais omgeschakeld is.
Alleen onder Windows 7 veranderd er helemaal niets... Welke pins ik ook kortsluit...
Het programma in user- of admin-mode uitvoeren maakt geen verschil.

Iemand nog ideeen?

PS: Ik gebruik C# icm Visual Studio 2008, ik ontwikkel op Windows 7 x64, het moet uiteindelijk gaan draaien onder Windows 2003 x64

Even niets...


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
Meeste van die "gooi de IO map maar open" drivers/dll's zijn gebouwd op basis van ongedocumenteerde kernel functies. Je hebt dus kans dat MS die er nu uit heeft gesmeten.

Hier http://www.highrez.co.uk/Downloads/InpOut32/default.htm staat een verhaal van iemand die het kennelijk kan draaien op Windows 2003 x64. Windows 7 wordt niet genoemd trouwens.

Hier http://openlibsys.org/ staat ook nog iets

[ Voor 40% gewijzigd door farlane op 01-07-2009 22:54 ]

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.


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
Interessant, ik loop hier ook tegen aan te hikken (ik maak het in visual basic).
Op logix4u.net staat een 64-bits driver die misschien wel eens zou kunnen werken.

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-09 20:40
farlane schreef op woensdag 01 juli 2009 @ 22:35:
Meeste van die "gooi de IO map maar open" drivers/dll's zijn gebouwd op basis van ongedocumenteerde kernel functies. Je hebt dus kans dat MS die er nu uit heeft gesmeten.

Hier http://www.highrez.co.uk/Downloads/InpOut32/default.htm staat een verhaal van iemand die het kennelijk kan draaien op Windows 2003 x64. Windows 7 wordt niet genoemd trouwens.

Hier http://openlibsys.org/ staat ook nog iets
Heb ik geprobeerd, die werkt dus niet...
3V3RT schreef op woensdag 01 juli 2009 @ 22:38:
Interessant, ik loop hier ook tegen aan te hikken (ik maak het in visual basic).
Op logix4u.net staat een 64-bits driver die misschien wel eens zou kunnen werken.
Je bedoelt de WinRing0 library?
Die bezit niet de functionaliteit om pins uit te lezen (alleen complete DWORD's)
Dus of ik snap het concept van een DWORD niet, of het gaat niet werken, omdat ik normaal gesproken een int waarde terug krijg waaraan je kan uitvissen welk pinnetje er kortgesloten is.

In mijn geval is het niet belangrijk wat voor data eroverheen gaat (het is toch alleen maar een relais)
Ik wil alleen maar weten OF het pinnetje om is.

WinRing heb ik geprobeerd.

EDIT: Ik zie dat je de InpOutx64 library bedoelt, die heb ik ook geprobeerd, en geen resultaat.

[ Voor 27% gewijzigd door FireDrunk op 01-07-2009 23:17 ]

Even niets...


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
thijs_cramer schreef op woensdag 01 juli 2009 @ 23:15:
Heb ik geprobeerd, die werkt dus niet...
Je hebt ze beiden geprobeerd? Als ik de Winring0 mag geloven draait het ook op Windows 7.
Die bezit niet de functionaliteit om pins uit te lezen (alleen complete DWORD's)
Dus of ik snap het concept van een DWORD niet, of het gaat niet werken, omdat ik normaal gesproken een int waarde terug krijg waaraan je kan uitvissen welk pinnetje er kortgesloten is.
De status van de pinnen staat in een register die je kunt uitlezen in een DWORD. Als je niet weet hoe je hier bit/pin x uit kunt halen is het misschien handig om wat door te lezen over bitmasking.

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.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-09 20:40
farlane schreef op woensdag 01 juli 2009 @ 23:28:
[...]

Je hebt ze beiden geprobeerd? Als ik de Winring0 mag geloven draait het ook op Windows 7.


[...]

De status van de pinnen staat in een register die je kunt uitlezen in een DWORD. Als je niet weet hoe je hier bit/pin x uit kunt halen is het misschien handig om wat door te lezen over bitmasking.
Ik heb vanalles geprobeerd, maar krijg het niet aan de gang.
Dit is wat ik nu heb:


ParallelPort.cs
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
using System;
using System.Runtime.InteropServices;
using System.Threading;
using OpenLibSys;

namespace ParPortTest
{
    public abstract class ParallelPort
    {
        public static int Input(ushort address)
        {
            return new Ols().ReadIoPortByte(address);
        }
        
        public static void WaitForChange(ushort adress)
        {
            Ols ols = new Ols();
            int initialState = ols.ReadIoPortByte(adress);
            while (true)
            {
                if (initialState != ols.ReadIoPortByte(adress))
                    break;
                Thread.Sleep(20);
            }
        }
    }
}


Program.cs
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.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ParPortTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                while (true)
                {
                    Console.WriteLine("State: " + ParallelPort.Input(888));
                    Thread.Sleep(200);
                }
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
                Console.ReadLine();
            }
        }
    }
}


Voor de adres waardes heb ik vanalles geprobeerd (888, 0x379, 379) maar geen van alles geef resultaat.

De output is steeds of 255, of 0.
Ook heb ik even de multimeter gepakt om mijn kabel door te meten, maar die is goed...

Weet iemand misschien een andere pinviewer die op x64 moet werken?

[ Voor 4% gewijzigd door FireDrunk op 01-07-2009 23:57 ]

Even niets...


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
thijs_cramer schreef op woensdag 01 juli 2009 @ 23:55:
Voor de adres waardes heb ik vanalles geprobeerd (888, 0x379, 379) maar geen van alles geef resultaat.
You may be doubtful about the command line parameters passed to the program. Here 888(0x378) is the address of the parallel port data register and 255 is the data to be written to parallel port data register. if you enter "partest1 read 888" to command line , the program will read parallel port data register and display it. This will blindly read the contents of parallel port data register , but not the data present on data lines. To read the data from the data lines , we will have to enable the bidirectional data transfer first. To enable Bidirectional data transfer just set the "Bidirectional" bit (bit 5) in control register. This is done by writing 32 to control register. The command "partest1 write 890 32" will do this. After entering this command you can read the status of switches in the hardware using the command "partest1 read 888"
Geripped van http://logix4u.net/Legacy...lel_port_Interfacing.html

[ Voor 4% gewijzigd door farlane op 02-07-2009 09:01 ]

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.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 18-09 20:40
Het werkt!!! Geniaal!

Nog even de code die het oploste:

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
using System;
using System.Runtime.InteropServices;
using System.Threading;
using OpenLibSys;

namespace ParPortTest
{
    public abstract class ParallelPort
    {        
        public static void WaitForChange()
        {
            ushort base_address = 889;
            Ols ols = new Ols();
            int initialState = ols.ReadIoPortByte(base_address);
            ols.WriteIoPortByte(890, 32);
            while (true)
            {
                if (initialState != ols.ReadIoPortByte(base_address))
                    break;
                Thread.Sleep(20);
            }
        }
    }
}

[ Voor 9% gewijzigd door FireDrunk op 08-07-2009 21:15 ]

Even niets...

Pagina: 1