none
Lire port parallèle à travers un adaptateur carte PCI - port parallèle RRS feed

  • Discussion générale

  • Bonjour,

    J'ai un programme sous VS C++ 6 pour windows XP qui permet de lire un port parallèle branché à une pédale.

    Le problème est que le hardware de l'ordinateur a changé, il ne possède plus de port parallèle.

    J'ai donc utilisé une carte adaptateur mini PCI - port parallèle mais je n'arrive plus à communiquer à la pédale avec le programme.

    Voici le code utilisé :

    CReadParallelPort::CReadParallelPort()
    {
        lastValue = 0;
        hLib = LoadLibrary("inpout32.dll");
        inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
        oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
        (oup32)(0x37A,44); // Port configuré en entrée
    }
    
    CReadParallelPort::~CReadParallelPort()
    {
    	FreeLibrary(hLib);
    	LOGMSG("inpout32.dll freed");
    }
    
    short CReadParallelPort::Read()
    {
    	short value =(short) 255 - (inp32)(0x378);
    	if (value == 1)
    	{
    		value = 7;
    	}
    	else if (value == 13)
    	{
    		value = 25;
    	}
    	if(value!=lastValue){
    		lastValue = value;
    	}
    	return lastValue;
    }

    J'aimerai savoir comment faire pour communiquer avec la carte adaptateur mini PCI - port parallèle pour avoir le même résultat ?

    Merci.


    mercredi 9 mai 2012 08:04

Toutes les réponses

  • On va faire dans le simple.

    Inpout32.dll semble être une Dll qui "contourne" la frontière User/Kernel.

    Et quand on passe par des trucs pas documentés (les développeurs de Inpout32.dll, pas vous), de gros problèmes de compatibilité apparaissent.

    Je pense que votre "carte adaptateur mini PCI - port parallèle" émule pas matériellement un contrôleur de port parallèle sur BUS ISA. Or, je pense que cette dll fait l'assertion qu'il existe bien un contrôleur de port parallèle répondant sur les ports que vous utilisez. Les Drivers fournis avec cette carte devraient permettre de router les requêtes des programmes "User" (utilisant les API utilisateur du système donc pas les inp32 et autre oup32) vers le hardware de la carte.

    Votre code, avec des numéros de port en dur etc. est extrêmement fragile en terme de portabilité matériel (marche sur une machine mais pas sur une autre).

    Inpout32.dll n'est pas là pour rendre votre code fiable mais pour contourner un principe de WindowsNT/Win32 qui favorise cette fiabilité : le non accès aux ports physiques par les programmes dits "User".

    Pour l'accès au port parallèle depuis un programme Windows "User" pour de simple lecture/écriture, il suffit d'utiliser les API d'accès aux fichiers standard de Windows avec LPTx comme nom de fichier (http://en.allexperts.com/q/C-1040/Accessing-parallel-port-XP.htm).

    Il existe des API spécifiques pour la configuration de ces ports.

    Normalement, le fournisseur de la carte doit donner des drivers et une documentation adéquate pour régler les problèmes de compatibilité ou de réglages.

    Votre code a accumulé une dette technique, je pense qu'il est grand temps de le refondre pour qu'il soit plus aux normes.


    Paul Bacelar, Ex - MVP VC++

    mercredi 9 mai 2012 14:03
    Modérateur