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.
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.
Compléments à ma réponse précédente
1) La constante s'appelle CE_OOP en terminologie Microsoft : pas très original !
2) J'ai essayé GetLastError() avec l'interface débranchée : aussi bien immédiatement après le CreateFile qu'après le WriteFile, il me renvoie ... 0 !
Donc je crains qu'il n'y ait que 2 solutions :
1) Je vis avec le message d'erreur : il est vrai que l'interception de ce type d'erreur n'a qu'un intérêt "intellectuel". Par contre un autre problème se pose : il faut toujours d'abord lancer le programme avant d'allumer l'interface, le contenu du registre du LPT semble assez aléatoire au démarrage !
2) J'oublie le port parallèle et je passe au IOWarrior (interface USB -> parallèle) ; j'ai fait des essais, il fonctionne bien, mais c'est contraire à mon principe KISS : Keep It Simple & Stupid. Par contre les sorties sont toutes résettées (hautes) au démarrage ...
:P
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 ! :P )