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

API, COM et SDKs Delphi Discussion :

Question "vintage" : port parallèle


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Question "vintage" : port parallèle
    Bonjour.

    Dans le cadre de mes "bidouilles hardware", j'ai bricolé une interface qui se connecte sur le port parallèle et ne sert qu'à émettre des données en SORTIE (vers des optocoupleurs).

    Pour ne pas utiliser la dll "inpout32.dll", très connue (?), j'ai effectué sur la prise DB25 des connexions décrites sur : http://www.Lvr.com/jansfaq.htm (première section, quatrième question) et je contrôle mon interface via l'API Windows : (Delphi 6, unité SysUtils ; Windows 2000) :

    PortHandle:=CreateFile(PChar('LPT1'), GENERIC_WRITE, 0, NIL, OPEN_EXISTING, 0, 0); {pour initialiser}

    WriteFile(PortHandle, tampon, 1, BytesWritten, NIL); {pour écrire la donnée contenue dans le byte "tampon"}

    CloseHandle(PortHandle); {à la fin}

    Tout marche très bien, sauf que je n'arrive pas à détecter de manière fiable l'absence de l'interface, j'ai droit à une fenêtre d'alerte au bout d'un temps relativement long, que je n'arrive d'ailleurs pas à modifier, le programme se déroule par ailleurs comme si de rien n'était ; j'aimerais détecter le problème DANS le programme au début, émettre un beep, et quitter...

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Yop !
    Citation Envoyé par alberich Voir le message
    (...) j'ai bricolé une interface qui (...) ne sert qu'à émettre des données en SORTIE (vers des optocoupleurs).
    (...)
    Tout marche très bien, sauf que je n'arrive pas à détecter de manière fiable l'absence de l'interface (...)
    Tu vas avoir un souci : pour détecter un équipement externe, on lui envoie un signal sur la sortie et on récupère sur l'entrée (dans le registre d'état par exemple) le retour.

  3. #3
    Invité
    Invité(e)
    Par défaut Un handshake est déjà en place
    Bonjour.
    Curieusement le principe de l'interface parallèle (simulée) est de mettre certaines entrées à 0 et d'autres à 1 (floating, mais l'entrance est doublée) et surtout de relier la sortie "data strobe" à l'entrée "ack" pour le handshake, sinon cela ne pourrait pas fonctionner. C'est bien l'absence de signal "ack" après un accès en écriture (ou déjà l'ouverture ? ) au bout d'un temps .... loooong qui déclenche le time out et le message d'erreur. C'est à ce niveau qu'il faudrait pouvoir "attaquer".
    Merci d'avance pour tout tuyau.

  4. #4
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    salut,

    Quand tu dis "absence d'interface", c'est quand ton appareil n'est pas branché, c'est ça ?

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par alberich Voir le message
    Bonjour.
    Curieusement le principe de l'interface parallèle (simulée) est de mettre certaines entrées à 0 et d'autres à 1 (floating, mais l'entrance est doublée) et surtout de relier la sortie "data strobe" à l'entrée "ack" pour le handshake, sinon cela ne pourrait pas fonctionner. C'est bien l'absence de signal "ack" après un accès en écriture (ou déjà l'ouverture ? ) au bout d'un temps .... loooong qui déclenche le time out et le message d'erreur. C'est à ce niveau qu'il faudrait pouvoir "attaquer".
    Merci d'avance pour tout tuyau.
    Dans tous les cas il va te falloir lire, à un moment ou un autre ; tu disais n'utiliser ton système qu'en mode "écriture vers l'extérieur", il va te falloir revenir sur ce choix.

    À partir de là, tu pourras lire ton "ack" comme tu pourrais lire d'autres signaux / d'autres informations : de mémoire, il me semble que tu peux avoir une info "DeviceReady" ou similaire, et dans le cas des printers il me semble qu'il y avait une ligne "PaperEmpty", que tu pourrais aussi utiliser.

    Avec tout ça, tu dois pouvoir y arriver.

    [EDIT] Je viens de trouver ça, qui a l'air très sympatoche [/EDIT]

    Citation Envoyé par minnesota Voir le message
    Quand tu dis "absence d'interface", c'est quand ton appareil n'est pas branché, c'est ça ?
    À quoi tu pensais, minnesota ? Moi c'est comme ça que je l'ai compris, en tout cas.
    Ou tu as une autre piste ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    l'interface parallèle n'as jamais été conçu pour détecteter quelque chose...

    on s'en rend compte très bien quand... (Il faut mettre le CD avant de bracher)

    le "Plug and Play" (alors simulé)
    existe seulement si le (OS comprend l'interface) ou
    (des pilotes sont installés en avant plan)...

    Alors donc un driver, ou un programme (le votre)...
    en mode Polling.. (qui "écoute" quelque chose sur un port)...
    que ton bidule envoi ... vers un port...(parallèle ou série)
    et ton programme et/driver le détecte...et voilà!
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  7. #7
    Invité
    Invité(e)
    Par défaut A bas le HAL !
    Bonjour.

    C'est bien beau d'essayer de lire le statut de l'interface parallèle, mais pour cela :

    - Ou bien je suis obligé d'installer inpout32.dll (le "peek" et "poke" sous Windows pour les registres), ce que je voulais éviter.
    Au passage, il faut pour cela connaître l'adresse, qui n'est pas si standard que cela ! Sur certains Dell par exemple, il faut ajouter 1024 à 888 pour que cela marche. Et Inpout32 ne marche pas avec les chips Oxford (Lindy), par contre très bien avec le port de ma carte GigaByte ou une carte Sunix (que Lindy diffusait dans le temps). Donc portabilité nulle.

    - Ou bien je trouve un appel miracle à l'API qui me signale effectivement que PaperEmpty n'est pas à 0 mais j'ai essayé différentes combines ... qui ne marchent pas !
    Il existe bien dans les "headers" de l'API (je les ai pour VB) des CONSTANTES relatives à cette erreur, mais nulle part ne figure ni le nom de la VARIABLE, ni la manière de l'interroger ! Seules figurent dans l'aide de Delphi des références au multimedia ...

    Donc, si quelqu'un a une idée en ce sens, elle est la bienvenue.

  8. #8
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Citation Envoyé par Jipété Voir le message

    À quoi tu pensais, minnesota ? Moi c'est comme ça que je l'ai compris, en tout cas.
    Ou tu as une autre piste ?
    Coucou Jipété

    Ben il a pas jugé utile de répondre
    La question n'était peut-être pas pertinente

    Sinon pour que j'ai une piste, il faudrait que les conditions dans lesquelles il rencontre l'erreur, le type de cette dernière, le message exact, enfin que tout ça soit exposé clairement. C'était entre autres le but de ma question. J'ai pas l'intention de parler dans le vide et émettre 90 hypothèses...

    Après bien sûr, si tu as une question précise pour moi , n’hésite pas...

  9. #9
    Invité
    Invité(e)
    Par défaut Précisions concernant l'erreur
    Bonjour.

    "Il n'a pas jugé utile de répondre" : je croyais que c'était clair pour vous, l'erreur se produit quand la prise DB25 (sur laquelle sont réalisées directement les connexions indiquées) n'est pas branchée.

    Le message d'erreur se produit entre 1min 45 et 2 min après : Un pop-up "Dossier imprimantes" avec une croix de St André blanche dans un rond rouge:
    Une erreur est survenue lors de l'impression du document "No Document Name" vers LPT1:. Le périphérique n'est pas connecté.
    Désirez-vous recommencer ou annuler cette opération ?
    (Suivent les 2 boutons Réessayer et Annuler)

    Quant aux adresses des registres, il y a malheureusement belle lurette qu'il ont été publiés dans les livres et revues relatifs à l'interfaçage, avec la sympathique mention que depuis NT4.0 on ne peut plus y accéder "grâce au" HAL !

    Voilà le coeur du problème. Je me demande si au fond je ne serais pas en train de faire de "l'acharnement thérapeutique" sur le LPT. A côté de cela, je me dis qu'au moins il n'y aura jamais d'erreurs de transmission ou de blocage de l'interface ... A méditer !

    Sur un autre circuit d'interface que le IOWarrior (dont je tairai le nom) j'ai eu une fois plusieurs erreurs de transmission suivies d'une "violation d'accès". Plantage du driver ? Suite à cela le circuit est parti en "offrande à Ste Poubelle" (en tri sélectif ! )

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

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