gestion du port parallèle en C++ - Programmation
Marsh Posté le 08-07-2001 à 20:19:44
J'avais ce genre de pb à régler aussi.
Ya plusieurs solutions:
1)tu integre de l'assembleur ds ton code C++
2)tu utilises des programmes deja fait pour ca (payants et non payants)
3)tu utilises les API de ce cher windows
4)t'utilise une dll specialement crée pr ca
Pr ma part, je pouvais pas integrer de l'assembleur directement ds mon code paske je suis sous borland C++ 5.0 et ya pas l'utilitaire qui permette de mettre de l'assembleur (il s'appelle turbo assembleur de borland).
Alors je me suis rabattu sur les API, mais le resultats est pas trop top. Finalement, l'utilisation d'une dll d'acces aux ports est le meilleure slution (pr l'instant...)
Marsh Posté le 08-07-2001 à 23:34:02
Tu aurais par hasard une dll dont tu parles (pour inspiration ou utilisation).
Mon but est d'envoyer des données traitées à partir d'un fichier, sur le port parallèle. Donc il faudrait que je complète le programme que j'ai fait, qui s'occupe déjà des données.
Marsh Posté le 09-07-2001 à 01:23:23
Tu trouveras tout ce que tu cherches sur le site suivant :
http://www.programmationworld.com
section Langage -> électronique :)
Fais attention, les fonctions inp() et outp() ne fonctionnent pas sur les systèmes NT !
Marsh Posté le 09-07-2001 à 14:33:44
OK, je vais t'envoyer les liens, ms là je peux pas trop.
Alors à ce soir!!!
(sois patient )
Marsh Posté le 09-07-2001 à 15:38:53
pas besoin de dll en C++ !! tout est fourni dans les librairies standards. Sous VC++, c'est dans conio.h, sous djgpp c'est danc pc.h, sous linux c'est dans asm/io.h (généralement) etc...
Marsh Posté le 09-07-2001 à 16:39:31
Non pas tt est fourni!!
En tt cas avec le borland c++ 5.0 que j'utilise, t'as pas trop le choix, soit API soit dll, sinon fo avoir le turbo assembleur (tres difficile à trouver, meme chez l'editeur).
Sinon g pas testé VC++, ms ca m'etonnerai qu'on ait acces aussi facilement aux hardware ss win 32 bits!!
Sinon, voici le lien vers une page sur le port // (entre autres), vers la fin ya pleins de liens pr des utilitaires ou dll de gestion de port //:
http://www.lvr.com/parport.htm
voir aussi le lien (tiré de la meme page) pr l'utilisation des dll en VC++ et VB: http://www.boondog.com/tutorials/dlltutor/dlltutor.htm
voila, bonne lecture!!!
Marsh Posté le 09-07-2001 à 19:39:20
"1)tu integre de l'assembleur ds ton code C++ "
pas la peine : fo passer par l'ecriture sur les ports et ca ben ca marche pas en win32 (instruction protegee)
Marsh Posté le 10-07-2001 à 00:37:42
HelloWorld > meme pas essayé
par contre les dll marchent tres tres bien (j'utilise une dll qui est faite avec les fonctions inp et outp du VC++)
Marsh Posté le 10-07-2001 à 20:04:09
Mais bien sûr que si ça marche en Win32. Ça ne marche pas sous les systèmes NT, mais il est possible de contourner le problème en changeant les droits momentanément ou en passant par l'API.
Marsh Posté le 10-07-2001 à 21:19:47
quand je dis ke ca marche pas, c'est ke faire:
_asm
{
mov dx, 0x60
in ax, dx
}
ben ca marche pas
apres si tu augmente ton nivo de priorite via les API ca n'a rien a voir avec l'assembleur
"il est possible de contourner le problème en changeant les droits momentanément ou en passant par l'API."
c'est koi la difference ? on passe par les API dans le but de changer les droits....
ensuite tu changes pas les droits de ton executable ... sous windows les executables ne peuvent avoir une priorite RL0, seul du code offert en tant que service genre dll ou VxD peut avoir cette priorite ...
et tu dis ke ca marche en win32n, mais moi j'ai essayé, j'ai fais un petit executable 32 bits ki fait "entrez un numero de port", "voulez vous lire ou ecrire une valeur sur ce port ?" etc ...
ben sous DOS ca marche nickel (quand compilé en DOS biensur) et sous win ben ...
ah ca oui il ecrit la valeur sur le port mais si je la relit derriere ben c'est comme si j'avais rien fait => mes in et out sont ignorés.
je me suis documenté et résultat : ke ce soit NT ou 95/98, tu peux pas le faire directement
fo changer le nivo de priorite
pour ca soit tu fais une dll soit tu fais un VxD afin d'avoir un nivo de privilege maximal (=> l'instruction est protegee).
sinon en effet ces dll marchent nickel
"par contre les dll marchent tres tres bien (j'utilise une dll qui est faite avec les fonctions inp et outp du VC++)"
mais ca m'etonnerais qu'elle soit ecrite avec inp et outp de VC++ puisque a ma conaissance ces fonctions n'existent que sous DOS
Marsh Posté le 11-07-2001 à 00:16:04
HelloWorld : "mais ca m'etonnerais qu'elle soit ecrite avec inp et outp de VC++ puisque a ma conaissance ces fonctions n'existent que sous DOS "
J'ai fais que reprendre le commentaire du code cpp fourni avec la dll, ms on s'en fout de ca vu que ca marche!!!
Marsh Posté le 11-07-2001 à 10:37:59
Question bonus: si on travaille en mode ECP ou EPP du port //, est-ce que si j'envoie des données (sur la partie data du port) en utilisant la fonction de la dll qui fait exactement la meme chose que "outp", les signaux de handshake sont générés automatiquement??
Marsh Posté le 11-07-2001 à 14:46:38
pourras tu publier ici le code de cette dll (la partie outp uniquement, pas la partie qui change la priorite)
merci
Marsh Posté le 11-07-2001 à 20:21:06
Bon, voici le lien direct vers la dll tant convoitée:
http://www.boondog.com/tutorials/dlltutor/8255.zip
Voici le code de la fonction de sortie (ce code est ds le zip):
// ------------------------------------------------------
// FUNC: Out8255
// DESC: uses Microsoft's Visual C++ _outp() function
// to output a PortData to PortAddress
// ------------------------------------------------------
short _stdcall Out8255( int PortAddress, int PortData )
{
short Dummy;
// Need Dummy since _outp officially returns int
// short is a 16-bit integer in Win32 C++
// whereas int is 32-bit integer Win32 C++
// use (short) to force returning 16-bit integer
// back to VB
Dummy = (short)(_outp( PortAddress, PortData ));
return(Dummy);
}; // end of Out8255
Et ya meme pas de changement de priorité (en tt cas pas ds ces fichiers).
En parlant de chagement de priorité, tu voulais ptete dire les fonctions API qui permettent de l'utiliser???
Marsh Posté le 12-07-2001 à 09:07:09
c'est bon, tout marche comme il faut en utilisant la librairie <conio.h> (avec _outp)
merci Belegar pour le lien que tu as mis
Marsh Posté le 12-07-2001 à 20:15:13
j'ai regarde ce code et decouvert avec grande surprise que sous VC++ et sous windows95 ben outp ca existe (pas sous le Borland )
alors cette histoire de priorite ke je vous ai fait chier avec ben c'est ke pour NT alors ... il me semblait que le source de la mega dll ke j'avais pompé disais ke sous 95 c'etait necessaire aussi
en tout cas sous 95 j'ai pu verifier ke ca marche
moi avec mon prog j'avais du boire je sais pas mais ca vait fouaré ... a moins ke je me soit gouré de port va savoir.
je pense en fait que cette dll offrait une fonction qui marche et sous 95 et sous NT ...
on en apprend tous les jours
Marsh Posté le 12-07-2001 à 20:35:28
Ouais c cool pr ceux qui ont VC++
Par contre, la dll marche avec tt les win, donc plus besoin de se faire chier à tt reécrire soi-même!! (reste à savoir comment l'utiliser correctement)
Sinon, personne pr répondre à ma question posée plus haut sur le handshake???
Marsh Posté le 12-07-2001 à 22:55:47
je sais pas si ça répond à ta question mais dans mon prog, il faut que je valide chaque donnée en faisant un créneau d'horloge à l'adresse 0x37A càd :
_outp (0x378, data);
_outp (0x37A, 0);
_outp (0x37A, 1);
_outp (0x37A, 0);
Marsh Posté le 12-07-2001 à 23:03:12
Oui, en quelque sorte, enfin je sais pas
J'avais lu qu'en mode EPP ou ECP, des signaux de handsake étaient générés, et je sais pas s'il fo les créer soi-même ou s'ils sont crée automatiquement.
Tu me rassures qd meme 1 peu, vu qu'en utilisant des fonctions de bases d'acces aux ports, on ne dervait faire sortir que les données voules.
Marsh Posté le 08-07-2001 à 18:32:12
Est-ce que quelqu'un saurait gérer le port parallèle sous windows en C++ ?