IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Enoyer un mot sur le port parallèle


Sujet :

Visual C++

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut Enoyer un mot sur le port parallèle
    bonjour,


    je programme avec Visual Studio 2010 sous Windows 7 64 bits. J'essaye de réaliser un petit programme pour envoyer des données sur le port parallèle. J'ai lu qu'il fallait au préalable installer un driver pour pouvoir accéder au port parallèle. J'ai téléchargé et installé celui-ci :
    http://www.highrez.co.uk/Downloads/InpOut32/default.htm

    et voici mon programme Visual C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include "stdafx.h"
    #include <iostream>
    #include <string>
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HINSTANCE hLib;
    	hLib = LoadLibrary( (LPCWSTR)"inpout.DLL" );
    	if (hLib==NULL)
    	{
    		std::cout << "ko";
    		Sleep(1000);
    		return 1;
    	}
     
    	FreeLibrary(hLib);
     
    	return 0;
    }
    Malheureusement, que je compile en 32 bits ou 64 bits, le programme ne charge pas la DLL, hlib vaut toujours NULL

    Qu'est-ce que j'ai raté ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    Par défaut
    Il faut arrêter de programme comme il y a 20ans sous système 16bits coopératif.

    Ce temps est bien révolu.

    Votre truc (le lien marche pas chez moi), ce n'est pas un driver mais une simple dll (inpout.DLL) avec des fonctions exportées qui ressemblent aux mnémonique utilisée en codage 16bits de l'antiquité informatique.

    Ces fonctions ne font qu'utiliser les API Win32 des temps modernes de Windows pour accéder "correctement" aux ports parallèles.

    En clair, ce truc ne sert que pour les Hibernatus de l'informatique, ou pour les nostalgiques des cornichons de Spree (cf. le film Good bye Lenin!).

    Alors, adressez-vous à Dieu plutôt qu'à ses saints.

    Pour envoyer un mot sur le port parallèle, il suffit d'écrire sur le fichier "LPT1".

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    Votre truc (le lien marche pas chez moi), ce n'est pas un driver mais une simple dll (inpout.DLL) avec des fonctions exportées qui ressemblent aux mnémonique utilisée en codage 16bits de l'antiquité informatique.
    il y a une DLL et un fichier SYS

    Citation Envoyé par bacelar Voir le message
    IPour envoyer un mot sur le port parallèle, il suffit d'écrire sur le fichier "LPT1".

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    Ben non il ne suffit pas... j'ai déjà essayé, cela ne fonctionne pas.

    Par ailleurs, je ne cherche pas à écrire sur LPT1 mais sur LPT2 et LPT3 qui sont sur des ports PCI.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    Par défaut
    il y a une DLL et un fichier SYS
    Ok, il s'agit donc d'une Dll pour Hibernatus avec un driver qui utilise un mapping des I/O des périphériques en dur des années 80 des "PC 100% IBM compatible".

    Donc avec une probabilité de compatibilité très faible avec le moindre matériel qui ne date pas de cette époque DOStesque.

    L'infrastructure actuel d'un PC actuel est bien plus complexe qu'à cette époque. Là, vous court-circuité toutes les fonctions de virtualisation offertes par l'OS et les drivers du fabriquant du périphérique.

    Donc, utilisez "CreateFile", cela marche aussi bien avec LPT1 qu'avec LPT2 ou LPT2 ou encore LPT9.

    Ben non il ne suffit pas... j'ai déjà essayé, cela ne fonctionne pas
    C'est un peu court jeune homme.
    Code + GetLastError + Valeur de retour + valeurs des variables affichés via le débuggeur.

    En attendant que ma boule de cristal revienne de sa révision des 1000 questions trop vagues.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Elle me parait bizarre cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hLib = LoadLibrary( (LPCWSTR)"inpout.DLL" );
    Tu as une chaine de caractères non Unicode que tu castes en Unicode à la sauvage.

    Je suppose que tu as fait cela car tu compiles en Unicode et que la fonction LoadLibrary(), en mode Unicode, attent une chaine Unicode et que tu en avais marre de te faire insulter par le compilateur.

    Tu peux :
    soit forcer à utiliser la fonction non-unicode (LoadLibraryA())
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hLib = LoadLibraryA("inpout.DLL");
    soit passer ta chaine en Unicode (ce qui me parait plus sain)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hLib = LoadLibrary(_T("inpout.DLL"));

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    Par défaut
    Merci ram-0000.
    Mais je suis septique sur le fait que le driver de "LPT2 et LPT3 qui sont sur des ports PCI" ait respecté le mapping des IO du DOS.

    Croisons les doigts, Hibernatus de tous les pays.

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    Super ram-0000 l'erreur était bien au niveau de l'encodage


    Voilà le code avec CreateFile() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    BYTE data = 255;
    	DWORD dw;
    	HANDLE hPort;
    	LPCWSTR port = _T("LPT2"); 
     
    	hPort = CreateFile(port, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
     
    	if (hPort==INVALID_HANDLE_VALUE)
    	{
    		std::cout << port << " erreur" ;
    		Sleep(1000);
    	}
    	else
    	{
    		WriteFile(hPort, &data, sizeof(data), &dw, NULL);
    		std::cout << " " << dw << " " << data;
    		Sleep(1000);
    		CloseHandle(hPort);
    	}
    le programme reste bloqué sur la fonction WriteFile(). J'ai également essayé avec port=_T("\\\\.\\LPT2")

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Citation Envoyé par Auteur Voir le message
    le programme reste bloqué sur la fonction WriteFile(). J'ai également essayé avec port=_T("\\\\.\\LPT2")
    Bloqué comment, tu ne ressorts pas du WriteFile() ?
    Peut être qu'il faut un acquittement hard (donc de l'imprimante) pour débloquer le WriteFile() (et d'ailleurs, cela ne me surprendrait pas).

    Regarde ici, je suis sûr que c'est le ack qui manque sur la broche 10.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    Par défaut
    Si vous ne voulez pas attendre l'acquittement, il y a des options dans WriteFile pour le rendre asynchrone.

  10. #10
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    Citation Envoyé par ram-0000
    Bloqué comment, tu ne ressorts pas du WriteFile() ?
    Peut être qu'il faut un acquittement hard (donc de l'imprimante) pour débloquer le WriteFile() (et d'ailleurs, cela ne me surprendrait pas).
    exactement, je dois stopper manuellement le programme.

    Citation Envoyé par ram-0000
    Regarde ici, je suis sûr que c'est le ack qui manque sur la broche 10.
    il faudrait donc que je rajoute un dispositif électronique qui envoie une impulsion négative lorsqu'au moins une des sorties est à 1 ?


    Citation Envoyé par bacelar
    Si vous ne voulez pas attendre l'acquittement, il y a des options dans WriteFile pour le rendre asynchrone.
    c'est le flag FILE_FLAG_OVERLAPPED, de la fonction CreateFile() ?

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    Par défaut
    c'est le flag FILE_FLAG_OVERLAPPED, de la fonction CreateFile() ?
    Oui

  12. #12
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    bonjour,

    j'ai repris le projet il y a quelques jours et refait des essais. Et malheureusement, je n'arrive pas à accéder au port parallèle.

    J'ai pris également exemple sur ce message pour l'utilisation de la structure OVERLAPPED. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	BYTE data = 255;
    	DWORD dw;
    	HANDLE hPort;
    	LPCWSTR port = _T("LPT2");
     
    	OVERLAPPED* ov = new OVERLAPPED;
     
    	hPort = CreateFile(port, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,  FILE_FLAG_OVERLAPPED, NULL);
     
    	if (hPort==INVALID_HANDLE_VALUE)
    	{
    		std::cout << port << " erreur" ;
    		Sleep(1000);
    	}
    	else
    	{
    		ov->Offset = sizeof(BYTE);
    		ov->OffsetHigh = 0;
    		ov->hEvent = NULL;
     
    		std::cout << port;
     
    		WriteFile(hPort, &data, sizeof(data), &dw, ov);
     
    		std::cout << " dw=" << dw << " data=" << data;
    		Sleep(1000);
    		CloseHandle(hPort);
    	}
    Le code s'exécute mais dw qui m'indique le nombre d'octets écrits reste à 0.

    J'ai également essayé la fonction DeviceIoControl() en suivant les recommandation de la MSDN : http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx. Sans plus de succès.

    J'ai également mis à la masse les pins 10 et 11 du port parallèle (avec une résistance de 500 ohms), mais pareil rien

    Qu'est-ce que j'ai raté ?

  13. #13
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    Ca marche

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    BYTE data = 2; // valeur entre 0 et 255
    	DWORD dw;
    	HANDLE hPort;
    	LPCWSTR port = _T("LPT3");
     
    	hPort = CreateFile(port, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,  NULL, NULL);
     
    	if (hPort==INVALID_HANDLE_VALUE)
    	{
    		std::cout << port << " erreur" ;
    		Sleep(1000);
    	}
    	else
    	{
     
    		std::cout << port;
     
    		WriteFile(hPort, &data, sizeof(data), &dw, NULL);
     
    		std::cout << " dw=" << dw << " data=" << data;
    		Sleep(1000);
    		CloseHandle(hPort);
    	}
    tel quel il ne peut fonctionner que sous une certaine condition :
    Il faut relier les pins 10 (ACK), 11 (BUSY), 12 (PAPER END) à la masse par une résistance de 500 ohms.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 16/11/2007, 13h29
  2. E/S sur le port parallèle sous Windows XP
    Par IOCTL dans le forum Windows
    Réponses: 2
    Dernier message: 02/11/2007, 10h27
  3. Ecriture / Lecture sur le port parallèle
    Par steeray dans le forum Windows
    Réponses: 11
    Dernier message: 05/08/2006, 19h56
  4. Communication sur le port parallèle
    Par zekicker dans le forum MFC
    Réponses: 1
    Dernier message: 11/12/2005, 14h39
  5. Comment écrire sur le port parallèle ?
    Par trax44 dans le forum Assembleur
    Réponses: 11
    Dernier message: 21/08/2005, 23h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo