Avatar billede tje Nybegynder
28. juli 2003 - 19:44 Der er 8 kommentarer

Parallel port via API el. lign

Jeg er træt af at bruge andres dll'er og lign. til at kommunikere med parallel porten i win2K og XP.

Jeg vil gerne lave min egen kode, men jeg kender ikke helt en ordenligt fremgangsmåde.Jeg har derfor flg. spørgsmål...

Er det muligt at skrive til parallel porten via API'en ?
eller er det ikke en hensigtsmæssig metode?

Er det muligt at "sætte" de enkelte data- og kontrolsignaler på porten?

Hvis nogen kender en smartere måde at gøre det på, er det også en mulighed!
Avatar billede driis Nybegynder
28. juli 2003 - 19:47 #1
Der er ikke nogen direkte metoder/funktioner i API'en, som du kan bruge. Men det kan godt laves, selvom det godt kan være en stor mundfuld. Jeg så fornylig en side, der behandlede emnet ... 2 sekunder.
Avatar billede driis Nybegynder
28. juli 2003 - 19:53 #2
Du kan starte med at kigge her:
http://www.beyondlogic.org/porttalk/porttalk.htm

Lad dig ikke narre af overskriften, teksten beskriver også hvorfor du ikke kan tilgå porten direkte, og hvordan man gør for at få lov til det.
Avatar billede soreno Praktikant
28. juli 2003 - 20:02 #3
Kan man mon ikke bruge CreateFile:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp

til lpt access ?

(Man kan til seriel porten)
Avatar billede driis Nybegynder
28. juli 2003 - 20:15 #4
Om man kan bruge CreateFile ved jeg ikke - men så får man i hvert fald ikke mulighed for at sætte de enkelte kontrolsignaler selv.

tje>>
Fremgangsmåden må være noget lignende følgende:
1) Rediger i dit programs IO permission bitmap, så du får lov at skrive til parallelporten, typisk addresse 0x378. Dette er beskrevet i mit link under overskriften "Manipulating the IOPM (I/O Permission Bitmap)"

2) Brug en asm ( __asm for MS compilere ) blok til at skrive direkte til porten, ie.
__asm
{
  mov dx,0x378
  mov al,255
  out dx,al
}

Ovenstående blok ville så sætte alle datasignaler høje. Ved at skrive til basisadressen+2 kan du sætte kontrolsignalerne. De enkelte bits betydning er nærmere beskrevet her:
http://www.beyondlogic.org/spp/parallel.htm#5
Avatar billede tje Nybegynder
28. juli 2003 - 20:20 #5
jeg har været i gang med createfile, men kom i problemer da jeg, (1) ikke kunne bitmanipulere og (2) ikke vidste hvordan jeg kom videre fra createfile.

Er der nogen der har et kode eksempel på at ændre i IOPM?

Ellers tror jeg af driis's link er sagen...
Avatar billede tje Nybegynder
29. juli 2003 - 11:18 #6
Hvordan ændre jeg i IOPM, uden at skulle bruge andres drivere?
Avatar billede driis Nybegynder
29. juli 2003 - 11:42 #7
Du skal have fat i NT DDK, eller XP DDK ( driver development kit ), således at du kan benytte de funktioner, der er beskrevet på beyondlogic.org - jeg ved ikke om du kan skaffe de nødvendige, evt. alternative, libraries og headers andre steder - men efter en hurtig søgning på Google ser det ud til, at du skal have fat i Microsoft for at få den. XP DDK kan ikke downloades på MS side, men bestilles gratis på CD - dog tager de 25$ for at sende den til DK.

Når du så er klar med de rigtige libraries og headers, må fremgangsmåden være noget lig flg. : (sådan som jeg læser http://www.beyondlogic.org/porttalk/porttalk.htm ) :
1) Brug PsGetCurrentProcess til at få fat på dit programs proces ID
2) Brug PsLookupProcessByProcessId til at lave proces ID'et om til en pointer til en proces.
3) Læs IOPM med
  void Ke386QueryIoAccessMap(int, IOPM *);
4) Sæt den rigtige bit til 0 i det modtagne IOPM
5) Skriv ny IOPM med
  void Ke386QueryIoAccessMap(int, IOPM *);
6) Definér at din proces skal bruge det netop skrevne IOPM med
  void Ke386IoSetAccessProcess(PEPROCESS, int);
7) Du kan nu skrive til porten, brug evt. noget lignende trin 2 fra mit forrige svar. (dvs. du får ikke Priviledged Instruction Exception når du udfører 'out dx,al')
8) Sæt evt. IOPM tilbage til det oprindelige før du afslutter dit program - det burde dog ikke være nødvendigt, da hver proces har sit eget IOPM.
Avatar billede driis Nybegynder
29. juli 2003 - 11:45 #8
Husk at de funktioner der begynder med Ke386... er udokumenterede funktioner, derfor skal du huske at have en funktionsprototype til disse funktioner i din egen kode.

Jeg kan anbefale dig at downloade PortTalk kildekoden, selvom det måske kan være lidt avanceret at kigge på, giver det et godt fingerpeg om hvad du skal gøre, og ikke mindst, hvordan de udokumenterede funktioner bruges.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester