Avatar billede heeeelpp Nybegynder
30. november 2003 - 20:49 Der er 3 kommentarer og
1 løsning

Parallelportens I/O-adr.

Hej!

Nogen der ved, hvordan man får parallelportens I/O adresse? Normalt er adressen 0x378, men denne adresse kan man jo ændre, hvis man vil.
Man kunne også forestille sig at der var to parallelporte i en computer, og i givet fald vil jeg gerne kende disse to I/O-adresser.
Oplysningerne ligge et eller andet sted i Windows, men hvordan får jeg lige fat i dem?
Avatar billede driis Nybegynder
01. december 2003 - 12:59 #1
BIOS sørger for at der er en tabel i hukommelsen over hvilke addresser der bliver brugt til LPT portene:
http://www.beyondlogic.org/spp/parallel.htm#4

I mit link findes C kode til at finde parallelportenes adresser:
void main(void)
{
unsigned int far *ptraddr;  /* Pointer to location of Port Addresses */
unsigned int address;      /* Address of Port */
int a;

ptraddr=(unsigned int far *)0x00000408;

for (a = 0; a < 3; a++)
  {
    address = *ptraddr;
    if (address == 0)
        printf("No port found for LPT%d \n",a+1);
    else
        printf("Address assigned to LPT%d is %Xh\n",a+1,address);
    *ptraddr++;
  }
}

Men bemærk at ovenstående ikke kan køre direkte under Windows. Windows tillader nemlig ikke et program at læse fra hukommelse, som det ikke selv ejer. Det kan dog omgås, enten ved at bruge 3. parts "driver" til det, eller selv kode det. ( og nummer 1 er klart det nemmeste ).
Avatar billede heeeelpp Nybegynder
02. december 2003 - 14:51 #2
Okay. Det er netop det jeg søgte... Men det skal dog køre under Windows... Har du lidt kode, der kører uden om Windows?
Avatar billede driis Nybegynder
02. december 2003 - 15:41 #3
Du skal bruge et bibliotek/kodestump/driver der tillader direkte hukommelsesadgang i Windows. Jeg fandt følgende, som dog ikke er gratis, kun til evaluation (ie. det er shareware):
http://www.zealsoftstudio.com/memaccess/index.html

Hvis du bruger det, virker følgende under Windows:
#include <stdio.h>
#include "memacc.h"

int main()
{
    maOpenLibrary();

    DWORD addr = 0x00000408;
    DWORD address[4];

    for ( int i = 0 ; i <= 3 ; i++ )
    {
        address[i] = maPeekW(addr);
        if ( address[i] )
            printf("LPT%i addresse er : %X\n",i+1,address[i]);
        else
            printf("LPT%i findes ikke paa denne maskine.\n",i+1);

        addr += 2;
    }

    maCloseLibrary();
    return 0;
}

Jeg har ikke været i stand til at finde et gratis bibliotek der kan udføre ovenstående, men det er ikke usandsynligt at det findes. Du kan evt. prøve at søge på Google eller lignende.
Det er også muligt, at portadressen står i registreringsdatabasen et eller andet sted, men jeg ved ikke hvor (hvis det overhovedet står der).
Avatar billede heeeelpp Nybegynder
03. december 2003 - 20:15 #4
Takker for hjælpen, det virkede! ;)
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